summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog8
-rw-r--r--gdb/frame.c17
-rw-r--r--gdb/tracepoint.c16
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 <stan@codesourcery.com>
+
+ * 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 <pedro@codesourcery.com>
* 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