From a7300869806e7586189dc0f46c41c5773fe3ae16 Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Thu, 28 Nov 2013 18:09:41 +0000 Subject: [PATCH] get_prev_frame, stop_reason != UNWIND_NO_REASON, add frame debug output. 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 * frame.c (get_prev_frame_1) : 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 b171f0085e5..b15bee96767 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2013-11-28 Pedro Alves + + * frame.c (get_prev_frame_1) : + Add "set debug frame" output. + (frame_stop_reason_symbol_string): New function. + 2013-11-28 Pedro Alves * frame-unwind.c (default_frame_unwind_stop_reason): Return diff --git a/gdb/frame.c b/gdb/frame.c index df1d2189d98..db94d98b8d3 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. */