From: "Ching Lai" <ching@coware.com>
To: "Daniel Jacobowitz" <drow@mvista.com>
Cc: "Nafees" <nafees@coware.com>, <gdb@sources.redhat.com>,
"Cesar Quiroz" <Cesar.Quiroz@coware.com>,
"Sunil Alankar" <salankar@coware.com>
Subject: Re: GDB 5.2/5.3 breakpoint bug
Date: Wed, 08 Jan 2003 22:46:00 -0000 [thread overview]
Message-ID: <00c201c2b767$a1b01060$d401a8c0@notebook> (raw)
In-Reply-To: <20030108204628.GA6776@nevyn.them.org>
Hi Daniel,
> > Comment out the line 2753 in gdb 5.21 and 2777 in gdb 5.3 and build
them
> on
> > solaris seems to work OK with two test cases.
> >
> > Now the question is to figure out why this line is added in gdb 5.21
and
> > gdb 5.3?
>
> The line is supposed to be there; it's so we know what is and isn't
> inside a function. You need to explain better why it's causing a
> problem in find_pc_sect_line.
The problem is the linetable in different symbol tables have the
same pc address in my testcase. One has valid number and the other one
with line number as 0 (which is added by the extra record_line()).
In gdb 5.2.1 release of find_pc_set_line in symtab.c file.
1788 /* Is this file's best line closer than the best in the other
files?
1789 If so, record this file, and its best line, as best so far.
*/
1790
1791 if (prev && (!best || prev->pc > best->pc))
1792 {
1793 best = prev;
1794 best_symtab = s;
1795
1796 /* Discard BEST_END if it's before the PC of the current
BEST. */
1797 if (best_end <= best->pc)
1798 best_end = 0;
1799 }
Since the line 1791 prev->pc with valid line number is not greater than
best->pc
which has 0 as line number, so it did not pick up the correct symbol file.
If the record_line is need in gdb 5.2.1 and gdb 5.3, then the line 1791
might
need an extra condition to void picking up the wrong symbol table which has
line
number as 0 as added by record_line().
1791 if (prev && (!best || prev->pc > best->pc) && (prev->line != 0))
Here are the debugging section of my observation.
db) x/320d &s->linetable.nitems
0x6debf0: 77 1667196020 3069 1667200366
0x6dec00: 0 1229376 3069 1701207922
....
0x6df080: 0 1231068 1224 0
0x6df090: 0 1231080 1226 0
0x6df0a0: 0 1231080 1228 0
0x6df0b0: 0 1231152 0 0
0x6df0c0: 0 1231160 0 0 <================= pc
1231160 with line number 0 for sc_unsigned.h symbol
0x6df0d0: 0 0 795176551 762405167
0x6df0e0: 1667787118 1731159908 1647129902 841888046
gdb) p pc
$37 = 1231164 <========= pc that we are looking for line number of a
symbol
gdb) p s->filename
$38 = 0x6f54c0
"/eng-qa/ching/sv4.1/source/../release/solaris/tools/include/systemc/datatyp
es/int/sc_unsigned.h"
(gdb) p *s
$39 = {next = 0x6f53b0, blockvector = 0x6f4578, linetable = 0x6debf0,
block_line_section = 10, primary = 0, filename = 0x6f54c0 "/
eng-qa/ching/sv4.1/source/../release/solaris/tools/include/systemc/datatypes
/int/sc_unsigned.h", dirname = 0x6df0d8 "/eng-qa/ching
/gdb-5.2.1.inst/bin/", free_code = free_linetable, free_ptr = 0x0, nlines =
0, line_charpos = 0x0, language = language_cplus, debu
gformat = 0x6f5520 "unknown", version = 0x0, fullname = 0x0, objfile =
0x28ca98}
gdb) x/80d &s->linetable.nitems
0x6f4660: 14 0 8 0
0x6f4670: 0 114628 8 0
....
0x6f46f0: 0 114740 5 0
0x6f4700: 0 1231160 5 0 <=============== another pc
with the correct line number 5 for t.cpp symbol
0x6f4710: 0 1231168 6 0
0x6f4720: 0 1231184 7 0
0x6f4730: 0 1231192 0 0
0x6f4740: 0 1231200 0 0
0x6f4750: 0 0 795176551 762405167
0x6f4760: 1667787118 1731159908 1647129902 841888046
(gdb) p pc
$41 = 1231164
(gdb) p s->filename
$42 = 0x6f4630 "/eng-qa/ching/gdb-5.2.1.inst/bin/t.cpp"
Does this make sense?
Thanks.
Ching
----- Original Message -----
From: "Daniel Jacobowitz" <drow@mvista.com>
To: "Sunil Alankar" <sunil.alankar@CoWare.com>
Cc: <gdb@sources.redhat.com>
Sent: Wednesday, January 08, 2003 12:46 PM
Subject: Re: GDB 5.2/5.3 breakpoint bug
> On Wed, Jan 08, 2003 at 12:37:29PM -0800, Sunil Alankar wrote:
> > Meanwhile, a colleague of mine had a different workaround:
> >
> > There is one extra record_line call in gdb 5.21 and gdb 5.3 which
inserts
> > extra line number
> > and pc into the linetable of symtab entry.
> >
> > gdb/dbxread.c in gdb.5.1.01
> > 1919 if (*name == '\000')
> > 1920 {
> > 1921 /* This N_FUN marks the end of a function. This
closes
> > off the
> > 1922 current block. */
> > 1923 within_function = 0;
> > 1924 new = pop_context ();
> >
> > gdb/dbxread.c in gdb 5.2.1
> > 2749 if (*name == '\000')
> > 2750 {
> > 2751 /* This N_FUN marks the end of a function. This
closes
> > off the
> > 2752 current block. */
> > 2753 record_line (current_subfile, 0, function_start_offset
+
> > valu);
> > 2754 within_function = 0;
> > 2755 new = pop_context ();
> > 2756
> >
> > gdb/dbxread.c in gdb 5.3
> >
> > 2773 if (*name == '\000')
> > 2774 {
> > 2775 /* This N_FUN marks the end of a function. This
closes
> > off the
> > 2776 current block. */
> > 2777 record_line (current_subfile, 0, function_start_offset
+
> > valu);
> > 2778 within_function = 0;
> > 2779 new = pop_context ();
> > 2780
> >
> >
> > Comment out the line 2753 in gdb 5.21 and 2777 in gdb 5.3 and build
them
> on
> > solaris seems to work OK with two test cases.
> >
> > Now the question is to figure out why this line is added in gdb 5.21
and
> > gdb 5.3?
>
> The line is supposed to be there; it's so we know what is and isn't
> inside a function. You need to explain better why it's causing a
> problem in find_pc_sect_line.
>
> --
> Daniel Jacobowitz
> MontaVista Software Debian GNU/Linux Developer
>
next prev parent reply other threads:[~2003-01-08 22:46 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <IMEGIEBLGLIOEGOLAFIEGELNCEAA.sunil.alankar@coware.com>
2003-01-05 23:10 ` Sunil Alankar
2003-01-05 23:14 ` Sunil Alankar
2003-01-07 23:55 ` Sunil Alankar
2003-01-08 0:52 ` Daniel Jacobowitz
2003-01-08 17:39 ` Daniel Jacobowitz
2003-01-08 18:16 ` Daniel Jacobowitz
2003-01-08 19:22 ` Sunil Alankar
2003-01-08 19:32 ` Daniel Jacobowitz
2003-01-08 19:43 ` Sunil Alankar
2003-01-08 20:42 ` Sunil Alankar
2003-01-08 20:46 ` Daniel Jacobowitz
2003-01-08 22:46 ` Ching Lai [this message]
2003-01-09 3:40 ` Daniel Jacobowitz
2003-01-09 5:18 ` Ching Lai
2003-01-08 17:30 ` Daniel Jacobowitz
2003-01-08 18:14 ` Sunil Alankar
2003-01-08 18:24 ` Daniel Jacobowitz
2003-01-29 3:56 ` Daniel Jacobowitz
2003-01-02 20:59 how to access show/set data Kris Warkentin
2003-01-04 2:19 ` GDB 5.2/5.3 breakpoint bug Sunil Alankar
2003-01-04 2:23 ` Daniel Jacobowitz
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='00c201c2b767$a1b01060$d401a8c0@notebook' \
--to=ching@coware.com \
--cc=Cesar.Quiroz@coware.com \
--cc=drow@mvista.com \
--cc=gdb@sources.redhat.com \
--cc=nafees@coware.com \
--cc=salankar@coware.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox