From: Stan Shebs <stan@codesourcery.com>
To: gdb-patches@sourceware.org
Subject: [PATCH] Print trace state variables
Date: Thu, 09 Dec 2010 22:38:00 -0000 [thread overview]
Message-ID: <4D015A4A.7040500@codesourcery.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 1152 bytes --]
This patch remedies an oversight in recent tracepoint work, by adding
printing of trace state variables. While you can see tsv values using
"info tvariables", it's much more useful to be able to include them in
print commands and expressions in general; you can then display them in
different formats, or compute the difference between a tsv and some
other value. The manual already documents this as working, only the
code to do it has been missing. :-)
This has been in CodeSourcery's version for some time, but I set it
aside for awhile because it seemed a little kludgy to add a
tracepoint-specific case into general evaluation. On the plus side, its
effect is localized, and should be safe for a 7.2 update release, where
it will be useful for work on trace support in Eclipse. There are no
regressions testing with either i386-linux native or GDBserver.
If this seems reasonable, I'll put in both trunk and 7.2 branch.
Stan
2010-12-08 Stan Shebs <stan@codesourcery.com>
* value.c (value_of_internalvar): Add case for trace state
variables.
* gdb.trace/tsv.exp: Test print command on trace state variables.
[-- Attachment #2: ptsv-patch-1 --]
[-- Type: text/plain, Size: 4504 bytes --]
Index: value.c
===================================================================
RCS file: /cvs/src/src/gdb/value.c,v
retrieving revision 1.118
diff -p -r1.118 value.c
*** value.c 29 Nov 2010 21:18:16 -0000 1.118
--- value.c 9 Dec 2010 01:03:40 -0000
***************
*** 42,47 ****
--- 42,49 ----
#include "python/python.h"
+ #include "tracepoint.h"
+
/* Prototypes for exported functions. */
void _initialize_values (void);
*************** struct value *
*** 1197,1202 ****
--- 1199,1220 ----
value_of_internalvar (struct gdbarch *gdbarch, struct internalvar *var)
{
struct value *val;
+ struct trace_state_variable *tsv;
+
+ /* If there is a trace state variable of the same name, assume that
+ is what we really want to see. */
+ tsv = find_trace_state_variable (var->name);
+ if (tsv)
+ {
+ tsv->value_known = target_get_trace_state_variable_value (tsv->number,
+ &(tsv->value));
+ if (tsv->value_known)
+ val = value_from_longest (builtin_type (gdbarch)->builtin_int64,
+ tsv->value);
+ else
+ val = allocate_value (builtin_type (gdbarch)->builtin_void);
+ return val;
+ }
switch (var->kind)
{
Index: testsuite/gdb.trace/tsv.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.trace/tsv.exp,v
retrieving revision 1.5
diff -p -r1.5 tsv.exp
*** testsuite/gdb.trace/tsv.exp 2 Jun 2010 21:55:28 -0000 1.5
--- testsuite/gdb.trace/tsv.exp 9 Dec 2010 01:03:40 -0000
*************** set srcfile ${testfile}.c
*** 27,41 ****
set binfile $objdir/$subdir/tsv
if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \
executable {debug nowarnings}] != "" } {
! untested tracecmd.exp
return -1
}
! gdb_reinitialize_dir $srcdir/$subdir
!
! # If testing on a remote host, download the source file.
! # remote_download host $srcdir/$subdir/$srcfile
!
! gdb_file_cmd $binfile
gdb_test "tvariable \$tvar1" \
"Trace state variable \\\$tvar1 created, with initial value 0." \
--- 27,36 ----
set binfile $objdir/$subdir/tsv
if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \
executable {debug nowarnings}] != "" } {
! untested tsv.exp
return -1
}
! gdb_load $binfile
gdb_test "tvariable \$tvar1" \
"Trace state variable \\\$tvar1 created, with initial value 0." \
*************** gdb_test "info tvariables" \
*** 72,77 ****
--- 67,75 ----
\\\$tvar3\[\t \]+1234567000000\[\t \]+.*<undefined>.*" \
"List tvariables"
+ gdb_test "print \$tvar2" " = void" \
+ "Print a trace state variable before run"
+
gdb_test_no_output "delete tvariable \$tvar2" \
"delete trace state variable"
*************** gdb_test "info tvariables" \
*** 91,94 ****
--- 89,150 ----
"No trace state variables.*" \
"List tvariables after deleting all"
+ # Now try running a trace.
+
+ runto_main
+ gdb_reinitialize_dir $srcdir/$subdir
+
+ # The rest of the testing needs actual tracing to work.
+ if { ![gdb_target_supports_trace] } then {
+ pass "Current target does not support trace"
+ return 1;
+ }
+
+ # define relative source line numbers:
+ # all subsequent line numbers are relative to this first one (baseline)
+
+ set baseline [gdb_find_recursion_test_baseline $srcfile];
+ if { $baseline == -1 } then {
+ fail "Could not find gdb_recursion_test function"
+ return;
+ }
+
+ set testline1 [expr $baseline + 7]
+
+ gdb_delete_tracepoints
+ set trcpt1 [gdb_gettpnum gdb_c_test];
+ set trcpt2 [gdb_gettpnum gdb_asm_test];
+ set trcpt3 [gdb_gettpnum $testline1];
+ if { $trcpt1 <= 0 || $trcpt2 <= 0 || $trcpt3 <= 0 } then {
+ fail "setting tracepoints"
+ return;
+ }
+
+ gdb_test "tvariable \$tvar5 = 15" \
+ "Trace state variable \\\$tvar5 created, with initial value 15." \
+ "Create a trace state variable tvar5"
+
+ gdb_trace_setactions "collect tsv for first tracepoint" \
+ "$trcpt1" \
+ "collect \$tvar5 += 1" "^$"
+
+ gdb_test "tstart" ".*" ""
+
+ gdb_test "print \$tvar5" " = 15" \
+ "Print a trace state variable at start of run"
+
+ # Be sure not to fall off the end of the program.
+ gdb_test "break end" ".*" ""
+ gdb_test "continue" \
+ "Continuing.*Breakpoint $decimal, end.*" \
+ "run trace experiment"
+
+ gdb_test "print \$tvar5" " = 16" \
+ "Print a trace state variable during run"
+
+ gdb_test "tstop" ".*" ""
+
+ gdb_test "print \$tvar5" " = 16" \
+ "Print a trace state variable after run"
+
next reply other threads:[~2010-12-09 22:38 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-12-09 22:38 Stan Shebs [this message]
2010-12-10 11:27 ` Joel Brobecker
2010-12-10 14:04 ` Stan Shebs
2010-12-10 16:35 ` Marc Khouzam
2010-12-10 20:00 ` Tom Tromey
2010-12-11 5:28 ` Joel Brobecker
2010-12-11 5:55 ` Joel Brobecker
2010-12-13 5:56 ` Stan Shebs
2010-12-13 13:00 ` Pedro Alves
2010-12-14 16:13 ` Tom Tromey
2010-12-13 12:31 ` Hui Zhu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4D015A4A.7040500@codesourcery.com \
--to=stan@codesourcery.com \
--cc=gdb-patches@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox