Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Mark Kettenis <kettenis@chello.nl>
To: cagney@gnu.org
Cc: gdb-patches@sources.redhat.com
Subject: Re: [PATCH] Remove zero PC check from blockframe.c:inside_main_func()
Date: Sat, 13 Dec 2003 22:07:00 -0000	[thread overview]
Message-ID: <200312132206.hBDM6p33006707@elgar.kettenis.dyndns.org> (raw)
In-Reply-To: <3FDB6232.5040102@gnu.org> (message from Andrew Cagney on Sat, 13 Dec 2003 14:02:10 -0500)

   Date: Sat, 13 Dec 2003 14:02:10 -0500
   From: Andrew Cagney <cagney@gnu.org>

   > It really makes no sense to check for a zero PC here.  This function
   > is only colled from frame.c:get_prev_frame(), and there we already
   > deal with PC being zero.
   > 
   > The whole concept of using a zero PC as a marker for the end of the
   > frame chain is somewhat flawed.  It prevents us from providing a
   > meaningful backtrace when the program has called a null function
   > pointer; see backtrace/1476.  At the very least we will have to treat
   > a zero PC in the innermost differently.  Classifying the a zero PC as
   > being inside the "main" function doesn't help.  Therefore this patch
   > removes the first obstackle in fixing that PR.
   > 
   > Objections.  Otherwise I'll commit this within a few days.

   FYI, this was made active with:

	    * blockframe.c: Include "gdbcmd.h" and "command.h".
	    (backtrace_below_main): New variable.
	    (file_frame_chain_valid, func_frame_chain_valid)
	    (nonnull_frame_chain_valid, generic_file_frame_chain_valid)
	    (generic_func_frame_chain_valid): Remove functions.
	    (frame_chain_valid, do_flush_frames_sfunc): New functions.
	    (_initialize_blockframe): New function.
	    * Makefile.in (blockframe.o): Update dependencies.
	    * frame.c (frame_saved_regs_id_unwind, get_prev_frame): Remove 
   FIXME
	    comment.  Call frame_chain_valid ().
	    * frame.h: Remove old prototypes.  Add prototype for
	    frame_chain_valid and update comments to match.
	    * gdbarch.sh: Change FRAME_CHAIN_VALID into a predicated function.
	    Remove old comment.
	    * gdbarch.h: Regenerated.
	    * gdbarch.c: Regenerated.

   rather than the new frame code.

Well yes, but ...

   I looked at the new frame code and apart from the wild-card logic, there 
   weren't any obvious PC==0 tests.

... there is a slightly non-obvious PC == 0 test in get_prev_frame():

   ... 
   if (frame_pc_unwind (this_frame) == 0)
     {
       ...
       return NULL;
     }
   ...

We should probably trust the sentinel frame here, and allow it to
unwind.  That is consistent with what we do earlier on.  What about
the attached patch?  Together with the blockframe patch (you're not
actually objecting to that one are you?), this fixes backtrace/1476.

Mark


Index: frame.c
===================================================================
RCS file: /cvs/src/src/gdb/frame.c,v
retrieving revision 1.153
diff -u -p -r1.153 frame.c
--- frame.c 10 Dec 2003 17:40:42 -0000 1.153
+++ frame.c 13 Dec 2003 21:47:43 -0000
@@ -1732,6 +1732,7 @@ struct frame_info *
 get_prev_frame (struct frame_info *this_frame)
 {
   struct frame_info *prev_frame;
+  CORE_ADDR pc;
 
   if (frame_debug)
     {
@@ -1961,7 +1962,8 @@ get_prev_frame (struct frame_info *this_
      because (well ignoring the PPC) a dummy frame can be located
      using THIS_FRAME's frame ID.  */
 
-  if (frame_pc_unwind (this_frame) == 0)
+  pc = frame_pc_unwind (this_frame);
+  if (this_frame->level >= 0 && pc == 0)
     {
       /* The allocated PREV_FRAME will be reclaimed when the frame
 	 obstack is next purged.  */


  reply	other threads:[~2003-12-13 22:07 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-12-13 15:09 Mark Kettenis
2003-12-13 19:02 ` Andrew Cagney
2003-12-13 22:07   ` Mark Kettenis [this message]
2003-12-14  0:23     ` Andrew Cagney
2003-12-14 18:22       ` Mark Kettenis
2003-12-31 19:58         ` Andrew Cagney
2003-12-21 21:20 ` Mark Kettenis

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=200312132206.hBDM6p33006707@elgar.kettenis.dyndns.org \
    --to=kettenis@chello.nl \
    --cc=cagney@gnu.org \
    --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