From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 5758 invoked by alias); 28 Mar 2010 23:45:30 -0000 Received: (qmail 5732 invoked by uid 22791); 28 Mar 2010 23:45:27 -0000 X-SWARE-Spam-Status: No, hits=-2.5 required=5.0 tests=AWL,BAYES_00 X-Spam-Check-By: sourceware.org Received: from mail.codesourcery.com (HELO mail.codesourcery.com) (38.113.113.100) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sun, 28 Mar 2010 23:45:21 +0000 Received: (qmail 27093 invoked from network); 28 Mar 2010 23:45:19 -0000 Received: from unknown (HELO orlando.localnet) (pedro@127.0.0.2) by mail.codesourcery.com with ESMTPA; 28 Mar 2010 23:45:19 -0000 From: Pedro Alves To: gdb-patches@sourceware.org, Stan Shebs Subject: [commit/RFC] fix gdb.trace/collection.exp bitrot Date: Sun, 28 Mar 2010 23:45:00 -0000 User-Agent: KMail/1.12.2 (Linux/2.6.31-20-generic; KDE/4.3.2; x86_64; ; ) MIME-Version: 1.0 Content-Type: Text/Plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Message-Id: <201003290045.17238.pedro@codesourcery.com> X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2010-03/txt/msg00962.txt.bz2 I was adding a small test to gdb/trace/collection.exp for some other random tracing bug fix, and noticed that it actually never ran against gdbserver with tracepoints support. The test assumes that after gdb_load, which isn't true for all board files, or native testing. It's also not true with the local gdbserver testing boardfile found in the wiki, that most people use. The test was then always being skipped with that common pattern in gdb.trace/ 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; } The other bitrot issue fixed by the patch, is, on some targets, printing $sp prints the pointer type in addition to the value, like so: (top-gdb) p $sp $1 = (void *) 0x7fffffffe030 Printing $pc prints even more things: (top-gdb) p $pc $1 = (void (*)()) 0x456d53 The test isn't expecting this. The fix is just to do "print /x" instead: (top-gdb) p /x $sp $1 = 0x7fffffffe030 (top-gdb) p /x $pc $1 = 0x456d53 I've applied the patch below to fix these issues. However, the test still has these FAILs: Running ../../../src/gdb/testsuite/gdb.trace/collection.exp ... FAIL: gdb.trace/collection.exp: collect args collectively: collected argarray #0 FAIL: gdb.trace/collection.exp: collect args collectively: collected argarray #1 FAIL: gdb.trace/collection.exp: collect args collectively: collected argarray #2 FAIL: gdb.trace/collection.exp: collect args collectively: collected argarray #3 FAIL: gdb.trace/collection.exp: collect args individually: collected argarray #0 FAIL: gdb.trace/collection.exp: collect args individually: collected argarray #1 FAIL: gdb.trace/collection.exp: collect args individually: collected argarray #2 FAIL: gdb.trace/collection.exp: collect args individually: collected argarray #3 FAIL: gdb.trace/collection.exp: collect argarray collectively: collected argarray #0 FAIL: gdb.trace/collection.exp: collect argarray collectively: collected argarray #1 FAIL: gdb.trace/collection.exp: collect argarray collectively: collected argarray #2 FAIL: gdb.trace/collection.exp: collect argarray collectively: collected argarray #3 FAIL: gdb.trace/collection.exp: collect argarray individually: collected argarray #0 FAIL: gdb.trace/collection.exp: collect argarray individually: collected argarray #1 FAIL: gdb.trace/collection.exp: collect argarray individually: collected argarray #2 FAIL: gdb.trace/collection.exp: collect argarray individually: collected argarray #3 === gdb Summary === # of expected passes 361 # of unexpected failures 16 [to be clear, you can't see these if your gdbserver doesn't supports tracepoints yet, nor can you see these with native testing] All the failures in the test look similar to this: print argarray[0] Cannot access memory at address 0x7fff138c9aa0 (gdb) FAIL: gdb.trace/collection.exp: collect args collectively: collected argarray #0 That is, the tracepoint was set to collect the `argarray' argument, of: /* 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]; { But, array passing in C is special; even though the argument is declared like an array, only a pointer to the array passed in. So, collecting `argarray' only collects the array address, not its contents. But, the test tried to print the array's contents, and, that fails. The question is. What to do then? Should the test just be fixed to not assume that collecting an array argument, collects the whole array? I believe so. Regular printing also just prints the pointer: (gdb) frame #0 args_test_func (argc=1 '\001', argi=2, argf=3.29999995, argd=4.4000000000000004, argstruct=..., argarray=0x7fffffffe010) at ../../../src/gdb/testsuite/gdb.trace/collection.c:65 (gdb) p argarray $1 = (int *) 0x7fffffffe010 (gdb) up #1 0x0000000000400cb0 in main (argc=1, argv=0x7fffffffe118, envp=0x7fffffffe128) at ../../../src/gdb/testsuite/gdb.trace/collection.c:242 (gdb) p myarray $2 = {111, 112, 113, 114} (gdb) p & $3 = (int (*)[4]) 0x7fffffffe010 (gdb) This matches the language semantics. If the user wants to collect the array contents, she should do so explicitly. I also tried compiling the test with stabs+, just in case and I see the same. Maybe it was different at some point. -- Pedro Alves 2010-03-29 Pedro Alves gdb/testsuite/ * gdb.trace/collection.exp (executable): New. (binfile): Use it. (fpreg, spreg, pcreg): New. (test_register): Use gdb_test_multiple. Pass /x to print. (prepare_for_trace_test): New. (run_trace_experiment): Use "continue", not gdb_run_cmd. (gdb_collect_args_test, gdb_collect_argstruct_test) (gdb_collect_argarray_test, gdb_collect_locals_test): Use prepare_for_trace_test. (gdb_collect_registers_test): Use prepare_for_trace_test. Use fpreg, spreg and pcreg. (gdb_collect_expression_test, gdb_collect_globals_test): Use prepare_for_trace_test. (gdb_trace_collection_test): Use fpreg, spreg and pcreg. Don't try to detect tracing support here. Don't set breakpoints at `begin' or `end' here. : Use clean_restart. Run to main before checking for tracing support. Check for for tracing support here. --- gdb/testsuite/gdb.trace/collection.exp | 143 ++++++++++++++------------------- 1 file changed, 62 insertions(+), 81 deletions(-) Index: src/gdb/testsuite/gdb.trace/collection.exp =================================================================== --- src.orig/gdb/testsuite/gdb.trace/collection.exp 2010-03-28 22:47:37.000000000 +0100 +++ src/gdb/testsuite/gdb.trace/collection.exp 2010-03-28 23:38:28.000000000 +0100 @@ -24,7 +24,8 @@ set bug_id 0 set testfile "collection" set srcfile ${testfile}.c -set binfile $objdir/$subdir/$testfile +set executable $testfile +set binfile $objdir/$subdir/$executable if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \ executable {debug nowarnings}] != "" } { @@ -45,6 +46,20 @@ if { [gdb_compile "$srcdir/$subdir/$srcf set ws "\[\r\n\t \]+" set cr "\[\r\n\]+" +if [istarget "x86_64-*"] then { + set fpreg "rbp" + set spreg "rsp" + set pcreg "rip" +} elseif [istarget "i?86-*"] then { + set fpreg "ebp" + set spreg "esp" + set pcreg "eip" +} else { + set fpreg "fp" + set spreg "sp" + set pcreg "pc" +} + # # Utility procs # @@ -53,36 +68,35 @@ 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 " { + gdb_test_multiple "print /x $reg" "" { + -re "\\$\[0-9\]+ = \[x0\]+$cr$gdb_prompt $" { fail "collect $test_id: collected $reg (zero)" } - -re "\\$\[0-9\]+ = \[x0-9a-fA-F\]+$cr$gdb_prompt " { + -re "\\$\[0-9\]+ = \[x0-9a-fA-F\]+$cr$gdb_prompt $" { pass "collect $test_id: collected $reg" } - -re "\[Ee\]rror.*$gdb_prompt " { + -re "\[Ee\]rror.*$gdb_prompt $" { fail "collect $test_id: collected $reg (error)" } - timeout { - fail "collect $test_id: collected $reg (timeout)" - } } } +proc prepare_for_trace_test {} { + global executable + + clean_restart $executable + + runto_main + + gdb_test "break begin" "" "" + gdb_test "break end" "" "" +} + 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 "continue" \ + ".*Breakpoint \[0-9\]+, begin .*" \ + "collect $msg: advance to begin" + gdb_test "tstart" \ "\[\r\n\]+" \ "collect $msg: start trace experiment" @@ -106,10 +120,7 @@ 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 + prepare_for_trace_test gdb_test "trace args_test_func" \ "Tracepoint \[0-9\]+ at .*" \ @@ -171,10 +182,7 @@ proc gdb_collect_argstruct_test { myargs global cr global gdb_prompt - # Make sure we're in a sane starting state. - gdb_test "tstop" "" "" - gdb_test "tfind none" "" "" - gdb_delete_tracepoints + prepare_for_trace_test gdb_test "trace argstruct_test_func" \ "Tracepoint \[0-9\]+ at .*" \ @@ -210,10 +218,7 @@ proc gdb_collect_argarray_test { myargs global cr global gdb_prompt - # Make sure we're in a sane starting state. - gdb_test "tstop" "" "" - gdb_test "tfind none" "" "" - gdb_delete_tracepoints + prepare_for_trace_test gdb_test "trace argarray_test_func" \ "Tracepoint \[0-9\]+ at .*" \ @@ -249,10 +254,7 @@ proc gdb_collect_locals_test { func mylo global cr global gdb_prompt - # Make sure we're in a sane starting state. - gdb_test "tstop" "" "" - gdb_test "tfind none" "" "" - gdb_delete_tracepoints + prepare_for_trace_test # Find the comment-identified line for setting this tracepoint. set testline 0 @@ -330,11 +332,11 @@ proc gdb_collect_locals_test { func mylo proc gdb_collect_registers_test { myregs } { global cr global gdb_prompt + global fpreg + global spreg + global pcreg - # Make sure we're in a sane starting state. - gdb_test "tstop" "" "" - gdb_test "tfind none" "" "" - gdb_delete_tracepoints + prepare_for_trace_test # We'll simply re-use the args_test_function for this test gdb_test "trace args_test_func" \ @@ -347,9 +349,9 @@ proc gdb_collect_registers_test { myregs # Begin the test. run_trace_experiment $myregs args_test_func - test_register "\$fp" $myregs - test_register "\$sp" $myregs - test_register "\$pc" $myregs + test_register "\$$fpreg" $myregs + test_register "\$$spreg" $myregs + test_register "\$$pcreg" $myregs gdb_test "tfind none" \ "#0 end .*" \ @@ -360,10 +362,7 @@ proc gdb_collect_expression_test { func global cr global gdb_prompt - # Make sure we're in a sane starting state. - gdb_test "tstop" "" "" - gdb_test "tfind none" "" "" - gdb_delete_tracepoints + prepare_for_trace_test # Find the comment-identified line for setting this tracepoint. set testline 0 @@ -406,10 +405,7 @@ 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 + prepare_for_trace_test # Find the comment-identified line for setting this tracepoint. set testline 0 @@ -485,21 +481,11 @@ proc gdb_collect_globals_test { } { "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; - } +proc gdb_trace_collection_test {} { + global fpreg + global spreg + global pcreg - 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" \ @@ -527,9 +513,8 @@ proc gdb_trace_collection_test { } { 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_registers_test "\$$fpreg, \$$spreg, \$$pcreg" gdb_collect_globals_test # @@ -605,22 +590,18 @@ proc gdb_trace_collection_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; +clean_restart $executable +runto_main + +# 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; } - + # Body of test encased in a proc so we can return prematurely. gdb_trace_collection_test # Finished! gdb_test "tfind none" "" "" - - -