aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
Diffstat (limited to 'gdb')
-rw-r--r--gdb/ChangeLog5
-rw-r--r--gdb/gdbserver/ChangeLog5
-rw-r--r--gdb/gdbserver/tracepoint.c13
-rw-r--r--gdb/testsuite/ChangeLog7
-rw-r--r--gdb/testsuite/gdb.trace/tsv.exp33
-rw-r--r--gdb/tracepoint.c10
6 files changed, 63 insertions, 10 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 08aee5c..19801d1 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,8 @@
+2013-03-13 Yao Qi <yao@codesourcery.com>
+
+ * tracepoint.c (tfile_get_trace_state_variable_value): Look for
+ the last matched 'V' blcok in trace frame.
+
2013-03-12 Joel Brobecker <brobecker@adacore.com>
* NEWS: Create a new section for the next release branch.
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog
index 9a5ae02..a7289fd 100644
--- a/gdb/gdbserver/ChangeLog
+++ b/gdb/gdbserver/ChangeLog
@@ -1,3 +1,8 @@
+2013-03-13 Yao Qi <yao@codesourcery.com>
+
+ * tracepoint.c (traceframe_read_tsv): Look for the last matched
+ 'V' block in trace frame.
+
2013-03-11 Markus Metzger <markus.t.metzger@intel.com>
* target.h (struct target_ops): Add btrace ops.
diff --git a/gdb/gdbserver/tracepoint.c b/gdb/gdbserver/tracepoint.c
index dcc2e78..bea6202 100644
--- a/gdb/gdbserver/tracepoint.c
+++ b/gdb/gdbserver/tracepoint.c
@@ -5257,6 +5257,7 @@ traceframe_read_tsv (int tsvnum, LONGEST *val)
unsigned char *database, *dataptr;
unsigned int datasize;
int vnum;
+ int found = 0;
trace_debug ("traceframe_read_tsv");
@@ -5279,7 +5280,8 @@ traceframe_read_tsv (int tsvnum, LONGEST *val)
datasize = tframe->data_size;
database = dataptr = &tframe->data[0];
- /* Iterate through a traceframe's blocks, looking for the tsv. */
+ /* Iterate through a traceframe's blocks, looking for the last
+ matched tsv. */
while ((dataptr = traceframe_find_block_type (dataptr,
datasize
- (dataptr - database),
@@ -5294,16 +5296,17 @@ traceframe_read_tsv (int tsvnum, LONGEST *val)
if (tsvnum == vnum)
{
memcpy (val, dataptr, sizeof (*val));
- return 0;
+ found = 1;
}
/* Skip over this block. */
dataptr += sizeof (LONGEST);
}
- trace_debug ("traceframe %d has no data for variable %d",
- tfnum, tsvnum);
- return 1;
+ if (!found)
+ trace_debug ("traceframe %d has no data for variable %d",
+ tfnum, tsvnum);
+ return !found;
}
/* Read a requested block of static tracepoint data from a trace
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 588b0b3..37eecbb 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,5 +1,12 @@
2013-03-13 Yao Qi <yao@codesourcery.com>
+ * gdb.trace/tsv.exp (check_tsv): New.
+ (top level): Save a tfile on current trace session. Call
+ check_tsv on live target. Load the tfile with target tfile
+ and call check_tsv again.
+
+2013-03-13 Yao Qi <yao@codesourcery.com>
+
* gdb.trace/tsv.exp: Remove code unrelated to testing TSV.
Replace some "gdb_test" with "gdb_test_no_output".
diff --git a/gdb/testsuite/gdb.trace/tsv.exp b/gdb/testsuite/gdb.trace/tsv.exp
index bab0a10..de523fd 100644
--- a/gdb/testsuite/gdb.trace/tsv.exp
+++ b/gdb/testsuite/gdb.trace/tsv.exp
@@ -142,7 +142,36 @@ gdb_test "print \$tvar5" " = 16" \
gdb_test_no_output "tstop" ""
-gdb_test "print \$tvar5" " = 16" \
- "Print a trace state variable after run"
+# Save trace frames to tfile.
+set tracefile [standard_output_file ${testfile}]
+gdb_test "tsave ${tracefile}.tf" \
+ "Trace data saved to file '${tracefile}.tf'.*" \
+ "save tfile trace file"
+
+proc check_tsv { data_source } {
+ with_test_prefix "${data_source}" {
+ gdb_test "tfind 0"
+ gdb_test "print \$tvar5" " = 16" \
+ "Print a trace state variable"
+ gdb_test "tfind" \
+ "Target failed to find requested trace frame.*"
+ }
+}
+# Check the tsv from the live inferior.
+check_tsv "live"
+
+# Change target to tfile.
+set test "change to tfile target"
+gdb_test_multiple "target tfile ${tracefile}.tf" "$test" {
+ -re "A program is being debugged already. Kill it. .y or n. " {
+ send_gdb "y\n"
+ exp_continue
+ }
+ -re "$gdb_prompt $" {
+ pass "$test"
+ }
+}
+# Check the tsv from tfile.
+check_tsv "tfile"
diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c
index 7f27bc0..513dccc 100644
--- a/gdb/tracepoint.c
+++ b/gdb/tracepoint.c
@@ -4655,7 +4655,12 @@ static int
tfile_get_trace_state_variable_value (int tsvnum, LONGEST *val)
{
int pos;
+ int found = 0;
+ /* Iterate over blocks in current frame and find the last 'V'
+ block in which tsv number is TSVNUM. In one trace frame, there
+ may be multiple 'V' blocks created for a given trace variable,
+ and the last matched 'V' block contains the updated value. */
pos = 0;
while ((pos = traceframe_find_block_type ('V', pos)) >= 0)
{
@@ -4671,13 +4676,12 @@ tfile_get_trace_state_variable_value (int tsvnum, LONGEST *val)
*val = extract_signed_integer ((gdb_byte *) val, 8,
gdbarch_byte_order
(target_gdbarch ()));
- return 1;
+ found = 1;
}
pos += (4 + 8);
}
- /* Didn't find anything. */
- return 0;
+ return found;
}
static int