* tracepoint.c (tfile_get_trace_state_variable_value): Look for
authorYao Qi <yao@codesourcery.com>
Wed, 13 Mar 2013 03:40:27 +0000 (03:40 +0000)
committerYao Qi <yao@codesourcery.com>
Wed, 13 Mar 2013 03:40:27 +0000 (03:40 +0000)
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
gdb/gdbserver/ChangeLog
gdb/gdbserver/tracepoint.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.trace/tsv.exp
gdb/tracepoint.c

index 08aee5c71887d1ffc64b5e5a5c40321e7282cb64..19801d1aea0e9d36182fbdb45a85ac194d229a4a 100644 (file)
@@ -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.
index 9a5ae02a4fb9f83fcfffe3eb24f7a2de266b7022..a7289fdb1c89117c3a949df6a36b63eaf0fe1909 100644 (file)
@@ -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.
index dcc2e78f707fb3d1d82673a20ee31b34d2dced19..bea6202f05fd7a46d521d565e609581a2beb2edd 100644 (file)
@@ -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
index 588b0b39cb8fc6ee133c71a38bd5cb091069fc5a..37eecbba49e06c5c3d21e145b2f72feb40beed8d 100644 (file)
@@ -1,3 +1,10 @@
+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.
index bab0a107aa8c172cdbf3278a48415ec226d86f9e..de523fddacf82a0723ecf78b581793cf5df435e1 100644 (file)
@@ -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"
index 7f27bc028abaa65d468ae3aebd675b10aa12e29f..513dccce57bdc8ce510545cc80fdad56409b9f9d 100644 (file)
@@ -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
This page took 0.048207 seconds and 4 git commands to generate.