This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[COMMIT PATCH] get_prev_frame, stop_reason != UNWIND_NO_REASON, add frame debug output.
- From: Pedro Alves <palves at redhat dot com>
- To: gdb-patches at sourceware dot org
- Date: Thu, 28 Nov 2013 18:26:43 +0000
- Subject: [COMMIT PATCH] get_prev_frame, stop_reason != UNWIND_NO_REASON, add frame debug output.
- Authentication-results: sourceware.org; auth=none
The stop_reason != UNWIND_NO_REASON doesn't currently have "set debug
frame" output. This patch makes it print the stop_reason enum value
as a string.
gdb/
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.
---
gdb/ChangeLog | 6 ++++++
gdb/frame.c | 33 ++++++++++++++++++++++++++++++++-
2 files changed, 38 insertions(+), 1 deletion(-)
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. */
--
1.7.11.7