From 2ce6d6bf7c5f2c7ef3e816b1c64b4e14e52ca6bd Mon Sep 17 00:00:00 2001 From: Stan Shebs Date: Fri, 16 Apr 2010 01:12:07 +0000 Subject: [PATCH] 2010-04-15 Stan Shebs * frame.c: Include tracepoint.h. (get_current_frame): Allow a trace frame to be an alternate source of stack frame data. * tracepoint.c (tfind_1): Don't try to get current stack frame if it won't succeed. --- gdb/ChangeLog | 8 ++++++++ gdb/frame.c | 17 +++++++++++------ gdb/tracepoint.c | 16 ++++++++++++---- 3 files changed, 31 insertions(+), 10 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 1bcef84899e..0a8f5b1c78d 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2010-04-15 Stan Shebs + + * frame.c: Include tracepoint.h. + (get_current_frame): Allow a trace frame to be an alternate source + of stack frame data. + * tracepoint.c (tfind_1): Don't try to get current stack frame if + it won't succeed. + 2010-04-15 Pedro Alves * ppc-linux-tdep.c (bsd_uthread_solib_loaded): Always pass 0 for diff --git a/gdb/frame.c b/gdb/frame.c index aaa70daf592..0b0c5b44484 100644 --- a/gdb/frame.c +++ b/gdb/frame.c @@ -43,6 +43,7 @@ #include "gdbthread.h" #include "block.h" #include "inline-frame.h" +#include "tracepoint.h" 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); @@ -1144,12 +1145,16 @@ get_current_frame (void) error (_("No stack.")); if (!target_has_memory) error (_("No memory.")); - if (ptid_equal (inferior_ptid, null_ptid)) - error (_("No selected thread.")); - if (is_exited (inferior_ptid)) - error (_("Invalid selected thread.")); - if (is_executing (inferior_ptid)) - error (_("Target is executing.")); + /* Traceframes are effectively a substitute for the live inferior. */ + if (get_traceframe_number () < 0) + { + if (ptid_equal (inferior_ptid, null_ptid)) + error (_("No selected thread.")); + if (is_exited (inferior_ptid)) + error (_("Invalid selected thread.")); + if (is_executing (inferior_ptid)) + error (_("Target is executing.")); + } if (current_frame == NULL) { diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c index 82221826bdf..bf328fd98ff 100644 --- a/gdb/tracepoint.c +++ b/gdb/tracepoint.c @@ -1856,11 +1856,19 @@ tfind_1 (enum trace_find_type type, int num, int from_tty) { int target_frameno = -1, target_tracept = -1; - struct frame_id old_frame_id; + struct frame_id old_frame_id = null_frame_id; char *reply; struct breakpoint *tp; - old_frame_id = get_frame_id (get_current_frame ()); + /* Only try to get the current stack frame if we have a chance of + succeeding. In particular, if we're trying to get a first trace + frame while all threads are running, it's not going to succeed, + so leave it with a default value and let the frame comparison + below (correctly) decide to print out the source location of the + trace frame. */ + if (!(type == tfind_number && num == -1) + && (has_stack_frames () || traceframe_number >= 0)) + old_frame_id = get_frame_id (get_current_frame ()); target_frameno = target_trace_find (type, num, addr1, addr2, &target_tracept); @@ -1873,7 +1881,7 @@ tfind_1 (enum trace_find_type type, int num, } else if (target_frameno == -1) { - /* A request for a non-existant trace frame has failed. + /* A request for a non-existent trace frame has failed. Our response will be different, depending on FROM_TTY: If FROM_TTY is true, meaning that this command was @@ -1952,7 +1960,7 @@ tfind_1 (enum trace_find_type type, int num, { enum print_what print_what; - /* NOTE: in immitation of the step command, try to determine + /* NOTE: in imitation of the step command, try to determine whether we have made a transition from one function to another. If so, we'll print the "stack frame" (ie. the new function and it's arguments) -- otherwise we'll just show the -- 2.30.2