From: Andrew Cagney <cagney@gnu.org>
To: Elena Zannoni <ezannoni@redhat.com>, Adam Fedor <fedor@doc.com>
Cc: "gdb-patches@sources.redhat.com" <gdb-patches@sources.redhat.com>
Subject: Re: [rfa/symtab] Move find_pc_section call to lookup_minimal_symbol_by_pc
Date: Fri, 06 Feb 2004 18:59:00 -0000 [thread overview]
Message-ID: <4023E404.2090407@gnu.org> (raw)
In-Reply-To: <40217AE6.9060500@gnu.org>
[-- Attachment #1: Type: text/plain, Size: 1068 bytes --]
> Um, I'm not sure what is happening. My GNU/Linux amd64 box appears to pass both times:
I've found the right machine (YelloDog 3.0), the attached appears to
work on both yellow dog and IRIX (and Fedora Core).
The new patch modifies find_pc_partial_function supply the PC's section
when available.
Look ok?
The problem was that the symbol lookup was finding a symbol from a
previous section, instead of no symbol in the current section. That
leads to this test (using Joe's rewrite):
> + if (ecs->stop_func_name == NULL
> + && step_over_calls == STEP_OVER_UNDEBUGGABLE)
> + {
> + /* We couldn't determine where we stopped, so we just stepped
> + inside undebuggable code. Since we want to step over this
> + kind of code, we keep going until the inferior returns from
> + the current function. */
> + handle_step_into_function (ecs);
> + return;
> + }
not triggering. ->stop_func_name had a non-NULL but bogus symbol name.
ok?
Andrew
PS: I think GDB has a few too many symbol lookup interfaces :-(
[-- Attachment #2: diffs --]
[-- Type: text/plain, Size: 4645 bytes --]
2004-02-06 Andrew Cagney <cagney@redhat.com>
* blockframe.c (find_pc_partial_function): If find_pc_overlay
fails, try find_pc_section. Fix PR c++/1267.
* minsyms.c (lookup_minimal_symbol_by_pc): Use find_pc_section
instead of find_pc_mapped_section.
(lookup_minimal_symbol_by_pc_section): If the SECTION is NULL, do
not default to the section containing PC. Fix PR symtab/1519.
Index: blockframe.c
===================================================================
RCS file: /cvs/src/src/gdb/blockframe.c,v
retrieving revision 1.87
diff -u -r1.87 blockframe.c
--- blockframe.c 4 Feb 2004 16:34:51 -0000 1.87
+++ blockframe.c 6 Feb 2004 18:42:16 -0000
@@ -507,10 +507,24 @@
find_pc_partial_function (CORE_ADDR pc, char **name, CORE_ADDR *address,
CORE_ADDR *endaddr)
{
- asection *section;
+ struct bfd_section *bfd_section;
- section = find_pc_overlay (pc);
- return find_pc_sect_partial_function (pc, section, name, address, endaddr);
+ /* To ensure that the symbol returned belongs to the correct setion
+ (and that the last [random] symbol from the previous section
+ isn't returned) try to find the section containing PC. First try
+ the overlay code (which by default returns NULL); and second try
+ the normal section code (which almost always succeeds). */
+ bfd_section = find_pc_overlay (pc);
+ if (bfd_section == NULL)
+ {
+ struct obj_section *obj_section = find_pc_section (pc);
+ if (obj_section == NULL)
+ bfd_section = NULL;
+ else
+ bfd_section = obj_section->the_bfd_section;
+ }
+ return find_pc_sect_partial_function (pc, bfd_section, name, address,
+ endaddr);
}
/* Return the innermost stack frame executing inside of BLOCK,
Index: minsyms.c
===================================================================
RCS file: /cvs/src/src/gdb/minsyms.c,v
retrieving revision 1.39
diff -u -r1.39 minsyms.c
--- minsyms.c 11 Nov 2003 20:04:52 -0000 1.39
+++ minsyms.c 6 Feb 2004 18:42:16 -0000
@@ -355,7 +355,7 @@
/* Search through the minimal symbol table for each objfile and find
the symbol whose address is the largest address that is still less
- than or equal to PC, and matches SECTION (if non-null). Returns a
+ than or equal to PC, and matches SECTION (if non-NULL). Returns a
pointer to the minimal symbol if such a symbol is found, or NULL if
PC is not in a suitable range. Note that we need to look through
ALL the minimal symbol tables before deciding on the symbol that
@@ -374,20 +374,23 @@
struct minimal_symbol *best_symbol = NULL;
struct obj_section *pc_section;
- /* pc has to be in a known section. This ensures that anything beyond
- the end of the last segment doesn't appear to be part of the last
- function in the last segment. */
+ /* PC has to be in a known section. This ensures that anything
+ beyond the end of the last segment doesn't appear to be part of
+ the last function in the last segment. */
pc_section = find_pc_section (pc);
if (pc_section == NULL)
return NULL;
- /* If no section was specified, then just make sure that the PC is in
- the same section as the minimal symbol we find. */
- if (section == NULL)
- section = pc_section->the_bfd_section;
-
- /* FIXME drow/2003-07-19: Should we also check that PC is in SECTION
- if we were passed a non-NULL SECTION argument? */
+ /* NOTE: cagney/2004-01-27: Removed code (added 2003-07-19) that was
+ trying to force the PC into a valid section as returned by
+ find_pc_section. It broke IRIX 6.5 mdebug which relies on this
+ code returning an absolute symbol - the problem was that
+ find_pc_section wasn't returning an absolute section and hence
+ the code below would skip over absolute symbols. Since the
+ original problem was with finding a frame's function, and that
+ uses [indirectly] lookup_minimal_symbol_by_pc, the original
+ problem has been fixed by having that function use
+ find_pc_section. */
for (objfile = object_files;
objfile != NULL;
@@ -497,7 +500,13 @@
struct minimal_symbol *
lookup_minimal_symbol_by_pc (CORE_ADDR pc)
{
- return lookup_minimal_symbol_by_pc_section (pc, find_pc_mapped_section (pc));
+ /* NOTE: cagney/2004-01-27: This was using find_pc_mapped_section to
+ force the section but that (well unless you're doing overlay
+ debugging) always returns NULL making the call somewhat useless. */
+ struct obj_section *section = find_pc_section (pc);
+ if (section == NULL)
+ return NULL;
+ return lookup_minimal_symbol_by_pc_section (pc, section->the_bfd_section);
}
\f
next prev parent reply other threads:[~2004-02-06 18:59 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-01-27 22:23 Andrew Cagney
2004-01-27 22:52 ` Daniel Jacobowitz
2004-01-29 20:15 ` Elena Zannoni
2004-01-29 23:22 ` Andrew Cagney
2004-01-30 3:30 ` Adam Fedor
2004-01-30 4:53 ` Adam Fedor
2004-02-04 22:25 ` Elena Zannoni
2004-02-09 4:26 ` Adam Fedor
2004-02-09 15:31 ` Elena Zannoni
2004-01-30 3:29 ` Adam Fedor
2004-02-04 22:20 ` Elena Zannoni
2004-02-04 23:06 ` Andrew Cagney
2004-02-06 18:59 ` Andrew Cagney [this message]
2004-02-08 5:17 ` Adam Fedor
2004-02-09 15:35 ` Elena Zannoni
2004-02-09 16:40 ` Andrew Cagney
2004-02-09 17:54 ` Joel Brobecker
2004-02-09 21:58 Michael Elizabeth Chastain
2004-02-10 16:38 ` Adam Fedor
2004-02-16 18:11 ` Elena Zannoni
2004-02-17 4:47 ` Adam Fedor
2004-02-17 5:00 ` Daniel Jacobowitz
2004-02-17 14:23 ` Elena Zannoni
2004-02-18 3:40 ` Adam Fedor
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=4023E404.2090407@gnu.org \
--to=cagney@gnu.org \
--cc=ezannoni@redhat.com \
--cc=fedor@doc.com \
--cc=gdb-patches@sources.redhat.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