This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[commit] Move zero PC check to frame.c; Was: [RFC] Infinite backtraces...


Randolph Chung wrote:
I had the same analysis that it should never happen. If Andrew agrees,
I would recommend simply putting an assertion instead. Putting a dummy
value is not that satisfactory, as you don't know what this is going
to be used for.


i've committed the following

2004-12-05 Randolph Chung <tausq@debian.org>

* hppa-tdep.c (hppa_stub_Frame_unwind_cache): Stop unwinding if unwinding from a frame with pc == 0.
(hppa_stub_frame_this_id): Likewise.
(hppa_stub_frame_prev_register): Only provide real values if the frame
cache is not NULL.

FYI,


Index: hppa-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/hppa-tdep.c,v
retrieving revision 1.185
diff -u -p -r1.185 hppa-tdep.c
--- hppa-tdep.c 6 Dec 2004 03:32:26 -0000 1.185
+++ hppa-tdep.c 8 Dec 2004 01:41:08 -0000
@@ -2111,17 +2124,21 @@ hppa_stub_frame_unwind_cache (struct fra
struct gdbarch *gdbarch = get_frame_arch (next_frame);
struct hppa_stub_unwind_cache *info;
struct unwind_table_entry *u;
if (*this_cache)
return *this_cache;
+ if (frame_pc_unwind (next_frame) == 0)
+ return NULL;
+

I've checked in the attached. This test is generic so might as well live in frame.c (you'll note that I've made the conditions on which it triggers more robust).


committed,
Andrew

2004-12-12  Andrew Cagney  <cagney@gnu.org>

	* frame.c (get_prev_frame): When unwinding normal frames, check
	that the PC isn't zero.
	* hppa-tdep.c (hppa_stub_frame_unwind_cache): Delete check for a
	zero PC.

Index: frame.c
===================================================================
RCS file: /cvs/src/src/gdb/frame.c,v
retrieving revision 1.196
diff -p -u -r1.196 frame.c
--- frame.c	8 Dec 2004 01:56:16 -0000	1.196
+++ frame.c	12 Dec 2004 16:23:55 -0000
@@ -1257,6 +1257,18 @@ get_prev_frame (struct frame_info *this_
       return NULL;
     }
 
+  /* Assume that the only way to get a zero PC is through something
+     like a SIGSEGV or a dummy frame, and hence that NORMAL frames
+     will never unwind a zero PC.  */
+  if (this_frame->level > 0
+      && get_frame_type (this_frame) == NORMAL_FRAME
+      && get_frame_type (get_next_frame (this_frame)) == NORMAL_FRAME
+      && get_frame_pc (this_frame) == 0)
+    {
+      frame_debug_got_null_frame (gdb_stdlog, this_frame, "zero PC");
+      return NULL;
+    }
+
   return get_prev_frame_1 (this_frame);
 }
 
Index: hppa-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/hppa-tdep.c,v
retrieving revision 1.189
diff -p -u -r1.189 hppa-tdep.c
--- hppa-tdep.c	8 Dec 2004 06:12:40 -0000	1.189
+++ hppa-tdep.c	12 Dec 2004 16:23:57 -0000
@@ -2105,9 +2105,6 @@ hppa_stub_frame_unwind_cache (struct fra
   if (*this_cache)
     return *this_cache;
 
-  if (frame_pc_unwind (next_frame) == 0)
-    return NULL;
-
   info = FRAME_OBSTACK_ZALLOC (struct hppa_stub_unwind_cache);
   *this_cache = info;
   info->saved_regs = trad_frame_alloc_saved_regs (next_frame);

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]