OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /openrisc/trunk/gnu-old/gdb-7.1/gdb/testsuite/gdb.trace
    from Rev 834 to Rev 842
    Reverse comparison

Rev 834 → Rev 842

/actions.c
0,0 → 1,134
/*
* Test program for trace action commands
*/
 
static char gdb_char_test;
static short gdb_short_test;
static long gdb_long_test;
static char gdb_arr_test[25];
static struct GDB_STRUCT_TEST
{
char c;
short s;
long l;
int bfield : 11; /* collect bitfield */
char arr[25];
struct GDB_STRUCT_TEST *next;
} gdb_struct1_test, gdb_struct2_test, *gdb_structp_test, **gdb_structpp_test;
 
static union GDB_UNION_TEST
{
char c;
short s;
long l;
int bfield : 11; /* collect bitfield */
char arr[4];
union GDB_UNION_TEST *next;
} gdb_union1_test;
 
void gdb_recursion_test (int, int, int, int, int, int, int);
 
void gdb_recursion_test (int depth,
int q1,
int q2,
int q3,
int q4,
int q5,
int q6)
{ /* gdb_recursion_test line 0 */
int q = q1; /* gdbtestline 1 */
 
q1 = q2; /* gdbtestline 2 */
q2 = q3; /* gdbtestline 3 */
q3 = q4; /* gdbtestline 4 */
q4 = q5; /* gdbtestline 5 */
q5 = q6; /* gdbtestline 6 */
q6 = q; /* gdbtestline 7 */
if (depth--) /* gdbtestline 8 */
gdb_recursion_test (depth, q1, q2, q3, q4, q5, q6); /* gdbtestline 9 */
}
 
 
unsigned long gdb_c_test( unsigned long *parm )
 
{
char *p = "gdb_c_test";
char *ridiculously_long_variable_name_with_equally_long_string_assignment;
register long local_reg = 7;
static unsigned long local_static, local_static_sizeof;
long local_long;
unsigned long *stack_ptr;
unsigned long end_of_stack;
 
ridiculously_long_variable_name_with_equally_long_string_assignment =
"ridiculously long variable name with equally long string assignment";
local_static = 9;
local_static_sizeof = sizeof (struct GDB_STRUCT_TEST);
local_long = local_reg + 1;
stack_ptr = (unsigned long *) &local_long;
end_of_stack =
(unsigned long) &stack_ptr + sizeof(stack_ptr) + sizeof(end_of_stack) - 1;
 
gdb_char_test = gdb_struct1_test.c = (char) ((long) parm[1] & 0xff);
gdb_short_test = gdb_struct1_test.s = (short) ((long) parm[2] & 0xffff);
gdb_long_test = gdb_struct1_test.l = (long) ((long) parm[3] & 0xffffffff);
gdb_union1_test.l = (long) parm[4];
gdb_arr_test[0] = gdb_struct1_test.arr[0] = (char) ((long) parm[1] & 0xff);
gdb_arr_test[1] = gdb_struct1_test.arr[1] = (char) ((long) parm[2] & 0xff);
gdb_arr_test[2] = gdb_struct1_test.arr[2] = (char) ((long) parm[3] & 0xff);
gdb_arr_test[3] = gdb_struct1_test.arr[3] = (char) ((long) parm[4] & 0xff);
gdb_arr_test[4] = gdb_struct1_test.arr[4] = (char) ((long) parm[5] & 0xff);
gdb_arr_test[5] = gdb_struct1_test.arr[5] = (char) ((long) parm[6] & 0xff);
gdb_struct1_test.bfield = 144;
gdb_struct1_test.next = &gdb_struct2_test;
gdb_structp_test = &gdb_struct1_test;
gdb_structpp_test = &gdb_structp_test;
 
gdb_recursion_test (3, (long) parm[1], (long) parm[2], (long) parm[3],
(long) parm[4], (long) parm[5], (long) parm[6]);
 
gdb_char_test = gdb_short_test = gdb_long_test = 0;
gdb_structp_test = (void *) 0;
gdb_structpp_test = (void *) 0;
memset ((char *) &gdb_struct1_test, 0, sizeof (gdb_struct1_test));
memset ((char *) &gdb_struct2_test, 0, sizeof (gdb_struct2_test));
local_static_sizeof = 0;
local_static = 0;
return ( (unsigned long) 0 );
}
 
static void gdb_asm_test (void)
{
}
 
static void begin () /* called before anything else */
{
}
 
static void end () /* called after everything else */
{
}
 
int
main (argc, argv, envp)
int argc;
char *argv[], **envp;
{
int i;
unsigned long myparms[10];
 
#ifdef usestubs
set_debug_traps ();
breakpoint ();
#endif
 
begin ();
for (i = 0; i < sizeof (myparms) / sizeof (myparms[0]); i++)
myparms[i] = i;
 
gdb_c_test (&myparms[0]);
 
end ();
return 0;
}
 
actions.c Property changes : Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +Id \ No newline at end of property Index: Makefile.in =================================================================== --- Makefile.in (nonexistent) +++ Makefile.in (revision 842) @@ -0,0 +1,14 @@ +VPATH = @srcdir@ +srcdir = @srcdir@ + +.PHONY: all clean mostlyclean distclean realclean + +all info install-info dvi install uninstall installcheck check: + @echo "Nothing to be done for $@..." + +clean mostlyclean: + -rm -f actions circ collection limits + -rm -f *.o *.diff *~ *.bad core sh3 hppa mn10300 + +distclean maintainer-clean realclean: clean + -rm -f Makefile config.status config.log Index: limits.c =================================================================== --- limits.c (nonexistent) +++ limits.c (revision 842) @@ -0,0 +1,51 @@ +/* + * Test program for tracing internal limits (number of tracepoints etc.) + */ + +int n = 6; + +int arr[64]; + +static void foo(int x) +{ +} + +static void bar(int y) +{ +} + +static void baz(int z) +{ +} + +static void begin () /* called before anything else */ +{ +} + +static void end () /* called after everything else */ +{ +} + +int +main (argc, argv, envp) + int argc; + char *argv[], **envp; +{ + int i; + +#ifdef usestubs + set_debug_traps (); + breakpoint (); +#endif + + begin (); + for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) + arr[i] = i + 1; + + foo (1); + bar (2); + baz (3); + end (); + return 0; +} +
limits.c Property changes : Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +Id \ No newline at end of property Index: tfile.c =================================================================== --- tfile.c (nonexistent) +++ tfile.c (revision 842) @@ -0,0 +1,116 @@ +/* This program does two things; it generates valid trace files, and + it can also be traced so as to test trace file creation from + GDB. */ + +#include +#include +#include +#include + +char spbuf[200]; + +char trbuf[1000]; +char *trptr; +char *tfsizeptr; + +int testglob = 31415; + +int +start_trace_file (char *filename) +{ + int fd; + + fd = open (filename, O_WRONLY|O_CREAT|O_APPEND, + S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH); + + if (fd < 0) + return fd; + + /* Write a file header, with a high-bit-set char to indicate a + binary file, plus a hint as what this file is, and a version + number in case of future needs. */ + write (fd, "\x7fTRACE0\n", 8); + + return fd; +} + +void +finish_trace_file (int fd) +{ + close (fd); +} + +void +write_basic_trace_file () +{ + int fd; + + fd = start_trace_file ("basic.tf"); + + /* The next part of the file consists of newline-separated lines + defining status, tracepoints, etc. The section is terminated by + an empty line. */ + + /* Dump the size of the R (register) blocks in traceframes. */ + snprintf (spbuf, sizeof spbuf, "R %x\n", 500 /* FIXME get from arch */); + write (fd, spbuf, strlen (spbuf)); + + /* Dump trace status, in the general form of the qTstatus reply. */ + snprintf (spbuf, sizeof spbuf, "status 0;tstop:0;tframes:1;tcreated:1;tfree:100;tsize:1000\n"); + write (fd, spbuf, strlen (spbuf)); + + /* Dump tracepoint definitions, in syntax similar to that used + for reconnection uploads. */ + snprintf (spbuf, sizeof spbuf, "tp T1:%lx:E:0:0\n", + (long) &write_basic_trace_file); + write (fd, spbuf, strlen (spbuf)); + /* (Note that we would only need actions defined if we wanted to + test tdump.) */ + + /* Empty line marks the end of the definition section. */ + write (fd, "\n", 1); + + /* Make up a simulated trace buffer. */ + /* (Encapsulate better if we're going to do lots of this.) */ + trptr = trbuf; + *((short *) trptr) = 1; + trptr += sizeof (short); + tfsizeptr = trptr; + trptr += sizeof (int); + *((char *) trptr) = 'M'; + trptr += 1; + *((long long *) trptr) = (long) &testglob; + trptr += sizeof (long long); + *((short *) trptr) = sizeof (testglob); + trptr += sizeof (short); + *((int *) trptr) = testglob; + trptr += sizeof (testglob); + /* Go back and patch in the frame size. */ + *((int *) tfsizeptr) = trptr - tfsizeptr - sizeof (int); + + /* Write end of tracebuffer marker. */ + *((short *) trptr) = 0; + trptr += sizeof (short); + *((int *) trptr) = 0; + trptr += sizeof (int); + + write (fd, trbuf, trptr - trbuf); + + finish_trace_file (fd); +} + +void +done_making_trace_files (void) +{ +} + +int +main (int argc, char **argv, char **envp) +{ + write_basic_trace_file (); + + done_making_trace_files (); + + return 0; +} +
tfile.c Property changes : Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +Id \ No newline at end of property Index: save-trace.exp =================================================================== --- save-trace.exp (nonexistent) +++ save-trace.exp (revision 842) @@ -0,0 +1,161 @@ +# Copyright 1998, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# This file was written by Michael Snyder (msnyder@cygnus.com) + +load_lib "trace-support.exp"; + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +gdb_exit +gdb_start + +set testfile "actions" +set srcfile ${testfile}.c +set binfile $objdir/$subdir/save-trace +if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \ + executable {debug nowarnings}] != "" } { + untested save-trace.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 + +# 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 + 4] +set testline2 [expr $baseline + 5] +set testline3 [expr $baseline + 6] +set testline4 [expr $baseline + 7] +set testline5 [expr $baseline + 8] +set testline6 [expr $baseline + 9] + +# +# test save-trace command +# + +# setup a set of tracepoints to save + +gdb_delete_tracepoints + +foreach x { 1 2 3 4 5 6 } { + set testline [expr \$testline$x]; + set trcpt [gdb_gettpnum $testline]; + set trcpt$x $trcpt; + gdb_test "passcount $x" \ + "Setting tracepoint $trcpt.* to $x" \ + "10.x: set passcount for tracepoint $trcpt" + + gdb_trace_setactions "10.x: set actions for tracepoint $x" \ + "" \ + "collect q$x" "^$" \ + "while-stepping $x" "^$" \ + "collect q$x" "^$" \ + "end" "^$" +} + + +proc gdb_verify_tracepoints { testname } { + global gdb_prompt; + + set ws "\[\t \]+" + set nl "\[\r\n\]+" + set ourstate 1; + set result "pass"; + send_gdb "info tracepoints\n"; + gdb_expect 10 { + -re "\[0-9\]+\[\t \]+tracepoint\[\t \]+keep y\[\t \]+0x\[0-9a-fA-F\]+ in gdb_recursion_test\[^\r\n\]+" { +# if { $expect_out(1,string) != $ourstate } { +# set result "fail"; +# } + incr ourstate; + exp_continue; + } + -re "$gdb_prompt $" { + if { $ourstate >= 6 } { + set result "pass"; + } else { + set result "fail"; + } + } + default { + set result "fail"; + } + } + $result $testname; + return $result; +} + +gdb_verify_tracepoints "10.x: verify trace setup"; + +# 10.1 Save current tracepoint definitions to a file + +remote_file host delete savetrace.tr +gdb_test "save-tracepoints savetrace.tr" \ + "Tracepoints saved to file 'savetrace.tr'." \ + "10.1: save tracepoint definitions" + +# 10.2 Read back tracepoint definitions + +gdb_delete_tracepoints +gdb_test "info tracepoints" "No tracepoints." "10.2: delete tracepoints" +gdb_test "source savetrace.tr" \ + "Tracepoint \[0-9\]+ at .*" \ + "10.2: read back saved tracepoints" +gdb_verify_tracepoints "10.2: verify recovered tracepoints"; +remote_file host delete savetrace.tr + +# 10.3 repeat with a path to the file + +set escapedfilename [string_to_regexp $objdir/savetrace.tr] +remote_file host delete $objdir/savetrace.tr +gdb_test "save-tracepoints $objdir/savetrace.tr" \ + "Tracepoints saved to file '${escapedfilename}'." \ + "10.3: save tracepoint definitions, full path" + +gdb_delete_tracepoints +gdb_test "info tracepoints" "No tracepoints." "10.3: delete tracepoints" +gdb_test "source $objdir/savetrace.tr" \ + "Tracepoint \[0-9\]+ at .*" \ + "10.4: read saved tracepoints, full path" +gdb_verify_tracepoints "10.3: verify recovered tracepoints, full path"; +remote_file host delete $objdir/savetrace.tr + +# 10.5 invalid filename +# [deferred -- not sure what a good invalid filename would be] + +# 10.6 save-trace (file already exists) +# [expect it to clobber the old one] + +# 10.7 help save-tracepoints + +gdb_test "help save-tracepoints" \ + "Save current tracepoint definitions as a script.*" \ + "10.7: help save-tracepoints" Index: collection.exp =================================================================== --- collection.exp (nonexistent) +++ collection.exp (revision 842) @@ -0,0 +1,626 @@ +# Copyright 1998, 2005, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +load_lib "trace-support.exp" + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +set testfile "collection" +set srcfile ${testfile}.c +set binfile $objdir/$subdir/$testfile + +if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \ + executable {debug nowarnings}] != "" } { + untested collection.exp + return -1 +} + +# Tests: +# 1) $args +# 2) function args by name +# 3) $locs +# 4) function locals by name +# 5) $regs +# 6) registers by name ($sp, $fp?) +# 7) globals by name +# 8) expressions (lots of different kinds: local and global) + +set ws "\[\r\n\t \]+" +set cr "\[\r\n\]+" + +# +# Utility procs +# + +proc test_register { reg test_id } { + global cr + global gdb_prompt + + send_gdb "print $reg\n" + gdb_expect { + -re "\\$\[0-9\]+ = \[x0\]+$cr$gdb_prompt " { + fail "collect $test_id: collected $reg (zero)" + } + -re "\\$\[0-9\]+ = \[x0-9a-fA-F\]+$cr$gdb_prompt " { + pass "collect $test_id: collected $reg" + } + -re "\[Ee\]rror.*$gdb_prompt " { + fail "collect $test_id: collected $reg (error)" + } + timeout { + fail "collect $test_id: collected $reg (timeout)" + } + } +} + +proc run_trace_experiment { msg test_func } { + global gdb_prompt + gdb_run_cmd + gdb_expect { + -re ".*Breakpoint \[0-9\]+, begin .*$gdb_prompt $" { + } + -re ".*$gdb_prompt $" { + fail "collect $msg: advance to go" + } + timeout { + fail "collect $msg: advance to go (timeout)" + } + } + gdb_test "tstart" \ + "\[\r\n\]+" \ + "collect $msg: start trace experiment" + gdb_test "continue" \ + "Continuing.*Breakpoint \[0-9\]+, end.*" \ + "collect $msg: run trace experiment" + gdb_test "tstop" \ + "\[\r\n\]+" \ + "collect $msg: stop trace experiment" + gdb_test "tfind start" \ + "#0 $test_func .*" \ + "collect $msg: tfind test frame" +} + + +# +# Test procs +# + +proc gdb_collect_args_test { myargs msg } { + global cr + global gdb_prompt + + # Make sure we're in a sane starting state. + gdb_test "tstop" "" "" + gdb_test "tfind none" "" "" + gdb_delete_tracepoints + + gdb_test "trace args_test_func" \ + "Tracepoint \[0-9\]+ at .*" \ + "collect $msg: set tracepoint" + gdb_trace_setactions "collect $msg: define actions" \ + "" \ + "collect $myargs" "^$" + + # Begin the test. + run_trace_experiment $msg args_test_func + + gdb_test "print argc" \ + "\\$\[0-9\]+ = 1 '.001'$cr" \ + "collect $msg: collected arg char" + gdb_test "print argi" \ + "\\$\[0-9\]+ = 2$cr" \ + "collect $msg: collected arg int" + gdb_test "print argf" \ + "\\$\[0-9\]+ = 3.\[23\]\[0-9\]*$cr" \ + "collect $msg: collected arg float" + gdb_test "print argd" \ + "\\$\[0-9\]+ = 4.\[34\]\[0-9\]*$cr" \ + "collect $msg: collected arg double" + + # struct arg as one of several args (near end of list) + gdb_test "print argstruct.memberc" \ + "\\$\[0-9\]+ = 101 'e'$cr" \ + "collect $msg: collected arg struct member char" + gdb_test "print argstruct.memberi" \ + "\\$\[0-9\]+ = 102$cr" \ + "collect $msg: collected arg struct member int" + gdb_test "print argstruct.memberf" \ + "\\$\[0-9\]+ = 103.\[23\]\[0-9\]*$cr" \ + "collect $msg: collected arg struct member float" + gdb_test "print argstruct.memberd" \ + "\\$\[0-9\]+ = 104.\[34\]\[0-9\]*$cr" \ + "collect $msg: collected arg struct member double" + + # array arg as one of several args (near end of list) + gdb_test "print argarray\[0\]" \ + "\\$\[0-9\]+ = 111$cr" \ + "collect $msg: collected argarray #0" + gdb_test "print argarray\[1\]" \ + "\\$\[0-9\]+ = 112$cr" \ + "collect $msg: collected argarray #1" + gdb_test "print argarray\[2\]" \ + "\\$\[0-9\]+ = 113$cr" \ + "collect $msg: collected argarray #2" + gdb_test "print argarray\[3\]" \ + "\\$\[0-9\]+ = 114$cr" \ + "collect $msg: collected argarray #3" + + gdb_test "tfind none" \ + "#0 end .*" \ + "collect $msg: cease trace debugging" +} + +proc gdb_collect_argstruct_test { myargs msg } { + global cr + global gdb_prompt + + # Make sure we're in a sane starting state. + gdb_test "tstop" "" "" + gdb_test "tfind none" "" "" + gdb_delete_tracepoints + + gdb_test "trace argstruct_test_func" \ + "Tracepoint \[0-9\]+ at .*" \ + "collect $msg: set tracepoint" + gdb_trace_setactions "collect $msg: define actions" \ + "" \ + "collect $myargs" "^$" + + # Begin the test. + run_trace_experiment $msg argstruct_test_func + + # struct argument as only argument + gdb_test "print argstruct.memberc" \ + "\\$\[0-9\]+ = 101 'e'$cr" \ + "collect $msg: collected arg struct member char" + gdb_test "print argstruct.memberi" \ + "\\$\[0-9\]+ = 102$cr" \ + "collect $msg: collected arg struct member int" + gdb_test "print argstruct.memberf" \ + "\\$\[0-9\]+ = 103.\[23\]\[0-9\]*$cr" \ + "collect $msg: collected arg struct member float" + gdb_test "print argstruct.memberd" \ + "\\$\[0-9\]+ = 104.\[34\]\[0-9\]*$cr" \ + "collect $msg: collected arg struct member double" + + gdb_test "tfind none" \ + "#0 end .*" \ + "collect $msg: cease trace debugging" +} + + +proc gdb_collect_argarray_test { myargs msg } { + global cr + global gdb_prompt + + # Make sure we're in a sane starting state. + gdb_test "tstop" "" "" + gdb_test "tfind none" "" "" + gdb_delete_tracepoints + + gdb_test "trace argarray_test_func" \ + "Tracepoint \[0-9\]+ at .*" \ + "collect $msg: set tracepoint" + gdb_trace_setactions "collect $msg: define actions" \ + "" \ + "collect $myargs" "^$" + + # Begin the test. + run_trace_experiment $msg argarray_test_func + + # array arg as only argument + gdb_test "print argarray\[0\]" \ + "\\$\[0-9\]+ = 111$cr" \ + "collect $msg: collected argarray #0" + gdb_test "print argarray\[1\]" \ + "\\$\[0-9\]+ = 112$cr" \ + "collect $msg: collected argarray #1" + gdb_test "print argarray\[2\]" \ + "\\$\[0-9\]+ = 113$cr" \ + "collect $msg: collected argarray #2" + gdb_test "print argarray\[3\]" \ + "\\$\[0-9\]+ = 114$cr" \ + "collect $msg: collected argarray #3" + + gdb_test "tfind none" \ + "#0 end .*" \ + "collect $msg: cease trace debugging" +} + + +proc gdb_collect_locals_test { func mylocs msg } { + global cr + global gdb_prompt + + # Make sure we're in a sane starting state. + gdb_test "tstop" "" "" + gdb_test "tfind none" "" "" + gdb_delete_tracepoints + + # Find the comment-identified line for setting this tracepoint. + set testline 0 + send_gdb "list $func, +30\n" + gdb_expect { + -re "\[\r\n\](\[0-9\]+)\[^\r\n\]+ Set_Tracepoint_Here .*$gdb_prompt" { + set testline $expect_out(1,string) + pass "collect $msg: find tracepoint line" + } + -re ".*$gdb_prompt " { + fail "collect $msg: find tracepoint line (skipping locals test)" + return + } + timeout { + fail "collect $msg: find tracepoint line (skipping locals test)" + return + } + } + + gdb_test "trace $testline" \ + "Tracepoint \[0-9\]+ at .*" \ + "collect $msg: set tracepoint" + gdb_trace_setactions "collect $msg: define actions" \ + "" \ + "collect $mylocs" "^$" + + # Begin the test. + run_trace_experiment $msg $func + + gdb_test "print locc" \ + "\\$\[0-9\]+ = 11 '.\[a-z0-7\]+'$cr" \ + "collect $msg: collected local char" + gdb_test "print loci" \ + "\\$\[0-9\]+ = 12$cr" \ + "collect $msg: collected local int" + gdb_test "print locf" \ + "\\$\[0-9\]+ = 13.\[23\]\[0-9\]*$cr" \ + "collect $msg: collected local float" + gdb_test "print locd" \ + "\\$\[0-9\]+ = 14.\[34\]\[0-9\]*$cr" \ + "collect $msg: collected local double" + + gdb_test "print locst.memberc" \ + "\\$\[0-9\]+ = 15 '.017'$cr" \ + "collect $msg: collected local member char" + gdb_test "print locst.memberi" \ + "\\$\[0-9\]+ = 16$cr" \ + "collect $msg: collected local member int" + gdb_test "print locst.memberf" \ + "\\$\[0-9\]+ = 17.\[67\]\[0-9\]*$cr" \ + "collect $msg: collected local member float" + gdb_test "print locst.memberd" \ + "\\$\[0-9\]+ = 18.\[78\]\[0-9\]*$cr" \ + "collect $msg: collected local member double" + + gdb_test "print locar\[0\]" \ + "\\$\[0-9\]+ = 121$cr" \ + "collect $msg: collected locarray #0" + gdb_test "print locar\[1\]" \ + "\\$\[0-9\]+ = 122$cr" \ + "collect $msg: collected locarray #1" + gdb_test "print locar\[2\]" \ + "\\$\[0-9\]+ = 123$cr" \ + "collect $msg: collected locarray #2" + gdb_test "print locar\[3\]" \ + "\\$\[0-9\]+ = 124$cr" \ + "collect $msg: collected locarray #3" + + + gdb_test "tfind none" \ + "#0 end .*" \ + "collect $msg: cease trace debugging" +} + +proc gdb_collect_registers_test { myregs } { + global cr + global gdb_prompt + + # Make sure we're in a sane starting state. + gdb_test "tstop" "" "" + gdb_test "tfind none" "" "" + gdb_delete_tracepoints + + # We'll simply re-use the args_test_function for this test + gdb_test "trace args_test_func" \ + "Tracepoint \[0-9\]+ at .*" \ + "collect $myregs: set tracepoint" + gdb_trace_setactions "collect $myregs: define actions" \ + "" \ + "collect $myregs" "^$" + + # Begin the test. + run_trace_experiment $myregs args_test_func + + test_register "\$fp" $myregs + test_register "\$sp" $myregs + test_register "\$pc" $myregs + + gdb_test "tfind none" \ + "#0 end .*" \ + "collect $myregs: cease trace debugging" +} + +proc gdb_collect_expression_test { func expr val msg } { + global cr + global gdb_prompt + + # Make sure we're in a sane starting state. + gdb_test "tstop" "" "" + gdb_test "tfind none" "" "" + gdb_delete_tracepoints + + # Find the comment-identified line for setting this tracepoint. + set testline 0 + send_gdb "list $func, +30\n" + gdb_expect { + -re "\[\r\n\](\[0-9\]+)\[^\r\n\]+ Set_Tracepoint_Here .*$gdb_prompt" { + set testline $expect_out(1,string) + pass "collect $msg: find tracepoint line" + } + -re ".*$gdb_prompt " { + fail "collect $msg: find tracepoint line (skipping locals test)" + return + } + timeout { + fail "collect $msg: find tracepoint line (skipping locals test)" + return + } + } + + gdb_test "trace $testline" \ + "Tracepoint \[0-9\]+ at .*" \ + "collect $msg: set tracepoint" + gdb_trace_setactions "collect $msg: define actions" \ + "" \ + "collect $expr" "^$" + + # Begin the test. + run_trace_experiment $msg $func + + gdb_test "print $expr" \ + "\\$\[0-9\]+ = $val$cr" \ + "collect $msg: got expected value '$val'" + + gdb_test "tfind none" \ + "#0 end .*" \ + "collect $msg: cease trace debugging" +} + +proc gdb_collect_globals_test { } { + global cr + global gdb_prompt + + # Make sure we're in a sane starting state. + gdb_test "tstop" "" "" + gdb_test "tfind none" "" "" + gdb_delete_tracepoints + + # Find the comment-identified line for setting this tracepoint. + set testline 0 + send_gdb "list globals_test_func, +30\n" + gdb_expect { + -re "\[\r\n\](\[0-9\]+)\[^\r\n\]+ Set_Tracepoint_Here .*$gdb_prompt" { + set testline $expect_out(1,string) + pass "collect globals: find tracepoint line" + } + -re ".*$gdb_prompt " { + fail "collect globals: find tracepoint line (skipping global test)" + return + } + timeout { + fail "collect globals: find tracepoint line (skipping global test)" + return + } + } + + gdb_test "trace $testline" \ + "Tracepoint \[0-9\]+ at .*" \ + "collect globals: set tracepoint" + gdb_trace_setactions "collect globals: define actions" \ + "" \ + "collect globalc, globali, globalf, globald" "^$" \ + "collect globalstruct, globalp, globalarr" "^$" + + # Begin the test. + run_trace_experiment "globals" globals_test_func + + gdb_test "print globalc" \ + "\\$\[0-9\]+ = 71 'G'$cr" \ + "collect globals: collected global char" + gdb_test "print globali" \ + "\\$\[0-9\]+ = 72$cr" \ + "collect globals: collected global int" + gdb_test "print globalf" \ + "\\$\[0-9\]+ = 73.\[23\]\[0-9\]*$cr" \ + "collect globals: collected global float" + gdb_test "print globald" \ + "\\$\[0-9\]+ = 74.\[34\]\[0-9\]*$cr" \ + "collect globals: collected global double" + + gdb_test "print globalstruct.memberc" \ + "\\$\[0-9\]+ = 81 'Q'$cr" \ + "collect globals: collected struct char member" + gdb_test "print globalstruct.memberi" \ + "\\$\[0-9\]+ = 82$cr" \ + "collect globals: collected struct member int" + gdb_test "print globalstruct.memberf" \ + "\\$\[0-9\]+ = 83.\[23\]\[0-9\]*$cr" \ + "collect globals: collected struct member float" + gdb_test "print globalstruct.memberd" \ + "\\$\[0-9\]+ = 84.\[34\]\[0-9\]*$cr" \ + "collect globals: collected struct member double" + + gdb_test "print globalp == &globalstruct" \ + "\\$\[0-9\]+ = 1$cr" \ + "collect globals: collected global pointer" + + gdb_test "print globalarr\[1\]" \ + "\\$\[0-9\]+ = 1$cr" \ + "collect globals: collected global array element #1" + gdb_test "print globalarr\[2\]" \ + "\\$\[0-9\]+ = 2$cr" \ + "collect globals: collected global array element #2" + gdb_test "print globalarr\[3\]" \ + "\\$\[0-9\]+ = 3$cr" \ + "collect globals: collected global array element #3" + + gdb_test "tfind none" \ + "#0 end .*" \ + "collect globals: cease trace debugging" +} + +proc gdb_trace_collection_test { } { + global gdb_prompt; + + gdb_test "set width 0" "" "" + delete_breakpoints + + # We generously give ourselves one "pass" if we successfully + # detect that this test cannot be run on this target! + if { ![gdb_target_supports_trace] } then { + pass "Current target does not support trace" + return 1; + } + + gdb_test "break begin" "" "" + gdb_test "break end" "" "" + gdb_collect_args_test "\$args" \ + "args collectively" + gdb_collect_args_test "argc, argi, argf, argd, argstruct, argarray" \ + "args individually" + gdb_collect_argstruct_test "\$args" \ + "argstruct collectively" + gdb_collect_argstruct_test "argstruct" \ + "argstruct individually" + gdb_collect_argarray_test "\$args" \ + "argarray collectively" + gdb_collect_argarray_test "argarray" \ + "argarray individually" + gdb_collect_locals_test local_test_func "\$locals" \ + "auto locals collectively" + gdb_collect_locals_test local_test_func \ + "locc, loci, locf, locd, locst, locar" \ + "auto locals individually" + gdb_collect_locals_test reglocal_test_func "\$locals" \ + "register locals collectively" + gdb_collect_locals_test reglocal_test_func \ + "locc, loci, locf, locd, locst, locar" \ + "register locals individually" + gdb_collect_locals_test statlocal_test_func "\$locals" \ + "static locals collectively" + gdb_collect_locals_test statlocal_test_func \ + "locc, loci, locf, locd, locst, locar" \ + "static locals individually" + + gdb_collect_registers_test "\$regs" + gdb_collect_registers_test "\$fp, \$sp, \$pc" + gdb_collect_globals_test + + # + # Expression tests: + # + # *x (**x, ...) + # x.y (x.y.z, ...) + # x->y (x->y->z, ...) + # x[2] (x[2][3], ...) (const index) + # x[y] (x[y][z], ...) (index to be char, short, long, float, double) + # NOTE: + # We test the following operators by using them in an array index + # expression -- because the naked result of an operator is not really + # collected. To be sure the operator was evaluated correctly on the + # target, we have to actually use the result eg. in an array offset + # calculation. + # x[y + z] (tests addition: y and z various combos of types, sclasses) + # x[y - z] (tests subtraction) (ditto) + # x[y * z] (tests multiplication) (ditto) + # x[y / z] (tests division) (ditto) + # x[y % z] (tests modulo division) (ditto) + # x[y == z] (tests equality relation) (ditto) UNSUPPORTED + # x[y != z] (tests inequality relation) (ditto) UNSUPPORTED + # x[y > z] (tests greater-than relation) (ditto) UNSUPPORTED + # x[y < z] (tests less-than relation) (ditto) UNSUPPORTED + # x[y >= z] (tests greater-than-or-equal relation) (ditto) UNSUPPORTED + # x[y <= z] (tests less-than-or-equal relation) (ditto) UNSUPPORTED + # x[y && z] (tests logical and) (ditto) UNSUPPORTED + # x[y || z] (tests logical or) (ditto) UNSUPPORTED + # x[y & z] (tests binary and) (ditto) UNSUPPORTED + # x[y | z] (tests binary or) (ditto) UNSUPPORTED + # x[y ^ z] (tests binary xor) (ditto) UNSUPPORTED + # x[y ? z1 : z2] (tests ternary operator) (ditto) UNSUPPORTED + # x[y << z] (tests shift-left) (ditto) UNSUPPORTED + # x[y >> z] (tests shift-right) (ditto) UNSUPPORTED + # x[y = z] (tests assignment operator) (ditto) UNSUPPORTED + # x[++y] (tests pre-increment operator) (ditto) UNSUPPORTED + # x[--y] (tests pre-decrement operator) (ditto) UNSUPPORTED + # x[y++] (tests post-increment operator) (ditto) UNSUPPORTED + # x[y--] (tests post-decrement operator) (ditto) UNSUPPORTED + # x[+y] (tests unary plus) (ditto) + # x[-y] (tests unary minus) (ditto) + # x[!y] (tests logical not) (ditto) UNSUPPORTED + # x[~y] (tests binary not) (ditto) UNSUPPORTED + # x[(y, z)] (tests comma expression) (ditto) + # cast expr + # stack data + + gdb_collect_expression_test globals_test_func \ + "globalstruct.memberi" "82" "a.b" + gdb_collect_expression_test globals_test_func \ + "globalp->memberc" "81 'Q'" "a->b" + gdb_collect_expression_test globals_test_func \ + "globalarr\[2\]" "2" "a\[2\]" + gdb_collect_expression_test globals_test_func \ + "globalarr\[l3\]" "3" "a\[b\]" + gdb_collect_expression_test globals_test_func \ + "globalarr\[l3 + l2\]" "5" "a\[b + c\]" + gdb_collect_expression_test globals_test_func \ + "globalarr\[l3 - l2\]" "1" "a\[b - c\]" + gdb_collect_expression_test globals_test_func \ + "globalarr\[l3 * l2\]" "6" "a\[b * c\]" + gdb_collect_expression_test globals_test_func \ + "globalarr\[l6 / l3\]" "2" "a\[b / c\]" + gdb_collect_expression_test globals_test_func \ + "globalarr\[l7 % l3\]" "1" "a\[b % c\]" + gdb_collect_expression_test globals_test_func \ + "globalarr\[+l1\]" "1" "a\[+b\]" + gdb_collect_expression_test globals_test_func \ + "globalarr\[-lminus\]" "2" "a\[-b\]" + gdb_collect_expression_test globals_test_func \ + "globalarr\[\(l6, l7\)\]" "7" "a\[\(b, c\)\]" + +} + +# Start with a fresh gdb. + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load $binfile + +if [target_info exists gdb_stub] { + gdb_step_for_stub; +} + +# Body of test encased in a proc so we can return prematurely. +gdb_trace_collection_test + +# Finished! +gdb_test "tfind none" "" "" + + + Index: while-stepping.exp =================================================================== --- while-stepping.exp (nonexistent) +++ while-stepping.exp (revision 842) @@ -0,0 +1,115 @@ +# Copyright 1998, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# This file was written by Michael Snyder (msnyder@cygnus.com) + +load_lib "trace-support.exp"; + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +gdb_exit +gdb_start + +set testfile "actions" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/while-stepping +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" $binfile \ + executable {debug nowarnings}] != "" } { + untested while-stepping.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 + +# +# test while-stepping command +# + +gdb_delete_tracepoints +set trcpt1 [gdb_gettpnum gdb_c_test] +if { $trcpt1 <= 0 } then { + fail "Could not find gdb_c_test function" + return; +} + +# 5.12 basic while-stepping command (collect regs) + +gdb_test "info tracepoints" \ + "Num Type\[ \]+Disp Enb Address\[ \]+What.* +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_c_test at .*$srcfile:\[0-9\]+" \ + "5.12: set a tracepoint, stepcount is zero" + +set stepcount 12 + +gdb_trace_setactions "5.12: set stepcount to $stepcount" \ + "" \ + "while-stepping $stepcount" "" \ + "collect \$regs" "^$" \ + "end" "" + +gdb_test "info tracepoints" \ + "Num Type\[ \]+Disp Enb Address\[ \]+What.* +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_c_test at .*$srcfile:\[0-9\]+. +\[\t \]+step count 12 .*" \ + "5.12: confirm stepcount set to $stepcount" + +gdb_test "info tracepoints" \ + "Num Type\[ \]+Disp Enb Address\[ \]+What.* +.*while-stepping $stepcount.*" \ + "5.12: info trace shows \"while-stepping\"" + + +# 5.13 step out of context while collecting local variable +# [deferred to dynamic test section] + +proc while_stepping_bogus_arg { bogus msgstring } { + global gdb_prompt; + + gdb_trace_setactions "$msgstring" \ + "" \ + "while-stepping $bogus" "\[Ee\]rror|\[Ww\]arning" +} + +# 5.14 while-stepping (no argument) + +while_stepping_bogus_arg "" "5.14: while-stepping null stepcount" + +# 5.15 while-stepping (zero stepcount) + +while_stepping_bogus_arg "0" "5.15: while-stepping rejects zero stepcount" + +# 5.16 while-stepping without collecting anything +gdb_trace_setactions "5.16: step without collecting anything" \ + "" \ + "while-stepping $stepcount" "^$" \ + "end" "" + +gdb_test "info tracepoints" \ + "Num Type\[ \]+Disp Enb Address\[ \]+What.* +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_c_test at .*$srcfile:\[0-9\]+. +.*while-stepping $stepcount.* +.*end.* +.*end.*" \ + "5.16: confirm actions, step without collecting anything" + Index: while-dyn.exp =================================================================== --- while-dyn.exp (nonexistent) +++ while-dyn.exp (revision 842) @@ -0,0 +1,95 @@ +# Copyright 1998, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# This file was written by Michael Snyder (msnyder@cygnus.com) + +load_lib "trace-support.exp" + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +gdb_exit +gdb_start + +set testfile "actions" +set srcfile $testfile.c +set binfile $objdir/$subdir/while-dyn +if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \ + executable {debug nowarnings}] != "" } { + untested while-dyn.exp + return -1 +} +gdb_load $binfile +gdb_test "tstop" "" "" +gdb_test "tfind none" "" "" +runto_main +gdb_reinitialize_dir $srcdir/$subdir + +# We generously give ourselves one "pass" if we successfully +# detect that this test cannot be run on this target! +if { ![gdb_target_supports_trace] } then { + pass "Current target does not support trace" + return 1; + +} + +# If testing on a remote host, download the source file. +# remote_download host $srcdir/$subdir/$srcfile + +# +# test while-stepping dynamically (live target) +# + +## verify number of trace frames collected matches stepcount + +gdb_delete_tracepoints +gdb_test "trace gdb_c_test" \ + "Tracepoint $decimal at .*" \ + "Set tracepoint at gdb_c_test" + +gdb_trace_setactions "5.12: define while-stepping " \ + "" \ + "collect \$fp" "^$" \ + "while-stepping 5" "^$" \ + "collect p" "^$" \ + "end" "^$" \ + "end" "" + +gdb_test "tstart" "" "" + +gdb_test "break end" "" "" +gdb_test "continue" \ + "Continuing.*Breakpoint $decimal, end.*" \ + "run trace experiment" + +gdb_test "tstop" "" "" + +gdb_tfind_test "5.12: frame 5 should be the last one collected" "5" "5" + +send_gdb "tfind 6\n" +gdb_expect { + -re "failed to find.*$gdb_prompt $" { + pass "5.12: trace stopped after 5 stepping frames" + } + -re ".*$gdb_prompt $" { + fail "5.12: trace stopped after 5 stepping frames" + } +} + +gdb_test "tfind none" "" "" Index: actions.exp =================================================================== --- actions.exp (nonexistent) +++ actions.exp (revision 842) @@ -0,0 +1,242 @@ +# Copyright 1998, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# This file was written by Michael Snyder (msnyder@cygnus.com) + +load_lib "trace-support.exp"; + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +gdb_exit +gdb_start + +set testfile "actions" +set srcfile ${testfile}.c +set binfile $objdir/$subdir/actions +if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \ + executable {debug nowarnings}] != "" } { + untested actions.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 + +# 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] + +# +# test actions command +# + +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; +} + +# 5.1 actions of specified tracepoint + +send_gdb "info tracepoints\n" +gdb_expect { + -re "Actions for tracepoint \[0-9\]+:.*$gdb_prompt $" { + fail "5.1a: testsuite failure (tracepoint already has action)!" + } + -re "No tracepoints.*$gdb_prompt $" { + fail "5.1a: set three tracepoints, no actions (No tracepoints!)" + } + -re "$gdb_prompt $" { + pass "5.1a: set three tracepoints, no actions" + } +} + +gdb_trace_setactions "5.1b: set actions for first tracepoint" \ + "$trcpt1" \ + "collect gdb_char_test" "^$" + +gdb_test "info tracepoints" \ + "Num Type\[ \]+Disp Enb Address\[ \]+What.* +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_c_test at .*$srcfile:\[0-9\]+. +\[\t \]+A\[\t \]+collect gdb_char_test. +\[\t \]+A\[\t \]+end. +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_asm_test at .*$srcfile:\[0-9\]+. +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_recursion_test at .*$srcfile:\[0-9\]+" \ + "5.1c: verify actions set for first tracepoint" + +gdb_trace_setactions "5.1d: set actions for second tracepoint" \ + "$trcpt2" \ + "collect gdb_short_test" "^$" + +gdb_test "info tracepoints" \ + "Num Type\[ \]+Disp Enb Address\[ \]+What.* +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_c_test at .*$srcfile:\[0-9\]+. +\[\t \]+A\[\t \]+collect gdb_char_test. +\[\t \]+A\[\t \]+end. +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_asm_test at .*$srcfile:\[0-9\]+. +\[\t \]+A\[\t \]+collect gdb_short_test. +\[\t \]+A\[\t \]+end. +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_recursion_test at .*$srcfile:\[0-9\]+" \ + "5.1e: verify actions set for second tracepoint" + +gdb_trace_setactions "5.2a: set actions for last (default) tracepoint" \ + "" \ + "collect gdb_long_test" "^$" + +gdb_test "info tracepoints" \ + "Num Type\[ \]+Disp Enb Address\[ \]+What.* +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_c_test at .*$srcfile:\[0-9\]+. +\[\t \]+A\[\t \]+collect gdb_char_test. +\[\t \]+A\[\t \]+end. +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_asm_test at .*$srcfile:\[0-9\]+. +\[\t \]+A\[\t \]+collect gdb_short_test. +\[\t \]+A\[\t \]+end. +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_recursion_test at .*$srcfile:\[0-9\]+. +\[\t \]+A\[\t \]+collect gdb_long_test. +\[\t \]+A\[\t \]+end." \ + "5.1e: verify actions set for second tracepoint" + +# 5.3 replace actions set earlier + +gdb_trace_setactions "5.3a: reset actions for first tracepoint" \ + "$trcpt1" \ + "collect gdb_struct1_test" "^$" + +gdb_test "info tracepoints" \ + "Num Type\[ \]+Disp Enb Address\[ \]+What.* +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_c_test at .*$srcfile:\[0-9\]+. +\[\t \]+A\[\t \]+collect gdb_struct1_test. +\[\t \]+A\[\t \]+end. +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_asm_test at .*$srcfile:\[0-9\]+. +\[\t \]+A\[\t \]+collect gdb_short_test. +\[\t \]+A\[\t \]+end. +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_recursion_test at .*$srcfile:\[0-9\]+. +\[\t \]+A\[\t \]+collect gdb_long_test. +\[\t \]+A\[\t \]+end." \ + "5.3b: verify actions set for first tracepoint" + +# +# test end command (all by itself) +# + +# 5.4 end outside of context + +gdb_test "end" "This command cannot be used at the top level." \ + "5.4: 'end' command out of context" + +# 5.5 empty actions (just an end with no other actions) + +gdb_trace_setactions "5.5a: set empty actions for first tracepoint" \ + "$trcpt1" + +send_gdb "info tracepoints\n" +gdb_expect { + -re "No tracepoints.*$gdb_prompt $" { + fail "5.5c: verify NO actions for first tracepoint" + } + -re "Actions for.* $trcpt1:.*$gdb_prompt $" { + fail "5.5c: verify NO actions for first tracepoint" + } + -re "$gdb_prompt $" { + pass "5.5c: verify NO actions for first tracepoint" + } +} + +# 5.6 actions for invalid tracepoint number + +gdb_test "actions [expr $trcpt2 + $trcpt3]" \ + "No tracepoint number [expr $trcpt2 + $trcpt3]." \ + "5.6: actions for invalid tracepoint number" + +# 5.7 invalid action (other than 'collect', 'while-stepping' or 'end') +# "warning: .print gdb_c_test. is not a supported trace.*> $" \ + +gdb_trace_setactions "5.7: invalid action" \ + "$trcpt1" \ + "print gdb_c_test" \ + "warning: .print gdb_c_test. is not a supported trace" + +# 5.8 help actions (collect, while-stepping, end) + +gdb_test "help actions" \ + "Specify the actions to be taken at a tracepoint.*" \ + "5.8a: help actions" + +gdb_test "help collect" \ + "Specify one or more data items to be collected at a tracepoint.*" \ + "5.8b: help collect" + +gdb_test "help while-stepping" \ + "Specify single-stepping behavior at a tracepoint.*" \ + "5.8c: help while-stepping" + +gdb_test "help end" "Ends a list of commands or actions.*" \ + "5.8d: help end" + +# 5.9 default-collect + +gdb_test "set default-collect gdb_char_test, gdb_long_test - 100" \ + "" \ + "5.9a: set default-collect" + +gdb_test "show default-collect" \ + "The list of expressions to collect by default is \"gdb_char_test, gdb_long_test - 100\"..*" \ + "5.9b: show default-collect" + +# 5.10 teval + +gdb_test "tvariable \$tsv" \ + "Trace state variable \\\$tsv created, with initial value 0." \ + "Create a trace state variable" + +gdb_trace_setactions "5.10a: set teval action for first tracepoint" \ + "$trcpt1" \ + "teval gdb_char_test" "^$" + +gdb_trace_setactions "5.10a: set teval action for second tracepoint" \ + "$trcpt2" \ + "teval \$tsv += 1" "^$" + +gdb_test "info tracepoints" \ + "Num Type\[ \]+Disp Enb Address\[ \]+What.* +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_c_test at .*$srcfile:\[0-9\]+. +\[\t \]+A\[\t \]+teval gdb_char_test. +\[\t \]+A\[\t \]+end. +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_asm_test at .*$srcfile:\[0-9\]+. +\[\t \]+A\[\t \]+teval \\\$tsv \\\+= 1. +\[\t \]+A\[\t \]+end. +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_recursion_test at .*$srcfile:\[0-9\]+. +\[\t \]+A\[\t \]+collect gdb_long_test. +\[\t \]+A\[\t \]+end." \ + "5.10a: verify teval actions set for two tracepoints" + Index: limits.exp =================================================================== --- limits.exp (nonexistent) +++ limits.exp (revision 842) @@ -0,0 +1,308 @@ +# Copyright 1998, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +load_lib "trace-support.exp" + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +set testfile "limits" +set srcfile ${testfile}.c +set binfile $objdir/$subdir/$testfile + +if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \ + executable {debug nowarnings}] != "" } { + untested limits.exp + return -1 +} + +# Tests: +# 1) Meet and exceed artificial limit on number of tracepoints +# 2) Meet and exceed artificial limit on number of memranges +# 3) Meet and exceed artificial limit on bytes of bytecode data +# [NOTE: number four is moved out into its own separate test module.] +# 4) Meet and exceed artificial limit on bytes of trace buffer storage +# (circular and non-circular modes). However note that a more +# thorough test of the circular mode can be made separately. + +set cr "\[\r\n\]+" + +proc gdb_tracepoint_limit_test { } { + global gdb_prompt + global cr + + # Make sure we're in a sane starting state. + gdb_test "tstop" "" "" + gdb_test "tfind none" "" "" + gdb_delete_tracepoints + + # Set three tracepoints + gdb_test "trace foo" \ + "Tracepoint \[0-9\]+ at .*" \ + "tracepoint limit test: set first tracepoint" + + gdb_test "trace bar" \ + "Tracepoint \[0-9\]+ at .*" \ + "tracepoint limit test: set second tracepoint" + + gdb_test "trace baz" \ + "Tracepoint \[0-9\]+ at .*" \ + "tracepoint limit test: set third tracepoint" + + # Set secret artificial tracepoint limit to four + gdb_test "maint packet QTLimit:tp:4" \ + "received: .OK." \ + "tracepoint limit test: set limit to four" + + # Now sending three tracepoints should succeed. + send_gdb "tstart\n" + gdb_expect { + -re "$cr$gdb_prompt" { + pass "tracepoint limit test: send fewer than limit" + } + default { + fail "tracepoint limit test: send fewer than limit" + } + } + + # Set secret artificial tracepoint limit to three + gdb_test "maint packet QTLimit:tp:3" \ + "received: .OK." \ + "tracepoint limit test: set limit to three" + + # Now sending three tracepoints should still succeed. + send_gdb "tstart\n" + gdb_expect { + -re "$cr$gdb_prompt" { + pass "tracepoint limit test: send equal to limit" + } + default { + fail "tracepoint limit test: send equal to limit" + } + } + + # Set secret artificial tracepoint limit to two + gdb_test "maint packet QTLimit:tp:2" \ + "received: .OK." \ + "tracepoint limit test: set limit to two" + + # Now sending three tracepoints should fail. + gdb_test "tstart" \ + ".*\[Ee\]rror.*" \ + "tracepoint limit test: send more than limit" + + # Clean up: + gdb_test "tstop" "" "" + gdb_test "maint packet QTLimit:tp:FFFFFFFF" "" "" +} + +proc gdb_memrange_limit_test { } { + global gdb_prompt + global cr + + # Make sure we're in a sane starting state. + gdb_test "tstop" "" "" + gdb_test "tfind none" "" "" + gdb_delete_tracepoints + + # Set three tracepoints, and make 'em collect memranges + gdb_test "trace foo" \ + "Tracepoint \[0-9\]+ at .*" \ + "memrange limit test: set first tracepoint" + + gdb_trace_setactions "memrange limit test: set first actions" \ + "" \ + "collect \$arg" "^$" + + gdb_test "trace bar" \ + "Tracepoint \[0-9\]+ at .*" \ + "memrange limit test: set second tracepoint" + + gdb_trace_setactions "memrange limit test: set second actions" \ + "" \ + "collect \$arg" "^$" + + gdb_test "trace baz" \ + "Tracepoint \[0-9\]+ at .*" \ + "memrange limit test: set third tracepoint" + + gdb_trace_setactions "memrange limit test: set third actions" \ + "" \ + "collect \$arg" "^$" + + # Set secret artificial memrange limit to four + gdb_test "maint packet QTLimit:memrange:4" \ + "received: .OK." \ + "memrange limit test: set limit to four" + + # Now sending three memranges should still succeed. + send_gdb "tstart\n" + gdb_expect { + -re "$cr$gdb_prompt" { + pass "memrange limit test: send fewer than limit" + } + default { + fail "memrange limit test: send fewer than limit" + } + } + + # Set secret artificial memrange limit to three + gdb_test "maint packet QTLimit:memrange:3" \ + "received: .OK." \ + "memrange limit test: set limit to three" + + # Now sending three memranges should still succeed. + send_gdb "tstart\n" + gdb_expect { + -re "$cr$gdb_prompt" { + pass "memrange limit test: send equal to limit" + } + default { + fail "memrange limit test: send equal to limit" + } + } + + # Set secret artificial memrange limit to two + gdb_test "maint packet QTLimit:memrange:2" \ + "received: .OK." \ + "memrange limit test: set limit to two" + + # Now sending three memranges should fail. + gdb_test "tstart" \ + ".*\[Ee\]rror.*" \ + "memrange limit test: send more than limit" + + # Clean up: + gdb_test "tstop" "" "" + gdb_test "maint packet QTLimit:memrange:FFFFFFFF" "" "" +} + + +proc gdb_bytecode_limit_test { } { + global gdb_prompt + global cr + + # Make sure we're in a sane starting state. + gdb_test "tstop" "" "" + gdb_test "tfind none" "" "" + gdb_delete_tracepoints + + # Set three tracepoints + gdb_test "trace foo" \ + "Tracepoint \[0-9\]+ at .*" \ + "bytecode limit test: set first tracepoint" + + gdb_trace_setactions "bytecode limit test: set first actions" \ + "" \ + "collect x + n" "^$" + + gdb_test "trace bar" \ + "Tracepoint \[0-9\]+ at .*" \ + "bytecode limit test: set second tracepoint" + + gdb_trace_setactions "bytecode limit test: set second actions" \ + "" \ + "collect y + n" "^$" + + gdb_test "trace baz" \ + "Tracepoint \[0-9\]+ at .*" \ + "bytecode limit test: set third tracepoint" + + gdb_trace_setactions "bytecode limit test: set third actions" \ + "" \ + "collect z + n" "^$" + + # Set secret artificial bytecode limit to a large number + gdb_test "maint packet QTLimit:bytecode:400" \ + "received: .OK." \ + "bytecode limit test: set limit to large" + + # Now sending three bytecodes should still succeed. + send_gdb "tstart\n" + gdb_expect { + -re "$cr$gdb_prompt" { + pass "bytecode limit test: send fewer than limit" + } + default { + fail "bytecode limit test: send fewer than limit" + } + } + + # Set secret artificial bytecode limit to a small number + gdb_test "maint packet QTLimit:bytecode:40" \ + "received: .OK." \ + "bytecode limit test: set limit to small" + + # Now sending three bytecodes should fail. + gdb_test "tstart" \ + ".*\[Ee\]rror.*" \ + "bytecode limit test: send more than limit" + + + # Clean up: + gdb_test "tstop" "" "" + gdb_test "maint packet QTLimit:bytecode:FFFFFFFF" "" "" +} + +proc gdb_trace_limits_tests { } { + global gdb_prompt + + # We generously give ourselves one "pass" if we successfully + # detect that this test cannot be run on this target! + + if { ![gdb_target_supports_trace] } then { + pass "Current target does not support trace" + return 1; + } + + if [gdb_test "maint packet QTLimit:tp:ffffffff" \ + "received: .OK." ""] then { + pass "This test cannot be run on this target" + return 1; + } + + if [gdb_test "maint packet QTLimit:memrange:ffffffff" \ + "received: .OK." ""] then { + pass "This test cannot be run on this target" + return 1; + } + + if [gdb_test "maint packet QTLimit:bytecode:ffffffff" \ + "received: .OK." ""] then { + pass "This test cannot be run on this target" + return; + } + + gdb_tracepoint_limit_test + gdb_memrange_limit_test + gdb_bytecode_limit_test +} + +# Start with a fresh gdb. + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load $binfile + +if [target_info exists gdb_stub] { + gdb_step_for_stub; +} +# Body of test encased in a proc so we can return prematurely. +gdb_trace_limits_tests Index: passc-dyn.exp =================================================================== --- passc-dyn.exp (nonexistent) +++ passc-dyn.exp (revision 842) @@ -0,0 +1,150 @@ +# Copyright 1998, 2005, 2007, 2008, 2009, 2010 +# Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# This file was written by Michael Snyder (msnyder@cygnus.com) + +load_lib "trace-support.exp"; + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +gdb_exit +gdb_start +set testfile "actions" +set srcfile ${testfile}.c +set binfile $objdir/$subdir/passc-dyn +if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \ + executable {debug nowarnings}] != "" } { + untested passc-dyn.exp + return -1 +} +gdb_load $binfile +gdb_test "tstop" "" "" +gdb_test "tfind none" "" "" +runto_main +gdb_reinitialize_dir $srcdir/$subdir + +# We generously give ourselves one "pass" if we successfully +# detect that this test cannot be run on this target! +if { ![gdb_target_supports_trace] } then { + pass "Current target does not support trace" + return 1; + +} + +# If testing on a remote host, download the source file. +# remote_download host $srcdir/$subdir/$srcfile + + +# +# test passcount dynamically (live target) +# + +set baseline [gdb_find_recursion_test_baseline $srcfile]; + +if { $baseline == -1 } then { + fail "Could not find gdb_recursion_test function" + return; +} + +# define relative source line numbers: +# all subsequent line numbers are relative to this first one (baseline) + +set testline2 [expr $baseline + 4] +set testline3 [expr $baseline + 5] +set testline4 [expr $baseline + 6] + +# +# test passcount command semantics (live test) +# + +## Set three tracepoints with three different passcounts. +## Verify that the experiment stops after the one with the +## lowest passcount is hit. + +gdb_delete_tracepoints +set tdp2 [gdb_gettpnum "$testline2"] +set tdp3 [gdb_gettpnum "$testline3"] +set tdp4 [gdb_gettpnum "$testline4"] +if { $tdp2 <= 0 || $tdp3 <= 0 || $tdp4 <= 0 } then { + fail "setting tracepoints" + return; +} + +gdb_test "passcount 4 $tdp2" "Setting tracepoint $tdp2's passcount to 4" \ + "4.5: set passcount for tracepoint $tdp2" +gdb_test "passcount 2 $tdp3" "Setting tracepoint $tdp3's passcount to 2" \ + "4.5: set passcount for tracepoint $tdp3" +gdb_test "passcount 3 $tdp4" "Setting tracepoint $tdp4's passcount to 3" \ + "4.5: set passcount for tracepoint $tdp4" + +gdb_test "tstart" "" "" + +gdb_test "break end" "" "" +gdb_test "continue" \ + "Continuing.*Breakpoint $decimal, end.*" \ + "run trace experiment" +gdb_test "tstop" "" "" + +gdb_test "tfind none" "" "" +if [gdb_test "printf \"x \%d x\\n\", \$trace_frame" "x -1 x" ""] { + untested passc-dyn.exp + return -1 +} + +gdb_test "tfind tracepoint $tdp2" "" "" +if [gdb_test "printf \"x \%d x\\n\", \$trace_frame" "x 0 x" ""] { + untested passc-dyn.exp + return -1 +} + +gdb_test "tfind tracepoint $tdp3" "" "" +if [gdb_test "printf \"x \%d x\\n\", \$trace_frame" "x 1 x" ""] { + untested passc-dyn.exp + return -1 +} + +gdb_test "tfind tracepoint $tdp4" "" "" +if [gdb_test "printf \"x \%d x\\n\", \$trace_frame" "x 2 x" ""] { + untested passc-dyn.exp + return -1 +} + +gdb_test "tfind tracepoint $tdp2" "" "" +if [gdb_test "printf \"x \%d x\\n\", \$trace_frame" "x 3 x" ""] { + untested passc-dyn.exp + return -1 +} + +gdb_test "tfind tracepoint $tdp3" "" "" +if [gdb_test "printf \"x \%d x\\n\", \$trace_frame" "x 4 x" ""] { + untested passc-dyn.exp + return -1 +} + +## We should now be at the last frame, because this frame's passcount +## should have caused collection to stop. If we do a tfind now, +## it should fail. + +gdb_test "tfind" "failed to find.*" "4.5: dynamic passcount test" + +# Finished! +gdb_test "tfind none" "" "" + Index: tfile.exp =================================================================== --- tfile.exp (nonexistent) +++ tfile.exp (revision 842) @@ -0,0 +1,89 @@ +# Copyright 2010 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Test of trace file support. + +# Note that unlike most of the tracing tests, this can be run on +# targets lacking tracepoint support; the program tfile.c has the +# ability to generate synthetic trace files directly, and the tfile +# target is available to all GDB configs. + +load_lib "trace-support.exp"; + +if [target_info exists gdb,nofileio] { + verbose "Skipping tfile.exp because of no fileio capabilities." + continue +} + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +gdb_exit +gdb_start +set testfile "tfile" +set srcfile ${testfile}.c +set binfile $objdir/$subdir/$testfile +if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \ + executable {debug nowarnings}] != "" } { + untested file.exp + return -1 +} +gdb_reinitialize_dir $srcdir/$subdir + +# Make sure we are starting fresh. +remote_exec build {sh -xc rm\ -f\ basic.tf} + +gdb_load $binfile + +runto_main + +gdb_test "break done_making_trace_files" "" "" + +gdb_test "continue" "" "" + +# tsave command would be tested here... + +gdb_test "continue" "" "" + +# Program has presumably exited, now target a trace file it created. + +gdb_test "target tfile basic.tf" "Created tracepoint.*" "target tfile" + +gdb_test "info trace" ".*tracepoint.*in write_basic_trace_file.*" \ + "info tracepoints on trace file" + +gdb_test "tfind 0" "Found traceframe 0.*" "tfind 0 on trace file" + +gdb_test "print testglob" " = 31415" "print testglob on trace file" + +gdb_test "tfind" "Target failed to find requested trace frame." \ + "tfind does not find a second frame in trace file" + +gdb_test "tstatus" \ + "Using a trace file.* +Trace stopped by a tstop command.* +Collected 1 trace frames.* +Trace buffer has 256 bytes free.* +Looking at trace frame 0, tracepoint .*" \ + "tstatus on trace file" + + + + + Index: tfind.exp =================================================================== --- tfind.exp (nonexistent) +++ tfind.exp (revision 842) @@ -0,0 +1,376 @@ +# Copyright 1998, 2002, 2005, 2007, 2008, 2009, 2010 +# Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# This file was written by Michael Snyder (msnyder@cygnus.com) + +load_lib "trace-support.exp"; + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +gdb_exit +gdb_start + +set testfile "actions" +set srcfile ${testfile}.c +set binfile $objdir/$subdir/tfind + +if { [gdb_compile "$srcdir/$subdir/$srcfile" "$binfile" \ + executable {debug nowarnings}] != "" } { + untested tfind.exp + return -1 +} +gdb_load $binfile +gdb_test "tstop" "" "" +gdb_test "tfind none" "" "" +runto_main +gdb_reinitialize_dir $srcdir/$subdir + +# We generously give ourselves one "pass" if we successfully +# detect that this test cannot be run on this target! +if { ![gdb_target_supports_trace] } then { + pass "Current target does not support trace" + return 1; + +} + +# If testing on a remote host, download the source file. +# remote_download host $srcdir/$subdir/$srcfile + +# 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 + 1] +set testline2 [expr $baseline + 5] +set testline3 [expr $baseline + 6] +set testline4 [expr $baseline + 7] +set testline5 [expr $baseline + 8] + +# +# test tfind command +# + +gdb_delete_tracepoints +set tdp1 [gdb_gettpnum "\*gdb_recursion_test"] +set tdp2 [gdb_gettpnum $testline2] +set tdp3 [gdb_gettpnum $testline3] +set tdp4 [gdb_gettpnum $testline4] +set tdp5 [gdb_gettpnum $testline5] +if { $tdp1 <= 0 || $tdp2 <= 0 || $tdp3 <= 0 || \ + $tdp4 <= 0 || $tdp5 <= 0 } then { + fail "setting tracepoints" + return; +} + +# 6.1 test tstart command +send_gdb "tstart\n" +gdb_expect { + -re "Trace can only be run on remote targets.*$gdb_prompt $" { + fail "6.1: tstart (not connected to remote?)" + return; + } + -re "Target does not support this command.*$gdb_prompt $" { + fail "6.1: tstart (connected to wrong target?)" + return; + } + -re "Target returns error code.*$gdb_prompt $" { + fail "6.1: tstart (connected to wrong target?)" + return; + } + -re "$gdb_prompt $" { + pass "6.1: tstart" + } + default { + fail "6.1: tstart (default)" + return; + } +} + +# test tstatus (when trace on) +gdb_test "tstatus" "\[Tt\]race is running.*" "test tstatus on" + +# 6.2 test help tstart +gdb_test "help tstart" "Start trace data collection." "6.2: help tstart" + +gdb_test "break end" "" "" +gdb_test "continue" \ + "Continuing.*Breakpoint $decimal, end.*" \ + "run trace experiment" + +# 7.1 test tstop command +send_gdb "tstop\n" +gdb_expect { + -re "Trace can only be run on remote targets.*$gdb_prompt $" { + fail "7.1: tstop (not connected to remote?)" + return; + } + -re "Target does not support this command.*$gdb_prompt $" { + fail "7.1: tstop (connected to wrong target?)" + return; + } + -re "Target returns error code.*$gdb_prompt $" { + fail "7.1: tstop (connected to wrong target?)" + return; + } + -re "$gdb_prompt $" { + pass "7.1: tstop" + } + default { + fail "7.1: tstop (default)" + return; + } +} + +# 7.2 test help tstop +gdb_test "help tstop" "Stop trace data collection." "7.2: help tstop" + +# test tstatus (when trace off) +gdb_test "tstatus" "\[Tt\]race.* not running.*" "test tstatus off" + +## record starting PC +set save_pc [gdb_readexpr "(unsigned long) \$pc"]; +if { $save_pc == -1 } then { + fail "could not read PC" + return; +} + +# 8.7 tfind start +## check $trace_frame == 0 +gdb_tfind_test "8.7: tfind start command" "start" "0"; +## check $pc != startPC +gdb_test "printf \"x \%d x\\n\", \$pc != $save_pc" \ + "x 1 x" \ + "8.7b: tfind start" + +# 8.8 tfind none +## check $trace_frame == -1 +gdb_tfind_test "8.8: tfind none" "none" "-1"; +## check $pc == startPC +gdb_test "printf \"x \%d x\\n\", \$pc == $save_pc" \ + "x 1 x" \ + "8.8b: tfind none (restores non-trace PC)" + +# 8.9 tfind end +## check $trace_frame == -1 +gdb_tfind_test "8.9: tfind end, selects no frame" "end" "-1"; +## check $pc == startPC +gdb_test "printf \"x \%d x\\n\", \$pc == $save_pc" \ + "x 1 x" \ + "8.9b: tfind end (restores non-tracing PC)" + +# 8.1 tfind n +## check $trace_frame == n +gdb_tfind_test "8.1: tfind 1" "1" "1" +## check $trace_line corresponds to tracepoint for frame n +gdb_test "print \$trace_line" "$testline2" "8.1b: tfind 1 (correct line)" + +# 8.28 tfind invalid n (big number) +## check "not found" error +## check $trace_frame != n +gdb_test "tfind 32767" \ + "failed to find.*" \ + "8.28: tfind command rejects invalid frame number" + +gdb_test "printf \"x \%d x\\n\", \$trace_frame == 32767" \ + "x 0 x" \ + "8.28: tfind rejected bad input (32767)" + +# 8.31 tfind negative n +## check error +gdb_test "tfind -3" "invalid input.*" "8.31: tfind rejects negative input" +## check $trace_frame != -n +gdb_test "printf \"x \%d x\\n\", \$trace_frame == -3" "x 0 x" \ + "8.31: tfind rejected negative input (-3)" + +# 8.10 tfind +## check $trace_frame += 1 + +gdb_tfind_test "8.10: tfind start" "start" "0"; +gdb_test "print \$trace_line" "$baseline" \ + "8.10: tfind 0 (correct line $baseline)" +gdb_tfind_test "8.10: tfind noargument 1" "" "1"; +gdb_test "print \$trace_line" "$testline2" \ + "8.10: tfind 1 (correct line $testline2)" +gdb_tfind_test "8.10: tfind noargument 2" "" "2"; +gdb_test "print \$trace_line" "$testline3" \ + "8.10: tfind 2 (correct line $testline3)" +gdb_tfind_test "8.10: tfind noargument 3" "" "3"; +gdb_test "print \$trace_line" "$testline4" \ + "8.10: tfind 3 (correct line $testline4)" + +gdb_tfind_test "8.11: tfind 3" "3" "3"; +gdb_test "print \$trace_line" "$testline4" \ + "8.11: tfind 3 (correct line $testline4)" +gdb_tfind_test "8.11: tfind backward 2" "-" "2"; +gdb_test "print \$trace_line" "$testline3" \ + "8.11: tfind 2 (correct line $testline3)" +gdb_tfind_test "8.11: tfind backward 1" "-" "1"; +gdb_test "print \$trace_line" "$testline2" \ + "8.11: tfind 1 (correct line $testline2)" +gdb_tfind_test "8.11: tfind backward 0" "-" "0"; +gdb_test "print \$trace_line" "$baseline" \ + "8.11: tfind 0 (correct line $baseline)" + +gdb_tfind_test "8.12: tfind none" "none" "-1"; +gdb_tfind_test "8.12: tfind tracepoint " "tracepoint $tdp2" \ + "\$tracepoint" "$tdp2"; +gdb_test "print \$trace_line" "$testline2" \ + "8.12: tfind tracepoint (line $testline2)" + +gdb_tfind_test "8.25: tfind none" "none" "-1"; +gdb_test "tfind tracepoint 0" "failed to find.*" \ + "8.25: tfind tracepoint rejects zero" +gdb_test "tfind tracepoint 32767" "failed to find.*" \ + "8.25: tfind tracepoint rejects nonexistant tracepoint (32767)" +gdb_test "tfind tracepoint -1" "failed to find.*" \ + "8.25: tfind tracepoint rejects nonexistant tracepoint (-1)" + +# 8.37 tfind tracepoint n where n no longer exists (but used to) +gdb_test "delete trace $tdp2" "" "" +gdb_tfind_test "8.37: tfind none" "none" "-1"; +gdb_tfind_test "8.37: tfind deleted tracepoint" \ + "tracepoint $tdp2" \ + "\$tracepoint" "$tdp2"; +gdb_test "print \$trace_line" "$testline2" \ + "8.37: tfind deleted tracepoint (line $testline2)" + +# 8.13 tfind tracepoint +## check $tracepoint same before and after, $trace_frame changed + +gdb_tfind_test "8.13: tfind none" "none" "-1"; +gdb_tfind_test "8.13: tracepoint $tdp1" "tracepoint $tdp1" \ + "\$tracepoint" "$tdp1"; +gdb_test "print \$trace_line" "$baseline" \ + "8.13: tfind tracepoint $tdp1 (line $baseline)" +gdb_test "set \$save_frame = \$trace_frame" "" "" +gdb_tfind_test "8.13: tracepoint " "tracepoint" \ + "\$tracepoint" "$tdp1"; +gdb_test "printf \"x \%d x\\n\", \$trace_frame == \$save_frame" \ + "x 0 x" \ + "8.13: tracepoint , tracepoint number unchanged" + +# 1.12 set tracepoint in prologue +# +# tdp1 was set at *gdb_recursion_test (ie. the hard address of the +# function, before the prologue). Test to see that it succeeded. +# Current pc should be equal to the address of the function. + +gdb_test "printf \"x \%d x\\n\", \$pc == gdb_recursion_test" \ + "x 1 x" \ + "1.12: set tracepoint in prologue" + +# 8.14 tfind pc x +## check pc == x, $trace_frame != -1 +gdb_tfind_test "8.14: tfind 3" "3" "3" +gdb_test "print \$trace_line" "$testline4" \ + "8.14: tfind 3 (line $testline4)" + +gdb_test "set \$test_pc = \$pc" "" "" +gdb_tfind_test "8.14: tfind none" "none" "-1" +gdb_tfind_test "8.14: tfind pc" "pc \$test_pc" "\$trace_frame != -1" "1"; +gdb_test "print \$trace_line" "$testline4" \ + "8.14: tfind pc x (line $testline4)" +gdb_test "printf \"x \%d x\\n\", \$pc == \$test_pc" \ + "x 1 x" \ + "8.14: tfind pc x" + +# 8.15 tfind pc +## check pc same before and after, $trace_frame changed +gdb_tfind_test "8.15: tfind 3" "3" "3" +gdb_test "print \$trace_line" "$testline4" \ + "8.15: tfind 3 (line $testline4)" +gdb_test "set \$test_pc = \$pc" "" "" +gdb_tfind_test "8.15: tfind pc" "pc" "\$pc == \$test_pc" "1" +gdb_test "print \$trace_line" "$testline4" \ + "8.15: tfind pc (line $testline4)" +gdb_test "printf \"x \%d x\\n\", \$trace_frame != 3" "x 1 x" \ + "8.15: trace frame didn't change" + +# 8.26 tfind pc invalid x +## check error, pc != x (trace_frame unchanged?) +gdb_tfind_test "8.26: tfind start" "start" "0" +gdb_test "tfind pc 0" "failed to find.*" "8.26: tfind pc zero" +gdb_test "tfind pc -1" "failed to find.*" "8.26: tfind pc -1" + +# 8.16 tfind line n +## check #trace_frame != -1, $trace_line == n +gdb_tfind_test "8.16: tfind none" "none" "-1" +gdb_tfind_test "8.16: tfind line $testline3" \ + "line $testline3" \ + "\$trace_line == $testline3" "1" + +# 8.17 tfind line (# 8.19, 8.20) +## check $trace_line changed, no error, pc changed, frame changed, tdp changed +gdb_tfind_test "8.17: tfind none" "none" "-1" +gdb_tfind_test "8.17: tfind line $testline3" "line $testline3" "\$trace_line == $testline3" "1" +gdb_tfind_test "8.17: tfind line " "line" "\$trace_line != $testline3" "1" + +# 8.36 tfind and disassembly +gdb_tfind_test "8.36: tfind start" "start" "0" +set timeout 60 +send_gdb "disassemble gdb_c_test\n" +# look for disassembly of function label +gdb_expect { + -re ":.*$gdb_prompt $" { pass "8.36: trace disassembly" } + -re ".*$gdb_prompt $" { fail "8.36: trace disassembly" } + timeout { fail "8.36: trace disassembly (timeout)" } +} + +gdb_test "tfind line 0" \ + "out of range.*|failed to find.*" \ + "8.18: tfind line 0"; +gdb_test "tfind line 32767" \ + "out of range.*|failed to find.*" \ + "8.27: tfind line 32767"; +gdb_test "tfind line NoSuChFiLe.c:$baseline" \ + "No source file named.*" \ + "8.27: tfind line in bad source file"; + +# 8.32 tfind invalid subcommand (tfind foo) +## check error +gdb_test "tfind NoSuChOpTiOn 21" \ + "No symbol.*|\[Ww\]arning.*|\[Ee\]rror.*" \ + "8.32: tfind with bad subcommand" + +# 8.38 test help tfind +gdb_test "help tfind" "Select a trace frame.*" \ + "8.38: help tfind" +gdb_test "help tfind pc" "Select a trace frame by PC.*" \ + "8.38: help tfind PC" +gdb_test "help tfind end" "Synonym for 'none'.*" \ + "8.38: help tfind end" +gdb_test "help tfind none" "De-select any trace frame.*" \ + "8.38: help tfind none" +gdb_test "help tfind line" "Select a trace frame by source line.*" \ + "8.38: help tfind line" +gdb_test "help tfind start" "Select the first trace frame.*" \ + "8.38: help tfind start" +gdb_test "help tfind range" "Select a trace frame whose PC is in.*" \ + "8.38: help tfind range" +gdb_test "help tfind trace" "Select a trace frame by tracepoint number.*" \ + "8.38: help tfind tracepoint" + +# Finished! +gdb_tfind_test "8.17: tfind none" "none" "-1" Index: circ.c =================================================================== --- circ.c (nonexistent) +++ circ.c (revision 842) @@ -0,0 +1,90 @@ +/* + * Test program for tracing; circular buffer + */ + +int n = 6; + +int testload[13]; + +static void func0(void) +{ +} + +static void func1(void) +{ +} + +static void func2(void) +{ +} + +static void func3(void) +{ +} + +static void func4(void) +{ +} + +static void func5(void) +{ +} + +static void func6(void) +{ +} + +static void func7(void) +{ +} + +static void func8(void) +{ +} + +static void func9(void) +{ +} + +static void begin () /* called before anything else */ +{ +} + +static void end () /* called after everything else */ +{ +} + +int +main (argc, argv, envp) + int argc; + char *argv[], **envp; +{ + int i; + +#ifdef usestubs + set_debug_traps (); + breakpoint (); +#endif + + begin (); + for (i = 0; i < sizeof(testload) / sizeof(testload[0]); i++) + testload[i] = i + 1; + + func0 (); + func1 (); + func2 (); + func3 (); + func4 (); + func5(); + func6 (); + func7 (); + func8 (); + func9 (); + + end (); + +#ifdef usestubs + breakpoint (); +#endif + return 0; +}
circ.c Property changes : Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +Id \ No newline at end of property Index: packetlen.exp =================================================================== --- packetlen.exp (nonexistent) +++ packetlen.exp (revision 842) @@ -0,0 +1,72 @@ +# Copyright 1998, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# This file was written by Michael Snyder (msnyder@cygnus.com) + +load_lib "trace-support.exp" + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +gdb_exit +gdb_start + +set testfile "actions" +set srcfile ${testfile}.c +set binfile $objdir/$subdir/packetlen +if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \ + executable {debug nowarnings}] != "" } { + untested packetlen.exp + return -1 +} +gdb_load $binfile +gdb_test "tstop" "" "" +gdb_test "tfind none" "" "" +runto_main +gdb_reinitialize_dir $srcdir/$subdir + +# If testing on a remote host, download the source file. +# remote_download host $srcdir/$subdir/$srcfile + +# +# Test collecting a whole bunch of stuff at a single tracepoint. +# The test is whether this crashes GDB. +# + +gdb_delete_tracepoints +gdb_test "trace gdb_c_test" "" "" +gdb_trace_setactions "setup collect actions" \ + "" \ + "collect parm\[0\], parm\[1\], parm\[2\], parm\[3\]" "^$" \ + "collect parm\[4\], parm\[5\], parm\[6\], parm\[7\]" "^$" \ + "collect p, local_reg, local_static, local_static_sizeof" "^$" \ + "collect local_long, stack_ptr, end_of_stack" "^$" \ + "collect gdb_char_test, gdb_short_test, gdb_long_test" "^$" \ + "collect gdb_arr_test, gdb_struct1_test, gdb_struct2_test" "^$" \ + "collect gdb_structp_test, gdb_structpp_test, gdb_union1_test" "^$" \ + "end" "" + +gdb_test "tstart" "" "survive the long packet send" +gdb_test "break end" "" "" +gdb_test "continue" \ + "Continuing.*Breakpoint $decimal, end.*" \ + "run trace experiment" + +gdb_test "tstop" "" "confirm: survived the long packet send" + Index: infotrace.exp =================================================================== --- infotrace.exp (nonexistent) +++ infotrace.exp (revision 842) @@ -0,0 +1,95 @@ +# Copyright 1998, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# This file was written by Michael Snyder (msnyder@cygnus.com) + +load_lib "trace-support.exp"; + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +gdb_exit +gdb_start + +set testfile "actions" +set srcfile ${testfile}.c +set binfile $objdir/$subdir/infotrace +if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \ + executable {debug nowarnings}] != "" } { + untested infotrace.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 + +# +# test "info tracepoints" command +# + +gdb_delete_tracepoints +set c_test_num [gdb_gettpnum gdb_c_test]; +set asm_test_num [gdb_gettpnum gdb_asm_test]; +if { $c_test_num <= 0 || $asm_test_num <= 0 } then { + fail "setting tracepoints" + return; +} + +# 2.1 info tracepoints (all) +gdb_test "info tracepoints" \ + "Num Type\[ \]+Disp Enb Address\[ \]+What.* +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_c_test at .*$srcfile:\[0-9\]+. +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_asm_test at .*$srcfile:\[0-9\]+." \ + "2.1: info tracepoints (all)" + +# 2.2 info tracepoint (specific) +gdb_test "info tracepoint $c_test_num" \ + "Num Type\[ \]+Disp Enb Address\[ \]+What.* +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_c_test at .*$srcfile:\[0-9\]+." \ + "2.2a: info tracepoint $c_test_num (gdb_c_test)" + +gdb_test "info tracepoint $asm_test_num" \ + "Num Type\[ \]+Disp Enb Address\[ \]+What.* +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_asm_test at .*$srcfile:\[0-9\]+." \ + "2.2b: info tracepoint $asm_test_num (gdb_asm_test)" + +# 2.3 info tracepoint (invalid tracepoint number) +gdb_test "info tracepoint [expr $c_test_num + $asm_test_num]" \ + "No breakpoint or watchpoint number [expr $c_test_num + $asm_test_num]." \ + "2.3: info tracepoint (invalid tracepoint number)" + +# 2.4 info tracepoints (list of numbers) +send_gdb "info tracepoints $c_test_num $asm_test_num \n" +gdb_expect { + -re "Num Enb .*$gdb_prompt $" { + fail "2.4: info trace rejects multiple tracepoint numbers" + } + -re ".*$gdb_prompt $" { + pass "2.4: info trace rejects multiple tracepoint numbers" + } +} + +# 2.5 help info trace +gdb_test "help info tracepoints" \ + "Status of tracepoints, or tracepoint number NUMBER.*" \ + "2.5: help info tracepoints" + Index: report.exp =================================================================== --- report.exp (nonexistent) +++ report.exp (revision 842) @@ -0,0 +1,394 @@ +# Copyright 1998, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# This file was written by Michael Snyder (msnyder@cygnus.com) + +load_lib "trace-support.exp"; + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +gdb_exit +gdb_start + +set testfile "actions" +set srcfile ${testfile}.c +set binfile $objdir/$subdir/report +if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \ + executable {debug nowarnings}] != "" } { + untested report.exp + return -1 +} +gdb_load $binfile +gdb_test "tstop" "" "" +gdb_test "tfind none" "" "" +runto_main +gdb_reinitialize_dir $srcdir/$subdir + +# We generously give ourselves one "pass" if we successfully +# detect that this test cannot be run on this target! +if { ![gdb_target_supports_trace] } then { + pass "Current target does not support trace" + return 1; + +} + +set cr "\[\r\n\]+" + +# If testing on a remote host, download the source file. +# remote_download host $srcdir/$subdir/$srcfile + +# +# test general reporting of trace experiment results +# + +set testline1 0 +set testline2 0 +set testline3 0 +set testline4 0 +set testline5 0 +set testline6 0 + +set arg1 1 +set arg2 2 +set arg3 3 +set arg4 4 +set arg5 5 +set arg6 6 + +set gdb_recursion_test_baseline [gdb_find_recursion_test_baseline $srcfile]; +if { $gdb_recursion_test_baseline == -1 } { + fail "Could not find gdb_recursion_test function" + return; +} + +send_gdb "list $gdb_recursion_test_baseline, +12\n" +gdb_expect { + -re "\[\r\n\](\[0-9\]+)\[^\r\n\]+gdbtestline 1 " { + set testline1 $expect_out(1,string) + exp_continue + } + -re "\[\r\n\](\[0-9\]+)\[^\r\n\]+gdbtestline 2 " { + set testline2 $expect_out(1,string) + exp_continue + } + -re "\[\r\n\](\[0-9\]+)\[^\r\n\]+gdbtestline 3 " { + set testline3 $expect_out(1,string) + exp_continue + } + -re "\[\r\n\](\[0-9\]+)\[^\r\n\]+gdbtestline 4 " { + set testline4 $expect_out(1,string) + exp_continue + } + -re "\[\r\n\](\[0-9\]+)\[^\r\n\]+gdbtestline 5 " { + set testline5 $expect_out(1,string) + exp_continue + } + -re "\[\r\n\](\[0-9\]+)\[^\r\n\]+gdbtestline 6 " { + set testline6 $expect_out(1,string) + exp_continue + } + -re ".*$gdb_prompt $" { + if { ($testline1 == 0) || ($testline2 == 0) || ($testline3 == 0) || ($testline4 == 0) || ($testline5 == 0) || ($testline6 == 0) } { + untested report.exp + return -1 +all tests in this module will fail." + } + } + default { + untested report.exp + return -1 +all tests in this module will fail." + } +} + +# +# Setup trace experiment. This will involve: +# 1) a tracepoint where nothing is collected +# 2) a tracepoint where only regs are collected +# 3) a tracepoint where only args are collected +# 4) a tracepoint where only locals are collected +# 5) a tracepoint where some amount of stack memory is collected. +# 6) a tracepoint where some expressions are collected. +# + +gdb_delete_tracepoints +set tdp1 [gdb_gettpnum $testline1] +set tdp2 [gdb_gettpnum $testline2] +set tdp3 [gdb_gettpnum $testline3] +set tdp4 [gdb_gettpnum $testline4] +set tdp5 [gdb_gettpnum $testline5] +set tdp6 [gdb_gettpnum $testline6] + +if { $tdp1 <= 0 || $tdp2 <= 0 || $tdp3 <= 0 || \ + $tdp4 <= 0 || $tdp5 <= 0 || $tdp6 <= 0 } then { + fail "setting tracepoints failed" + return; +} + +gdb_trace_setactions "9.x: setup TP to collect regs" \ + "$tdp2" \ + "collect \$regs" "^$" + + +gdb_trace_setactions "9.x: setup TP to collect args" \ + "$tdp3" \ + "collect \$args" "^$" + +gdb_trace_setactions "9.x: setup TP to collect locals" \ + "$tdp4" \ + "collect \$locs" "^$" + +gdb_trace_setactions "9.x: setup TP to collect stack memory" \ + "$tdp5" \ + "collect \$fp, \*\(void \*\*\) \$sp @ 64" "^$" + +gdb_trace_setactions "9.x: setup TP to collect expressions" \ + "$tdp6" \ + "collect gdb_char_test, gdb_short_test, gdb_long_test" "^$" + +gdb_test "tstart" "" "" + +gdb_test "break end" "" "" +gdb_test "continue" \ + "Continuing.*Breakpoint $decimal, end.*" \ + "run trace experiment" + +gdb_test "tstop" "" "" + +# +# 9.1 test the tdump command +# + +set timeout 60 + +gdb_tfind_test "9.1: init: make sure not debugging any trace frame" "none" "-1" + +gdb_tfind_test "9.1: find frame for TP $tdp1" "tracepoint $tdp1" \ + "\$tracepoint" "$tdp1" + +# Nothing was collected at tdp1, so this tdump should be empty. +gdb_test "tdump" \ + "Data collected at tracepoint $tdp1, trace frame $decimal:" \ + "9.1: tdump, nothing collected" + +gdb_tfind_test "9.1: find frame for TP $tdp2" "tracepoint $tdp2" \ + "\$tracepoint" "$tdp2" + +# regs were collected at tdp2. +# How to match for the output of "info registers" on an unknown architecture? +# For now, assume that every architecture has a register called "pc". +gdb_test "tdump" \ + "\[\r\n\]pc .*" \ + "9.1: tdump, regs collected" + +gdb_tfind_test "9.1: find frame for TP $tdp3" "tracepoint $tdp3" \ + "\$tracepoint" "$tdp3" + +# args were collected at tdp3 +gdb_test "tdump" \ + "depth = 3.*q1 = 2.*q2 = 2.*q3 = 3.*q4 = 4.*q5 = 5.*q6 = 6" \ + "9.1: tdump, args collected" + +gdb_tfind_test "9.1: find frame for TP $tdp4" "tracepoint $tdp4" \ + "\$tracepoint" "$tdp4" + +# locals were collected at tdp4 +gdb_test "tdump" \ + "q = 1" \ + "9.1: tdump, locals collected" + +gdb_tfind_test "9.1: find frame for TP $tdp5" "tracepoint $tdp5" \ + "\$tracepoint" "$tdp5" + +# stack was collected at tdp5, plus the frame pointer +gdb_test "tdump" \ + ".fp = .*sp @ 64 = .*" \ + "9.1: tdump, memrange collected" + +gdb_tfind_test "9.1: find frame for TP $tdp6" "tracepoint $tdp6" \ + "\$tracepoint" "$tdp6" + +# globals were collected at tdp6 +gdb_test "tdump" \ + "gdb_char_test = 1.*gdb_short_test = 2.*gdb_long_test = 3" \ + "9.1: tdump, global variables collected" + +# 9.2 test tdump with arguments +# [no go, tdump doesn't have any arguments] + +# 9.3 help tdump + +gdb_test "help tdump" "Print everything collected at the current.*" \ + "9.3: help tdump" + +set linecount1 0 +set linecount2 0 +set linecount3 0 +set linecount4 0 +set linecount5 0 +set linecount6 0 + +gdb_tfind_test "11.x, 12.1: find start frame" "start" "0" + +# +# 11.x test built-in trace variables $trace_frame, $trace_line etc. +# + +gdb_test "printf \"x %d x\\n\", \$trace_frame" "x 0 x" \ + "11.1: test \$trace_frame" + +gdb_test "printf \"x %d x\\n\", \$tracepoint" "x $tdp1 x" \ + "11.2: test \$tracepoint" + +gdb_test "printf \"x %d x\\n\", \$trace_line" "x $testline1 x" \ + "11.3: test \$trace_line" + +send_gdb "print \$trace_file\n" +gdb_expect { + -re "\\$\[0-9\]+ = \"$srcfile\"\[\r\n\]+$gdb_prompt $" { + pass "11.4: test \$trace_file" + } + -re "\\$\[0-9\]+ = \"$srcdir/$subdir/$srcfile\"\[\r\n\]+$gdb_prompt $" { + pass "11.4: test \$trace_file" + } + -re "$gdb_prompt $" { + fail "11.4: test \$trace_file" + } + timeout { + fail "11.4: test \$trace_file (timeout)" + } +} + +#gdb_test "print \$trace_file" "\"$srcdir/$subdir/$srcfile\"" \ +# "11.4: test \$trace_file" + +# +# 12.x test report generation using arbitrary GDB commands, loops etc. +# + +send_gdb "while \$trace_frame != -1\n output \$trace_file\n printf \", line \%d \(tracepoint #\%d\)\\n\", \$trace_line, \$tracepoint\n tfind\n end\n" +gdb_expect { + -re " line $testline1 .tracepoint .$tdp1" { + set linecount1 [expr $linecount1 + 1] + exp_continue + } + -re " line $testline2 .tracepoint .$tdp2" { + set linecount2 [expr $linecount2 + 1] + exp_continue + } + -re " line $testline3 .tracepoint .$tdp3" { + set linecount3 [expr $linecount3 + 1] + exp_continue + } + -re " line $testline4 .tracepoint .$tdp4" { + set linecount4 [expr $linecount4 + 1] + exp_continue + } + -re " line $testline5 .tracepoint .$tdp5" { + set linecount5 [expr $linecount5 + 1] + exp_continue + } + -re " line $testline6 .tracepoint .$tdp6" { + set linecount6 [expr $linecount6 + 1] + exp_continue + } + -re ".*$gdb_prompt $" { + if { ($linecount1 < 4) || ($linecount2 < 4) || ($linecount3 < 4) || ($linecount4 < 4) || ($linecount5 < 4) || ($linecount6 < 4) } { + fail "12.1: trace report #1" + } else { + pass "12.1: trace report #1" + } + } + timeout { + fail "12.1: trace report #1 (timeout)" + } +} + +gdb_tfind_test "12.2: find first TDP #2 frame" "tracepoint $tdp2" \ + "\$tracepoint" "$tdp2" + +set linecount2 0 + +send_gdb "while \$trace_frame != -1\n printf \"tracepoint #\%d, FP 0x\%08x, SP 0x\%08x, PC 0x%08x\\n\", \$tracepoint, \$fp, \$sp, \$pc\n tfind tracepoint\n end\n" +gdb_expect { + -re "tracepoint #$tdp2, FP $hex, SP $hex, PC $hex" { + set linecount2 [expr $linecount2 + 1] + exp_continue + } + -re ".*$gdb_prompt $" { + if { ($linecount2 < 4) } { + fail "12.2: trace report #2" + } else { + pass "12.2: trace report #2" + } + } + timeout { + fail "12.2: trace report #2 (timeout)" + } +} + +gdb_tfind_test "12.3: find first TDP #3 frame" "tracepoint $tdp3" \ + "\$tracepoint" "$tdp3" + +set linecount3 0 + +send_gdb "while \$trace_frame != -1\n printf \"TDP #\%d, frame \%d: depth = \%d, q1 = \%d\\n\", \$tracepoint, \$trace_frame, depth, q1\n tfind tracepoint\n end\n" +gdb_expect { + -re "TDP #$tdp3, frame $decimal: depth = $decimal, q1 = $decimal" { + set linecount3 [expr $linecount3 + 1] + exp_continue + } + -re ".*$gdb_prompt $" { + if { ($linecount3 < 4) } { + fail "12.3: trace report #3" + } else { + pass "12.3: trace report #3" + } + } + timeout { + fail "12.3: trace report #3 (timeout)" + } +} + +gdb_tfind_test "12.4: find first TDP #6 frame" "tracepoint $tdp6" \ + "\$tracepoint" "$tdp6" + +set linecount6 0 + +send_gdb "while \$trace_frame != -1\n printf \"TDP #\%d, frame %d: char_test = \%d, long_test = \%d\\n\", \$tracepoint, \$trace_frame, gdb_char_test, gdb_long_test\n tfind tracepoint\n end\n" +gdb_expect { + -re "TDP #$tdp6, frame $decimal: char_test = $arg1, long_test = $arg3" { + set linecount6 [expr $linecount6 + 1] + exp_continue + } + -re ".*$gdb_prompt $" { + if { ($linecount6 < 4) } { + fail "12.4: trace report #4" + } else { + pass "12.4: trace report #4" + } + } + timeout { + fail "12.4: trace report #4 (timeout)" + } +} + +# Finished! +gdb_tfind_test "finished: make sure not debugging any trace frame" "none" "-1" Index: tsv.exp =================================================================== --- tsv.exp (nonexistent) +++ tsv.exp (revision 842) @@ -0,0 +1,107 @@ +# Copyright 2009, 2010 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +load_lib "trace-support.exp"; + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +gdb_exit +gdb_start +set testfile "actions" +set srcfile ${testfile}.c +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." \ + "Create a trace state variable" + +gdb_test "tvariable \$tvar2 = 45" \ + "Trace state variable \\\$tvar2 created, with initial value 45." \ + "Create a trace state variable with initial value" + +gdb_test "tvariable \$tvar2 = -92" \ + "Trace state variable \\\$tvar2 now has initial value -92." \ + "Change initial value of a trace state variable" + +gdb_test "tvariable \$tvar3 = 2 + 3" \ + "Trace state variable \\\$tvar3 created, with initial value 5." \ + "Create a trace state variable with expression" + +gdb_test "tvariable \$tvar3 = 1234567000000" \ + "Trace state variable \\\$tvar3 now has initial value 1234567000000." \ + "Init trace state variable to a 64-bit value" + +gdb_test "tvariable main" \ + "Syntax must be \\\$NAME \\\[ = EXPR \\\]" \ + "tvariable syntax error, bad name" + +gdb_test "tvariable \$tvar1 - 93" \ + "Syntax must be \\\$NAME \\\[ = EXPR \\\]" \ + "tvariable syntax error, not an assignment" + +gdb_test "info tvariables" \ + "Name\[\t \]+Initial\[\t \]+Current.* +\\\$tvar1\[\t \]+0\[\t \]+.* +\\\$tvar2\[\t \]+-92\[\t \]+.* +\\\$tvar3\[\t \]+1234567000000\[\t \]+.*.*" \ + "List tvariables" + +gdb_test "delete tvariable \$tvar2" \ + "" \ + "delete trace state variable" + +gdb_test "info tvariables" \ + "Name\[\t \]+Initial\[\t \]+Current.* +\\\$tvar1\[\t \]+0\[\t \]+.* +\\\$tvar3\[\t \]+1234567000000\[\t \]+.*.*" \ + "List tvariables after deletion" + +send_gdb "delete tvariable\n" +gdb_expect 30 { + -re "Delete all trace state variables.*y or n.*$" { + send_gdb "y\n" + gdb_expect 30 { + -re "$gdb_prompt $" { + pass "Delete all trace state variables" + } + timeout { fail "Delete all trace state variables (timeout)" } + } + } + -re "$gdb_prompt $" { # This happens if there were no variables + } + timeout { perror "Delete all trace state variables (timeout)" ; return } +} + +gdb_test "info tvariables" \ + "No trace state variables.*" \ + "List tvariables after deleting all" + + Index: passcount.exp =================================================================== --- passcount.exp (nonexistent) +++ passcount.exp (revision 842) @@ -0,0 +1,222 @@ +# Copyright 1998, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# This file was written by Michael Snyder (msnyder@cygnus.com) + +load_lib "trace-support.exp"; + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +gdb_exit +gdb_start +set testfile "actions" +set srcfile ${testfile}.c +set binfile $objdir/$subdir/passcount +if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \ + executable {debug nowarnings}] != "" } { + untested passcount.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 + +# 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 + 3] + +# +# test "passcount" command +# + +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; +} + +# 4.1 passcount of specified tracepoint + +gdb_test "info tracepoints" \ + "Num Type\[ \]+Disp Enb Address\[ \]+What.* +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_c_test at .*$srcfile:\[0-9\]+. +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_asm_test at .*$srcfile:\[0-9\]+. +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_recursion_test at .*$srcfile:\[0-9\]+" \ + "4.1a: set three tracepoints, passcounts all zero" + +gdb_test "passcount 2 $trcpt1" \ + "Setting tracepoint $trcpt1.s passcount to 2" \ + "4.1b: set 1st tracepoint's passcount to two" + +gdb_test "info tracepoints" \ + "Num Type\[ \]+Disp Enb Address\[ \]+What.* +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_c_test at .*$srcfile:\[0-9\]+. +\[\t \]+pass count 2 .* +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_asm_test at .*$srcfile:\[0-9\]+. +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_recursion_test at .*$srcfile:\[0-9\]+" \ + "4.1c: verify 1st tracepoint's passcount set to two" + +gdb_test "passcount 4 $trcpt2" \ + "Setting tracepoint $trcpt2.s passcount to 4" \ + "4.1d: set 2nd tracepoint's passcount to four" + +gdb_test "info tracepoints" \ + "Num Type\[ \]+Disp Enb Address\[ \]+What.* +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_c_test at .*$srcfile:\[0-9\]+. +\[\t \]+pass count 2 .* +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_asm_test at .*$srcfile:\[0-9\]+. +\[\t \]+pass count 4 .* +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_recursion_test at .*$srcfile:\[0-9\]+" \ + "4.1c: verify 2nd tracepoint's passcount set to four" + +# 4.2 passcount of last (default) tracepoint + +gdb_test "passcount 6" \ + "Setting tracepoint $trcpt3.s passcount to 6" \ + "4.2b: set last (default) tp's passcount to six" + +gdb_test "info tracepoints" \ + "Num Type\[ \]+Disp Enb Address\[ \]+What.* +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_c_test at .*$srcfile:\[0-9\]+. +\[\t \]+pass count 2 .* +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_asm_test at .*$srcfile:\[0-9\]+. +\[\t \]+pass count 4 .* +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_recursion_test at .*$srcfile:\[0-9\]+. +\[\t \]+pass count 6 .*" \ + "4.2b: verify last (default) tp's passcount set to six" + +# 4.3 run until stopped explicitly by user +# [deferred to dynamic test section] + +# 4.4 reset the previously set passcounts to new values + +gdb_test "passcount 7" \ + "Setting tracepoint $trcpt3.s passcount to 7" \ + "4.4a: reset last (default) tp's passcount to seven" + +gdb_test "info tracepoints" \ + "Num Type\[ \]+Disp Enb Address\[ \]+What.* +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_c_test at .*$srcfile:\[0-9\]+. +\[\t \]+pass count 2 .* +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_asm_test at .*$srcfile:\[0-9\]+. +\[\t \]+pass count 4 .* +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_recursion_test at .*$srcfile:\[0-9\]+. +\[\t \]+pass count 7 .*" \ + "4.4a: verify reset last (default) tp's passcount to seven" + +gdb_test "passcount 5 $trcpt2" \ + "Setting tracepoint $trcpt2.s passcount to 5" \ + "4.4b: reset second tracepoint's passcount to five" + +gdb_test "info tracepoints" \ + "Num Type\[ \]+Disp Enb Address\[ \]+What.* +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_c_test at .*$srcfile:\[0-9\]+. +\[\t \]+pass count 2 .* +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_asm_test at .*$srcfile:\[0-9\]+. +\[\t \]+pass count 5 .* +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_recursion_test at .*$srcfile:\[0-9\]+. +\[\t \]+pass count 7 .*" \ + "4.4c: verify reset second tracepoint's passcount to five" + +# 4.20 passcount for "all" + +gdb_test "passcount 3 all" \ + ".*$trcpt1.s pass.* 3.*$trcpt2.s pass.* 3.*$trcpt3.s pass.* 3" \ + "4.20a: set all three passcounts to three" + +gdb_test "info tracepoints" \ + "Num Type\[ \]+Disp Enb Address\[ \]+What.* +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_c_test at .*$srcfile:\[0-9\]+. +\[\t \]+pass count 3 .* +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_asm_test at .*$srcfile:\[0-9\]+. +\[\t \]+pass count 3 .* +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_recursion_test at .*$srcfile:\[0-9\]+. +\[\t \]+pass count 3 .*" \ + "4.20a: set all three passcounts to three" + +gdb_test "passcount 4 all" \ + ".*$trcpt1.s pass.* 4.*$trcpt2.s pass.* 4.*$trcpt3.s pass.* 4" \ + "4.20a: reset all three passcounts to four" + +gdb_test "info tracepoints" \ + "Num Type\[ \]+Disp Enb Address\[ \]+What.* +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_c_test at .*$srcfile:\[0-9\]+. +\[\t \]+pass count 4 .* +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_asm_test at .*$srcfile:\[0-9\]+. +\[\t \]+pass count 4 .* +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_recursion_test at .*$srcfile:\[0-9\]+. +\[\t \]+pass count 4 .*" \ + "4.20b: reset all three passcounts to four" + +# 4.5 Verify trace stops on first "satisfied" passcount +# [deferred to dynamic test section] + +# 4.6 minimum passcount boundary condition + +gdb_test "passcount 0 $trcpt1" \ + "Setting tracepoint $trcpt1.s passcount to 0" \ + "4.6: set passcount to zero" + +gdb_test "info tracepoints" \ + "Num Type\[ \]+Disp Enb Address\[ \]+What.* +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_c_test at .*$srcfile:\[0-9\]+. +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_asm_test at .*$srcfile:\[0-9\]+. +\[\t \]+pass count 4 .* +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_recursion_test at .*$srcfile:\[0-9\]+. +\[\t \]+pass count 4 .*" \ + "4.6: set passcount to zero" + +# 4.7 (test a very large passcount) + +gdb_test "passcount 32767 $trcpt1" \ + "Setting tracepoint $trcpt1.s passcount to 32767" \ + "4.7: set passcount to large number (32767)" + +gdb_test "info tracepoints" \ + "Num Type\[ \]+Disp Enb Address\[ \]+What.* +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_c_test at .*$srcfile:\[0-9\]+. +\[\t \]+pass count 32767 .* +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_asm_test at .*$srcfile:\[0-9\]+. +\[\t \]+pass count 4 .* +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_recursion_test at .*$srcfile:\[0-9\]+. +\[\t \]+pass count 4 .*" \ + "4.7: set passcount to large number (32767)" + +# 4.8 set passcount for invalid tracepoint + +gdb_test "passcount 1 [expr $trcpt2 + $trcpt3]" \ + "No tracepoint number [expr $trcpt2 + $trcpt3]." \ + "4.8: invalid tracepoint number in passcount" + +# 4.9 help passcount +gdb_test "help passcount" "Set the passcount for a tracepoint.*" \ + "4.9: help passcount" Index: backtrace.exp =================================================================== --- backtrace.exp (nonexistent) +++ backtrace.exp (revision 842) @@ -0,0 +1,350 @@ +# Copyright 1998, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# This file was written by Michael Snyder (msnyder@cygnus.com) + +load_lib "trace-support.exp"; + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +gdb_exit +gdb_start + +set testfile "actions" +set srcfile ${testfile}.c +set binfile $objdir/$subdir/backtrace +if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \ + executable {debug nowarnings}] != "" } { + untested backtrace.exp + return -1 +} +gdb_load $binfile +gdb_test "tstop" "" "" +gdb_test "tfind none" "" "" +runto_main +gdb_reinitialize_dir $srcdir/$subdir + +# We generously give ourselves one "pass" if we successfully +# detect that this test cannot be run on this target! +if { ![gdb_target_supports_trace] } then { + pass "Current target does not support trace" + return 1; + +} + +# +# test backtraces in trace frames +# + +set testline1 0 +set testline2 0 +set testline3 0 +set testline4 0 +set testline5 0 +set testline6 0 + +set arg1 1 +set arg2 2 +set arg3 3 +set arg4 4 +set arg5 5 +set arg6 6 + +set baseline [gdb_find_recursion_test_baseline $srcfile]; +if { $baseline == -1 } { + fail "Could not find gdb_recursion_test function" + return; +} + +send_gdb "list $baseline, +12\n" +gdb_expect { + -re "\[\r\n\](\[0-9\]+).*gdbtestline 1 " { + set testline1 $expect_out(1,string) + exp_continue + } + -re "\[\r\n\](\[0-9\]+).*gdbtestline 2 " { + set testline2 $expect_out(1,string) + exp_continue + } + -re "\[\r\n\](\[0-9\]+).*gdbtestline 3 " { + set testline3 $expect_out(1,string) + exp_continue + } + -re "\[\r\n\](\[0-9\]+).*gdbtestline 4 " { + set testline4 $expect_out(1,string) + exp_continue + } + -re "\[\r\n\](\[0-9\]+).*gdbtestline 5 " { + set testline5 $expect_out(1,string) + exp_continue + } + -re "\[\r\n\](\[0-9\]+).*gdbtestline 6 " { + set testline6 $expect_out(1,string) + exp_continue + } + -re ".*$gdb_prompt $" { + if { ($testline1 == 0) || ($testline2 == 0) || ($testline3 == 0) || ($testline4 == 0) || ($testline5 == 0) || ($testline6 == 0) } { + untested backtrace.exp + return -1 +all tests in this module will fail." + } + } + default { + untested backtrace.exp + return -1 +all tests in this module will fail." + } +} + +# +# Setup backtrace experiment. This will involve: +# 1) a tracepoint where nothing is collected +# 2) a tracepoint where only regs are collected +# 3) a tracepoint where regs, locals and args are collected +# 4) a tracepoint where regs plus some amount of stack are collected. +# + +gdb_delete_tracepoints +set tdp2 [gdb_gettpnum $testline2] +set tdp3 [gdb_gettpnum $testline3] +set tdp4 [gdb_gettpnum $testline4] +set tdp5 [gdb_gettpnum $testline5] +set tdp6 [gdb_gettpnum $testline6] +if { $tdp2 <= 0 || $tdp3 <= 0 || \ + $tdp4 <= 0 || $tdp5 <= 0 || $tdp6 <= 0 } then { + fail "setting tracepoints failed" + return; +} + +#gdb_trace_setactions "setup TP to collect FP" \ +# "$tdp2" \ +# "collect \$fp" "" +# + +gdb_trace_setactions "8.6: setup TP to collect regs" \ + "$tdp3" \ + "collect \$regs" "^$" + +gdb_trace_setactions "8.6: setup TP to collect regs, args, and locals" \ + "$tdp4" \ + "collect \$regs, \$args, \$locs" "^$" + +gdb_trace_setactions "8.6: setup TP to collect stack mem cast expr" \ + "$tdp6" \ + "collect \$fp, \(\*\(void \*\*\) \(\$sp\)\) @ 64" "^$" + +gdb_test "tstart" "" "" + +gdb_test "break end" "" "" +gdb_test "continue" \ + "Continuing.*Breakpoint $decimal, end.*" \ + "run trace experiment" + +gdb_test "tstop" "" "" + +proc gdb_backtrace_tdp_1 { msg } { + global gdb_prompt + + # We are in a trace frame at which we didn't collect anything + # except $PC. Therefore we expect to be able to identify stack + # frame #0, but that's about all. In particular we do not expect + # to be able to display the function's arguments or locals, and we + # do not expect to be able to identify the caller of this function. + + send_gdb "backtrace\n" + gdb_expect { + -re "#0\[\t \]+gdb_recursion_test.*depth=.*$gdb_prompt $" { + pass "$msg" + } + -re ".*$gdb_prompt $" { + fail "$msg" + } + timeout { fail "$msg (timeout)" } + } +} + +proc gdb_backtrace_tdp_2 { msg } { + global gdb_prompt + + # We are in a trace frame at which we collected only the registers + # Therefore we expect to be able to identify stack frame #0, but + # we don't expect to be able to display its args unles they are + # passed in registers (which isn't the case for m68k), and we + # don't expect to be able to identify the caller's stack frame. + + send_gdb "backtrace\n" + gdb_expect { + -re "#0\[\t \]+gdb_recursion_test.*depth=.*$gdb_prompt $" { + pass "$msg" + } + -re ".*$gdb_prompt $" { + fail "$msg" + } + timeout { fail "$msg (timeout)" } + } +} + +proc gdb_backtrace_tdp_3 { msg } { + global gdb_prompt + + # We are in a trace frame at which we collected all registers, all + # arguments and all locals. This means that the display of + # stack frame #0 should be complete (including argument values). + + send_gdb "backtrace\n" + gdb_expect { + -re "#0\[\t \]+gdb_recursion_test.*depth=\[0-9\]+.*q1=\[0-9\]+.*q2=\[0-9\]+.*q3=\[0-9\]+.*q4=\[0-9\]+.*q5=\[0-9\]+.*q6=\[0-9\]+.*$gdb_prompt $" { + pass "$msg" + } + -re "#0\[\t \]+gdb_recursion_test.*depth=Cannot access.*$gdb_prompt $" { + fail "$msg (failed to collect arguments)" + } + -re ".*$gdb_prompt $" { + fail "$msg" + } + timeout { fail "$msg (timeout)" } + } +} + +proc gdb_backtrace_tdp_4 { msg depth } { + global gdb_prompt + + # We are in a trace frame at which we collected all registers, + # plus a sizeable hunk of stack memory. This should enable us to + # display at least several stack frames worth of backtrace. We'll + # assume that if we can't display at least "depth" levels (with + # args), it counts as an error. + + send_gdb "backtrace\n" + gdb_expect { + -re "#$depth\[\t \].*gdb_recursion_test.*depth=\[0-9\]+.*q1=\[0-9\]+.*q2=\[0-9\]+.*q3=\[0-9\]+.*q4=\[0-9\]+.*q5=\[0-9\]+.*q6=\[0-9\]+.*$gdb_prompt $" { + pass "$msg" + } + -re "#$depth\[\t \].*gdb_recursion_test.*depth=.*$gdb_prompt $" { + fail "$msg (args missing from #$depth stack frame)" + } + -re "#\[0-9\]+\[\t \].*gdb_recursion_test.*depth=.*$gdb_prompt $" { + fail "$msg (fewer than $depth stack frames found)" + } + -re ".*$gdb_prompt $" { + fail "$msg" + } + timeout { fail "$msg (timeout)" } + } +} + +# +# begin backtrace test +# + +set timeout 60 + +gdb_tfind_test "init: make sure not debugging any trace frame" "none" "-1" + +gdb_tfind_test "8.6: find start frame" "start" "0" +gdb_test "printf \"TDP \%d:\\n\", \$tracepoint" \ + "TDP $tdp2:" "" +gdb_backtrace_tdp_1 "8.6: Backtrace, depth == 1, collect nothing" + +gdb_tfind_test "8.6: find frame 1" "1" "1" +gdb_test "printf \"TDP \%d:\\n\", \$tracepoint" \ + "TDP $tdp3:" "" +gdb_backtrace_tdp_2 "8.6: Backtrace, depth == 1, collect regs" + +gdb_tfind_test "8.6: find frame 2" "2" "2" +gdb_test "printf \"TDP \%d:\\n\", \$tracepoint" \ + "TDP $tdp4:" "" +gdb_backtrace_tdp_3 "8.6: Backtrace, depth == 1, collect args and locals" + + +gdb_tfind_test "8.6: find frame 4" "4" "4" +gdb_test "printf \"TDP \%d:\\n\", \$tracepoint" \ + "TDP $tdp6:" "" +gdb_backtrace_tdp_4 "8.6: Backtrace, depth == 1, collect stack mem expr" "0" + +gdb_tfind_test "8.6: find frame 5" "5" "5" +gdb_test "printf \"TDP \%d:\\n\", \$tracepoint" \ + "TDP $tdp2:" "" +gdb_backtrace_tdp_1 "8.6: Backtrace, depth == 2, collect nothing" + +gdb_tfind_test "8.6: find frame 6" "6" "6" +gdb_test "printf \"TDP \%d:\\n\", \$tracepoint" \ + "TDP $tdp3:" "" +gdb_backtrace_tdp_2 "8.6: Backtrace, depth == 2, collect regs" + +gdb_tfind_test "8.6: find frame 7" "7" "7" +gdb_test "printf \"TDP \%d:\\n\", \$tracepoint" \ + "TDP $tdp4:" "" +gdb_backtrace_tdp_3 "8.6: Backtrace, depth == 2, collect args and locals" + + +gdb_tfind_test "8.6: find frame 9" "9" "9" +gdb_test "printf \"TDP \%d:\\n\", \$tracepoint" \ + "TDP $tdp6:" "" +gdb_backtrace_tdp_4 "8.6: Backtrace, depth == 1, collect stack mem expr" "0" + +gdb_tfind_test "8.6: find frame 10" "10" "10" +gdb_test "printf \"TDP \%d:\\n\", \$tracepoint" \ + "TDP $tdp2:" "" +gdb_backtrace_tdp_1 "8.6: Backtrace, depth == 3, collect nothing" + +gdb_tfind_test "8.6: find frame 11" "11" "11" +gdb_test "printf \"TDP \%d:\\n\", \$tracepoint" \ + "TDP $tdp3:" "" +gdb_backtrace_tdp_2 "8.6: Backtrace, depth == 3, collect regs" + +gdb_tfind_test "8.6: find frame 12" "12" "12" +gdb_test "printf \"TDP \%d:\\n\", \$tracepoint" \ + "TDP $tdp4:" "" +gdb_backtrace_tdp_3 "8.6: Backtrace, depth == 3, collect args and locals" + + +gdb_tfind_test "8.6: find frame 14" "14" "14" +gdb_test "printf \"TDP \%d:\\n\", \$tracepoint" \ + "TDP $tdp6:" "" +gdb_backtrace_tdp_4 "8.6: Backtrace, depth == 1, collect stack mem expr" "0" + +gdb_tfind_test "8.6: find frame 15" "15" "15" +gdb_test "printf \"TDP \%d:\\n\", \$tracepoint" \ + "TDP $tdp2:" "" +gdb_backtrace_tdp_1 "8.6: Backtrace, depth == 4, collect nothing" + +gdb_tfind_test "8.6: find frame 16" "16" "16" +gdb_test "printf \"TDP \%d:\\n\", \$tracepoint" \ + "TDP $tdp3:" "" +gdb_backtrace_tdp_2 "8.6: Backtrace, depth == 4, collect regs" + +gdb_tfind_test "8.6: find frame 17" "17" "17" +gdb_test "printf \"TDP \%d:\\n\", \$tracepoint" \ + "TDP $tdp4:" "" +gdb_backtrace_tdp_3 "8.6: Backtrace, depth == 4, collect args and locals" + + +gdb_tfind_test "8.6: find frame 19" "19" "19" +gdb_test "printf \"TDP \%d:\\n\", \$tracepoint" \ + "TDP $tdp6:" "" +gdb_backtrace_tdp_4 "8.6: Backtrace, depth == 1, collect stack mem expr" "0" + +gdb_test "printf \"x \%d x\\n\", depth == 3" \ + "x 0 x" \ + "1.13: trace in recursion: depth not equal to 3" + +# Finished! +gdb_test "tfind none" "" "" Index: circ.exp =================================================================== --- circ.exp (nonexistent) +++ circ.exp (revision 842) @@ -0,0 +1,207 @@ +# Copyright 1998, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +load_lib "trace-support.exp" + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +set testfile "circ" +set srcfile ${testfile}.c +set binfile $objdir/$subdir/$testfile + +if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \ + executable {debug nowarnings}] != "" } { + untested circ.exp + return -1 +} + +# Tests: +# 1) Set up a trace experiment that will collect approximately 10 frames, +# requiring more than 512 but less than 1024 bytes of cache buffer. +# (most targets should have at least 1024 bytes of cache buffer!) +# Run and confirm that it collects all 10 frames. +# 2) Artificially limit the trace buffer to 512 bytes, and rerun the +# experiment. Confirm that the first several frames are collected, +# but that the last several are not. +# 3) Set trace buffer to circular mode, still with the artificial limit +# of 512 bytes, and rerun the experiment. Confirm that the last +# several frames are collected, but the first several are not. +# + +# return 0 for success, 1 for failure +proc run_trace_experiment { pass } { + gdb_run_cmd + + if [gdb_test "tstart" \ + "\[\r\n\]*" \ + "start trace experiment, pass $pass"] then { return 1; } + if [gdb_test "continue" \ + "Continuing.*Breakpoint \[0-9\]+, end.*" \ + "run to end, pass $pass"] then { return 1; } + if [gdb_test "tstop" \ + "\[\r\n\]*" \ + "stop trace experiment, pass $pass"] then { return 1; } + return 0; +} + +# return 0 for success, 1 for failure +proc set_a_tracepoint { func } { + if [gdb_test "trace $func" \ + "Tracepoint \[0-9\]+ at .*" \ + "set tracepoint at $func"] then { + return 1; + } + if [gdb_trace_setactions "set actions for $func" \ + "" \ + "collect testload" "^$"] then { + return 1; + } + return 0; +} + +# return 0 for success, 1 for failure +proc setup_tracepoints { } { + gdb_delete_tracepoints + if [set_a_tracepoint func0] then { return 1; } + if [set_a_tracepoint func1] then { return 1; } + if [set_a_tracepoint func2] then { return 1; } + if [set_a_tracepoint func3] then { return 1; } + if [set_a_tracepoint func4] then { return 1; } + if [set_a_tracepoint func5] then { return 1; } + if [set_a_tracepoint func6] then { return 1; } + if [set_a_tracepoint func7] then { return 1; } + if [set_a_tracepoint func8] then { return 1; } + if [set_a_tracepoint func9] then { return 1; } + return 0; +} + +# return 0 for success, 1 for failure +proc trace_buffer_normal { } { + if [gdb_test "maint packet QTBuffer:size:ffffffff" \ + "received: .OK." ""] then { + pass "This test cannot be run on this target" + return 1; + } + if [gdb_test "maint packet QTBuffer:circular:0" \ + "received: .OK." ""] then { + pass "This test cannot be run on this target" + return 1; + } + return 0; +} + +# return 0 for success, 1 for failure +proc gdb_trace_circular_tests { } { + + # We generously give ourselves one "pass" if we successfully + # detect that this test cannot be run on this target! + if { ![gdb_target_supports_trace] } then { + pass "Current target does not support trace" + return 1; + } + + if [trace_buffer_normal] then { return 1; } + + gdb_test "break begin" "" "" + gdb_test "break end" "" "" + gdb_test "tstop" "" "" + gdb_test "tfind none" "" "" + + if [setup_tracepoints] then { return 1; } + + # First, run the trace experiment with default attributes: + # Make sure it behaves as expected. + if [run_trace_experiment 1] then { return 1; } + if [gdb_test "tfind start" \ + "#0 func0 .*" \ + "find frame zero, pass 1"] then { return 1; } + + if [gdb_test "tfind 9" \ + "#0 func9 .*" \ + "find frame nine, pass 1"] then { return 1; } + + if [gdb_test "tfind none" \ + "#0 end .*" \ + "quit trace debugging, pass 1"] then { return 1; } + + # Then, shrink the trace buffer so that it will not hold + # all ten trace frames. Verify that frame zero is still + # collected, but frame nine is not. + if [gdb_test "maint packet QTBuffer:size:200" \ + "received: .OK." "shrink the target trace buffer"] then { + return 1; + } + if [run_trace_experiment 2] then { return 1; } + if [gdb_test "tfind start" \ + "#0 func0 .*" \ + "find frame zero, pass 2"] then { return 1; } + + if [gdb_test "tfind 9" \ + ".* failed to find .*" \ + "fail to find frame nine, pass 2"] then { return 1; } + + if [gdb_test "tfind none" \ + "#0 end .*" \ + "quit trace debugging, pass 2"] then { return 1; } + + # Finally, make the buffer circular. Now when it runs out of + # space, it should wrap around and overwrite the earliest frames. + # This means that: + # 1) frame zero will be overwritten and therefore unavailable + # 2) the earliest frame in the buffer will be other-than-zero + # 3) frame nine will be available (unlike on pass 2). + if [gdb_test "maint packet QTBuffer:circular:1" \ + "received: .OK." "make the target trace buffer circular"] then { + return 1; + } + if [run_trace_experiment 3] then { return 1; } + if [gdb_test "tfind start" \ + "#0 func\[1-9\] .*" \ + "first frame is NOT frame zero, pass 3"] then { return 1; } + + if [gdb_test "tfind 9" \ + "#0 func9 .*" \ + "find frame nine, pass 3"] then { return 1; } + + if [gdb_test "tfind none" \ + "#0 end .*" \ + "quit trace debugging, pass 3"] then { return 1; } + + return 0; +} + +# Start with a fresh gdb. + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load $binfile + +if [target_info exists gdb_stub] { + gdb_step_for_stub; +} +# Body of test encased in a proc so we can return prematurely. +if { ![gdb_trace_circular_tests] } then { + # Set trace buffer attributes back to normal + trace_buffer_normal; +} + +# Finished! +gdb_test "tfind none" "" "" Index: collection.c =================================================================== --- collection.c (nonexistent) +++ collection.c (revision 842) @@ -0,0 +1,280 @@ +/* + * Test program for trace collection + */ + +/* + * Typedefs + */ + +typedef struct TEST_STRUCT { + char memberc; + int memberi; + float memberf; + double memberd; +} test_struct; + +typedef int test_array [4]; + +/* + * Global variables to be collected + */ + +char globalc; +int globali; +float globalf; +double globald; +test_struct globalstruct; +test_struct *globalp; +int globalarr[16]; + +/* + * Additional globals used in arithmetic tests + */ + +signed char c0, c1, c2, c3, c4, c5, c6, c7, + c8, c9, c10, c11, c12, c13, c14, c15, cminus; +signed short s0, s1, s2, s3, s4, s5, s6, s7, + s8, s9, s10, s11, s12, s13, s14, s15, sminus; +signed long l0, l1, l2, l3, l4, l5, l6, l7, + l8, l9, l10, l11, l12, l13, l14, l15, lminus; + + +/* + * Test functions + */ + +static void begin () /* called before anything else */ +{ +} + +static void end () /* called after everything else */ +{ +} + +/* Test collecting args. */ +int args_test_func (argc, argi, argf, argd, argstruct, argarray) + char argc; + int argi; + float argf; + double argd; + test_struct argstruct; + int argarray[4]; +{ + int i; + + i = (int) argc + argi + argf + argd + argstruct.memberi + argarray[1]; + + return i; +} + +/* Test collecting struct args. */ +int argstruct_test_func (argstruct) + test_struct argstruct; +{ + return (int) argstruct.memberc + argstruct.memberi + + argstruct.memberf + argstruct.memberd; +} + +/* Test collecting array args. */ +int argarray_test_func (argarray) + int argarray[4]; +{ + return (int) argarray[0] + argarray[1] + argarray[2] + argarray[3]; +} + + + +int local_test_func () /* test collecting locals */ +{ + char locc = 11; + int loci = 12; + float locf = 13.3; + double locd = 14.4; + test_struct locst; + int locar[4]; + int i; + + locst.memberc = 15; + locst.memberi = 16; + locst.memberf = 17.7; + locst.memberd = 18.8; + locar[0] = 121; + locar[1] = 122; + locar[2] = 123; + locar[3] = 124; + + i = /* Set_Tracepoint_Here */ + (int) locc + loci + locf + locd + locst.memberi + locar[1]; + + return i; +} + +int reglocal_test_func () /* test collecting register locals */ +{ + register char locc = 11; + register int loci = 12; + register float locf = 13.3; + register double locd = 14.4; + register test_struct locst; + register int locar[4]; + int i; + + locst.memberc = 15; + locst.memberi = 16; + locst.memberf = 17.7; + locst.memberd = 18.8; + locar[0] = 121; + locar[1] = 122; + locar[2] = 123; + locar[3] = 124; + + i = /* Set_Tracepoint_Here */ + (int) locc + loci + locf + locd + locst.memberi + locar[1]; + + return i; +} + +int statlocal_test_func () /* test collecting static locals */ +{ + static char locc; + static int loci; + static float locf; + static double locd; + static test_struct locst; + static int locar[4]; + int i; + + locc = 11; + loci = 12; + locf = 13.3; + locd = 14.4; + locst.memberc = 15; + locst.memberi = 16; + locst.memberf = 17.7; + locst.memberd = 18.8; + locar[0] = 121; + locar[1] = 122; + locar[2] = 123; + locar[3] = 124; + + i = /* Set_Tracepoint_Here */ + (int) locc + loci + locf + locd + locst.memberi + locar[1]; + + /* Set static locals back to zero so collected values are clearly special. */ + locc = 0; + loci = 0; + locf = 0; + locd = 0; + locst.memberc = 0; + locst.memberi = 0; + locst.memberf = 0; + locst.memberd = 0; + locar[0] = 0; + locar[1] = 0; + locar[2] = 0; + locar[3] = 0; + + return i; +} + + +int globals_test_func () +{ + int i = 0; + + i += globalc + globali + globalf + globald; + i += globalstruct.memberc + globalstruct.memberi; + i += globalstruct.memberf + globalstruct.memberd; + i += globalarr[1]; + + return i; /* Set_Tracepoint_Here */ +} + +int +main (argc, argv, envp) + int argc; + char *argv[], **envp; +{ + int i = 0; + test_struct mystruct; + int myarray[4]; + +#ifdef usestubs + set_debug_traps (); + breakpoint (); +#endif + + begin (); + /* Assign collectable values to global variables. */ + l0 = s0 = c0 = 0; l1 = s1 = c1 = 1; + l2 = s2 = c2 = 2; l3 = s3 = c3 = 3; + l4 = s4 = c4 = 4; l5 = s5 = c5 = 5; + l6 = s6 = c6 = 6; l7 = s7 = c7 = 7; + l8 = s8 = c8 = 8; l9 = s9 = c9 = 9; + l10 = s10 = c10 = 10; l11 = s11 = c11 = 11; + l12 = s12 = c12 = 12; l13 = s13 = c13 = 13; + l14 = s14 = c14 = 14; l15 = s15 = c15 = 15; + lminus = sminus = cminus = -2; + globalc = 71; + globali = 72; + globalf = 73.3; + globald = 74.4; + globalstruct.memberc = 81; + globalstruct.memberi = 82; + globalstruct.memberf = 83.3; + globalstruct.memberd = 84.4; + globalp = &globalstruct; + + for (i = 0; i < 15; i++) + globalarr[i] = i; + + mystruct.memberc = 101; + mystruct.memberi = 102; + mystruct.memberf = 103.3; + mystruct.memberd = 104.4; + myarray[0] = 111; + myarray[1] = 112; + myarray[2] = 113; + myarray[3] = 114; + + /* Call test functions, so they can be traced and data collected. */ + i = 0; + i += args_test_func (1, 2, 3.3, 4.4, mystruct, myarray); + i += argstruct_test_func (mystruct); + i += argarray_test_func (myarray); + i += local_test_func (); + i += reglocal_test_func (); + i += statlocal_test_func (); + i += globals_test_func (); + + /* Values of globals at end of test should be different from + values that they had when trace data was captured. */ + + l0 = s0 = c0 = 0; l1 = s1 = c1 = 0; + l2 = s2 = c2 = 0; l3 = s3 = c3 = 0; + l4 = s4 = c4 = 0; l5 = s5 = c5 = 0; + l6 = s6 = c6 = 0; l7 = s7 = c7 = 0; + l8 = s8 = c8 = 0; l9 = s9 = c9 = 0; + l10 = s10 = c10 = 0; l11 = s11 = c11 = 0; + l12 = s12 = c12 = 0; l13 = s13 = c13 = 0; + l14 = s14 = c14 = 0; l15 = s15 = c15 = 0; + lminus = sminus = cminus = 0; + + /* Set 'em back to zero, so that the collected values will be + distinctly different from the "realtime" (end of test) values. */ + + globalc = 0; + globali = 0; + globalf = 0; + globald = 0; + globalstruct.memberc = 0; + globalstruct.memberi = 0; + globalstruct.memberf = 0; + globalstruct.memberd = 0; + globalp = 0; + for (i = 0; i < 15; i++) + globalarr[i] = 0; + + end (); + return 0; +}
collection.c Property changes : Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +Id \ No newline at end of property Index: tracecmd.exp =================================================================== --- tracecmd.exp (nonexistent) +++ tracecmd.exp (revision 842) @@ -0,0 +1,179 @@ +# Copyright 1998, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# This file was written by Michael Snyder (msnyder@cygnus.com) + +load_lib "trace-support.exp"; + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +gdb_exit +gdb_start +set testfile "actions" +set srcfile ${testfile}.c +set binfile $objdir/$subdir/tracecmd +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 + +# 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 + 1] +set testline2 [expr $baseline + 3] + +# +# test "help tracepoints" +# + +set helpcnt 0; +test_class_help "tracepoints" { + "Tracing of program execution without stopping the program\.[\r\n\]+" +} "1.0: help tracepoints" + +# +# test trace command: +# + +# 1.1 trace source line +gdb_delete_tracepoints +gdb_test "trace $srcfile:$testline2" \ + "Tracepoint $decimal at $hex: file.*$srcfile, line $testline2." \ + "1.1a: set tracepoint at sourceline" +gdb_test "info trace" "in gdb_recursion_test.*$srcfile:$testline2" \ + "1.1b: trace sourcefile:line" + +# 1.2 trace invalid source line +gdb_delete_tracepoints +gdb_test "trace $srcfile:99999" "No line 99999 in file \".*$srcfile\"." \ + "1.2a: trace invalid line in sourcefile" +gdb_test "info trace" "No tracepoints.*" \ + "1.2b: reject invalid line in srcfile" + +# 1.3 trace line in invalid source file +gdb_delete_tracepoints +gdb_test "set breakpoint pending off" "" +gdb_test "trace NoSuChFiLe.c:1" "No source file named NoSuChFiLe.c." \ + "1.3a: trace invalid source file" +gdb_test "info trace" "No tracepoints.*" \ + "1.3b: reject invalid srcfile" + +# 1.4 trace function by name +gdb_delete_tracepoints +gdb_test "trace gdb_recursion_test" \ + "Tracepoint $decimal at $hex: file.*$srcfile, line $testline1." \ + "1.4a: trace function by name" +gdb_test "info trace" "in gdb_recursion_test.*$srcfile:$testline1" \ + "1.4b: trace function by name" + +# 1.5 trace non-existant function +gdb_delete_tracepoints +gdb_test "trace NoSuChFuNc" "Function \"NoSuChFuNc\" not defined." \ + "1.5a: trace invalid function" +gdb_test "info trace" "No tracepoints.*" \ + "1.5b: reject invalid srcfile" + +# 1.6 trace at a specific address +# Collect the address of "gdb_asm_test", and use that. +send_gdb "print gdb_asm_test\n" +gdb_expect { + -re "\[$\]\[0-9\].*0x(\[0-9a-fA-F\]+).*$gdb_prompt $" { + set asm_test_addr $expect_out(1,string) + } + timeout { } +} + +gdb_delete_tracepoints +gdb_test "trace \*0x$asm_test_addr" \ + "Tracepoint $decimal at .*$asm_test_addr.*" \ + "1.6a: trace at specific address" +gdb_test "info trace" "$asm_test_addr.*gdb_asm_test.*" \ + "1.6b: verify trace at specific address" + +# 1.7 trace at function's exact address +# Collect the address of the function for comparison +send_gdb "print gdb_recursion_test\n" +gdb_expect { + -re "\[$\]\[0-9\].*0x(\[0-9a-fA-F\]+).*$gdb_prompt $" { + set c_test_addr $expect_out(1,string) + } + timeout { } +} + +gdb_delete_tracepoints +gdb_test "trace \*gdb_recursion_test" \ + "Tracepoint $decimal at .*$c_test_addr.*" \ + "1.7a: trace at function label (before prologue)" +gdb_test "info trace" "$c_test_addr.*in gdb_recursion_test.*:$baseline" \ + "1.7b: verify trace at specific address" + +# 1.8 trace at invalid address +# no address is invalid + +# 1.9 trace no arguments +gdb_test "trace" "No default breakpoint address now." \ + "1.9: trace " + +# 1.10 set large number of tracepoints +# deferred to limits test module + +# 1.11 tracepoint conditions +gdb_delete_tracepoints +gdb_test "trace gdb_recursion_test if q1 > 0" \ + "Tracepoint $decimal at $hex: file.*$srcfile, line $testline1." \ + "1.11a: conditional tracepoint" +gdb_test "info trace" "in gdb_recursion_test.*$srcfile:$testline1.*trace only if q1 > 0" \ + "1.11b: verify conditional tracepoint" + +# 1.12 set tracepoint in prologue +# [see tfind.exp] + +# 1.13 trace on recursion +# interesting only in "live" session: see backtrace.exp for live test. + +# 1.14 help trace +gdb_test "help trace" "Set a tracepoint at .*" "1.14: help trace" + +# 1.15 ftrace + +gdb_delete_tracepoints + +send_gdb "ftrace gdb_recursion_test\n" +# Acceptance vs rejection of a location are target-specific, so allow both. +gdb_expect { + -re "Fast tracepoint $decimal at $hex: file.*$srcfile, line $testline1.*$gdb_prompt $" + { pass "Set a fast tracepoint" } + -re ".*May not have a fast tracepoint at $hex.*$gdb_prompt $" + { pass "Declined to set a fast tracepoint" } + timeout { fail "Timeout while setting fast tracepoint" } +} Index: deltrace.exp =================================================================== --- deltrace.exp (nonexistent) +++ deltrace.exp (revision 842) @@ -0,0 +1,223 @@ +# Copyright 1998, 1999, 2007, 2008, 2009, 2010 +# Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# This file was written by Michael Snyder (msnyder@cygnus.com) + +load_lib "trace-support.exp"; + +if $tracelevel then { + strace $tracelevel +} + +set prms_id 0 +set bug_id 0 + +gdb_exit +gdb_start + +set testfile "actions" +set srcfile ${testfile}.c +set binfile $objdir/$subdir/deltrace +if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \ + executable {debug nowarnings}] != "" } { + untested deltrace.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 + +# 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 + 4] + +# +# test "delete tracepoints" command +# + +# 3.1 delete tracepoints (all) +gdb_delete_tracepoints +gdb_test "trace gdb_c_test" "Tracepoint \[0-9\]+ at .*" "set tracepoint 1" +gdb_test "trace gdb_asm_test" "Tracepoint \[0-9\]+ at .*" "set tracepoint 2" +gdb_test "trace $testline1" "Tracepoint \[0-9\]+ at .*" "set tracepoint 3" + +gdb_test "info tracepoints" \ + "Num Type\[ \]+Disp Enb Address\[ \]+What.* +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_c_test at .*$srcfile:\[0-9\]+. +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_asm_test at .*$srcfile:\[0-9\]+. +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_recursion_test at .*$srcfile:\[0-9\]+" \ + "3.1a: set three tracepoints" + +send_gdb "delete tracepoints\n" +gdb_expect 30 { + -re "Delete all tracepoints.*y or n.*$" { + send_gdb "y\n" + gdb_expect 30 { + -re "$gdb_prompt $" { + pass "3.1b: delete all tracepoints" + } + timeout { fail "3.1b: delete all tracepoints (timeout)" } + } + } + -re "$gdb_prompt $" { # This should only happen if there are no tracepoints + fail "3.1b: delete all tracepoints (no tracepoints?)" + } + timeout { fail "3.1b: delete all tracepoints (timeout)" } +} + +# 3.2 delete tracepoint +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 "info tracepoints" \ + "Num Type\[ \]+Disp Enb Address\[ \]+What.* +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_c_test at .*$srcfile:\[0-9\]+. +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_asm_test at .*$srcfile:\[0-9\]+. +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_recursion_test at .*$srcfile:\[0-9\]+" \ + "3.2a: set three tracepoints" + +#gdb_test "delete tracepoint $trcpt1" "" "" +send_gdb "delete tracepoint $trcpt1\n" +gdb_expect { + -re "No tracepoint number.*$gdb_prompt $" { + fail "3.2b: delete first tracepoint" + } + -re ".*\[Ee\]rror.*$gdb_prompt $" { + fail "3.2b: delete first tracepoint" + } + -re "$gdb_prompt $" { + pass "3.2b: delete first tracepoint" + } + timeout { + fail "3.2b: delete first tracepoint (timeout)" + } +} + +gdb_test "info tracepoints" \ + "Num Type\[ \]+Disp Enb Address\[ \]+What.* +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_asm_test at .*$srcfile:\[0-9\]+. +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_recursion_test at .*$srcfile:\[0-9\]+" \ + "3.2c: verify delete first tracepoint" + +#gdb_test "delete tracepoint $trcpt2" "" "" +send_gdb "delete tracepoint $trcpt2\n" +gdb_expect { + -re "No tracepoint number.*$gdb_prompt $" { + fail "3.2d: delete second tracepoint" + } + -re ".*\[Ee\]rror.*$gdb_prompt $" { + fail "3.2d: delete second tracepoint" + } + -re "$gdb_prompt $" { + pass "3.2d: delete second tracepoint" + } + timeout { + fail "3.2d: delete second tracepoint (timeout)" + } +} + +gdb_test "info tracepoints" \ + "Num Type\[ \]+Disp Enb Address\[ \]+What.* +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_recursion_test at .*$srcfile:\[0-9\]+" \ + "3.2e: verify delete second tracepoint" + +#gdb_test "delete tracepoint $trcpt3" "" "" +send_gdb "delete tracepoint $trcpt3\n" +gdb_expect { + -re "No tracepoint number.*$gdb_prompt $" { + fail "3.2f: delete third tracepoint" + } + -re ".*\[Ee\]rror.*$gdb_prompt $" { + fail "3.2f: delete third tracepoint" + } + -re "$gdb_prompt $" { + pass "3.2f: delete third tracepoint" + } + timeout { + fail "3.2f: delete third tracepoint (timeout)" + } +} + +# send_gdb "ARF! \\n\n" +gdb_test "info tracepoints" \ + "No tracepoints." \ + "3.2g: verify delete third tracepoint" + +# 3.3 delete three tracepoints at once +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 "info tracepoints" \ + "Num Type\[ \]+Disp Enb Address\[ \]+What.* +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_c_test at .*$srcfile:\[0-9\]+. +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_asm_test at .*$srcfile:\[0-9\]+. +\[0-9\]+\[\t \]+tracepoint keep y.* in gdb_recursion_test at .*$srcfile:\[0-9\]+" \ + "3.3a: set three tracepoints" + +#gdb_test "delete tracepoint $trcpt1 $trcpt2 $trcpt3" "" "" +send_gdb "delete tracepoint $trcpt1 $trcpt2 $trcpt3\n" +gdb_expect { + -re "No tracepoint number.*$gdb_prompt $" { + fail "3.3b: delete three tracepoints" + } + -re ".*\[Ee\]rror.*$gdb_prompt $" { + fail "3.3b: delete three tracepoints" + } + -re "$gdb_prompt $" { + pass "3.3b: delete three tracepoints" + } + timeout { + fail "3.3b: delete three tracepoint (timeout)" + } +} + +gdb_test "info tracepoints" \ + "No tracepoints." \ + "3.3c: verify delete three tracepoints" + +# 3.4 delete invalid tracepoint number +gdb_test "delete tracepoint [expr $trcpt2 + $trcpt3]" \ + "No breakpoint number [expr $trcpt2 + $trcpt3]." \ + "3.4: delete invalid tracepoint number" + +# 3.5 delete tracepoint number zero +gdb_test "delete tracepoint 0" "bad breakpoint number at or near '0'" \ + "3.5: delete tracepoint number zero" + +# 3.6 help delete tracepoints +gdb_test "help delete tracepoints" \ + "Delete specified tracepoints.*" \ + "3.6: help delete tracepoints"

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.