From 8ddb196517f30b5e304663e428f345daf030230b Mon Sep 17 00:00:00 2001 From: Yao Qi Date: Wed, 13 Mar 2013 03:40:27 +0000 Subject: [PATCH] * tracepoint.c (tfile_get_trace_state_variable_value): Look for the last matched 'V' blcok in trace frame. gdb/gdbserver: * tracepoint.c (traceframe_read_tsv): Look for the last matched 'V' block in trace frame. gdb/testsuite: * 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. --- gdb/ChangeLog | 5 +++++ gdb/gdbserver/ChangeLog | 5 +++++ gdb/gdbserver/tracepoint.c | 13 ++++++++----- gdb/testsuite/ChangeLog | 7 +++++++ gdb/testsuite/gdb.trace/tsv.exp | 33 +++++++++++++++++++++++++++++++-- gdb/tracepoint.c | 10 +++++++--- 6 files changed, 63 insertions(+), 10 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 08aee5c7188..19801d1aea0 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2013-03-13 Yao Qi + + * tracepoint.c (tfile_get_trace_state_variable_value): Look for + the last matched 'V' blcok in trace frame. + 2013-03-12 Joel Brobecker * NEWS: Create a new section for the next release branch. diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 9a5ae02a4fb..a7289fdb1c8 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,8 @@ +2013-03-13 Yao Qi + + * tracepoint.c (traceframe_read_tsv): Look for the last matched + 'V' block in trace frame. + 2013-03-11 Markus Metzger * target.h (struct target_ops): Add btrace ops. diff --git a/gdb/gdbserver/tracepoint.c b/gdb/gdbserver/tracepoint.c index dcc2e78f707..bea6202f05f 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 588b0b39cb8..37eecbba49e 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2013-03-13 Yao Qi + + * 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 * gdb.trace/tsv.exp: Remove code unrelated to testing TSV. diff --git a/gdb/testsuite/gdb.trace/tsv.exp b/gdb/testsuite/gdb.trace/tsv.exp index bab0a107aa8..de523fddacf 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 7f27bc028ab..513dccce57b 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 -- 2.30.2