aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog6
-rw-r--r--gdb/frame.c33
2 files changed, 38 insertions, 1 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index b171f00..b15bee9 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,11 @@
2013-11-28 Pedro Alves <palves@redhat.com>
+ * frame.c (get_prev_frame_1) <stop_reason != UNWIND_NO_REASON>:
+ Add "set debug frame" output.
+ (frame_stop_reason_symbol_string): New function.
+
+2013-11-28 Pedro Alves <palves@redhat.com>
+
* frame-unwind.c (default_frame_unwind_stop_reason): Return
UNWIND_OUTERMOST if the frame's ID is outer_frame_id.
* frame.c (get_prev_frame_1): Remove outer_frame_id check.
diff --git a/gdb/frame.c b/gdb/frame.c
index df1d218..db94d98 100644
--- a/gdb/frame.c
+++ b/gdb/frame.c
@@ -48,6 +48,7 @@
static struct frame_info *get_prev_frame_1 (struct frame_info *this_frame);
static struct frame_info *get_prev_frame_raw (struct frame_info *this_frame);
+static const char *frame_stop_reason_symbol_string (enum unwind_stop_reason reason);
/* We keep a cache of stack frames, each of which is a "struct
frame_info". The innermost one gets allocated (in
@@ -1771,7 +1772,18 @@ get_prev_frame_1 (struct frame_info *this_frame)
&this_frame->prologue_cache);
if (this_frame->stop_reason != UNWIND_NO_REASON)
- return NULL;
+ {
+ if (frame_debug)
+ {
+ enum unwind_stop_reason reason = this_frame->stop_reason;
+
+ fprintf_unfiltered (gdb_stdlog, "-> ");
+ fprint_frame (gdb_stdlog, NULL);
+ fprintf_unfiltered (gdb_stdlog, " // %s }\n",
+ frame_stop_reason_symbol_string (reason));
+ }
+ return NULL;
+ }
/* Check that this frame's ID isn't inner to (younger, below, next)
the next frame. This happens when a frame unwind goes backwards.
@@ -2479,6 +2491,25 @@ frame_stop_reason_string (enum unwind_stop_reason reason)
}
}
+/* Return the enum symbol name of REASON as a string, to use in debug
+ output. */
+
+static const char *
+frame_stop_reason_symbol_string (enum unwind_stop_reason reason)
+{
+ switch (reason)
+ {
+#define SET(name, description) \
+ case name: return #name;
+#include "unwind_stop_reasons.def"
+#undef SET
+
+ default:
+ internal_error (__FILE__, __LINE__,
+ "Invalid frame stop reason");
+ }
+}
+
/* Clean up after a failed (wrong unwinder) attempt to unwind past
FRAME. */