From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 13895 invoked by alias); 17 Nov 2011 14:09:49 -0000 Received: (qmail 13874 invoked by uid 22791); 17 Nov 2011 14:09:44 -0000 X-SWARE-Spam-Status: No, hits=0.4 required=5.0 tests=AWL,BAYES_50,KAM_STOCKGEN X-Spam-Check-By: sourceware.org Received: from relay1.mentorg.com (HELO relay1.mentorg.com) (192.94.38.131) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 17 Nov 2011 14:09:26 +0000 Received: from nat-jpt.mentorg.com ([192.94.33.2] helo=PR1-MAIL.mgc.mentorg.com) by relay1.mentorg.com with esmtp id 1RR2ea-0000G9-OJ from Yao_Qi@mentor.com for gdb-patches@sourceware.org; Thu, 17 Nov 2011 06:09:25 -0800 Received: from [127.0.0.1] ([172.16.63.104]) by PR1-MAIL.mgc.mentorg.com with Microsoft SMTPSVC(6.0.3790.1830); Thu, 17 Nov 2011 23:09:21 +0900 Message-ID: <4EC51589.1010501@codesourcery.com> Date: Thu, 17 Nov 2011 14:09:00 -0000 From: Yao Qi User-Agent: Mozilla/5.0 (X11; Linux i686; rv:7.0.1) Gecko/20110930 Thunderbird/7.0.1 MIME-Version: 1.0 To: Pedro Alves CC: gdb-patches@sourceware.org Subject: Re: [patch 4/5] Test cases References: <4EC20E2E.6010402@codesourcery.com> <201111161904.19664.pedro@codesourcery.com> <4EC47EED.8070500@codesourcery.com> <201111171207.42605.pedro@codesourcery.com> In-Reply-To: <201111171207.42605.pedro@codesourcery.com> Content-Type: multipart/mixed; boundary="------------070304070003060004000904" 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: 2011-11/txt/msg00471.txt.bz2 This is a multi-part message in MIME format. --------------070304070003060004000904 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Content-length: 2610 On 11/17/2011 08:07 PM, Pedro Alves wrote: >> > Because gdb_test_multiple doesn't match pattern in output when "Ending >> > remote debugging" appeared in the output. We have to resort to >> > send_gdb/gdb_expect here. > Hmm, I'm confused. In this new revision the test is now: > > send_gdb "disconnect\n" > gdb_expect { > -re "warning: Pending tracepoints will not be resolved while GDB is disconnected.*Trace is running but will stop on detach; detach anyway\\? \\(y or n\\) $" { > pass "disconnect with pending tracepoint" > > send_gdb "y\n" > } > timeout {fail "(timeout) disconnect with pending tracepoint"} > } > > No "Ending remote debugging" in sight. GDB outputs that string > after the "detach anyway" query, so I think gdb_test_multiple > should just work. Also, we should always make sure to eat the prompt > after the "y", so that it doesn't remain in expect's buffer and > confuse following tests. Something like: This is a good tip. > > set test "disconnect with pending tracepoint" > gdb_test_multiple "disconnect" $test { > -re "warning: Pending tracepoints will not be resolved while GDB is disconnected.*Trace is running but will stop on detach; detach anyway\\? \\(y or n\\) $" { > pass $test > > set test "disconnected" > gdb_test_multiple "y" $test { > -re "$gdb_prompt $" { > pass "$test" > } > } > } > } My original attempt on using gdb_test is like this, set test "disconnect with pending tracepoint" gdb_test "disconnect" \ "warning: Pending tracepoint will not be resolved while GDB is disconnected" \ $test \ "Trace is running but will stop on detach; detach anyway\\? \\(y or n\\) $" \ "y" in proc gdb_test return [gdb_test_multiple $command $message { -re "\[\r\n\]*($pattern)\[\r\n\]+$gdb_prompt $" { if ![string match "" $message] then { pass "$message" } } -re "(${question_string})$" { send_gdb "$response_string\n"; exp_continue; } }] Query comes out prior to "warning:", so query matches, and there is no PASS and FAIL in gdb.sum. PATTERN passed to gdb_test is for matching the output _after_ query, and I used gdb_test in a wrong way. > > Note that "$gdb_prompt $" match takes precedence over > gdb_test_multiple's internal "Ending remote debugging.*$gdb_prompt $" > match. Is this precedence determined by the order of appending ${code} in proc gdb_test_multiple? > > Want to try that? Sure, they work. Updated patch as you suggested. -- Yao (齐尧) --------------070304070003060004000904 Content-Type: text/x-patch; name="0004-testcase-pending-tracepoint.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="0004-testcase-pending-tracepoint.patch" Content-length: 27409 gdb/testsuite/ * gdb.trace/pending.exp: New. * gdb.trace/pending.c: New. * gdb.trace/pendshr1.c: New. * gdb.trace/pendshr2.c: New. * gdb.trace/change-loc.exp (tracepoint_change_loc_1): Check one tracepoint location becomes pending. (tracepoint_change_loc_2): New. --- gdb/testsuite/gdb.trace/change-loc.exp | 129 ++++++++- gdb/testsuite/gdb.trace/pending.c | 50 +++ gdb/testsuite/gdb.trace/pending.exp | 525 ++++++++++++++++++++++++++++++++ gdb/testsuite/gdb.trace/pendshr1.c | 43 +++ gdb/testsuite/gdb.trace/pendshr2.c | 40 +++ 5 files changed, 782 insertions(+), 5 deletions(-) create mode 100644 gdb/testsuite/gdb.trace/pending.c create mode 100644 gdb/testsuite/gdb.trace/pending.exp create mode 100644 gdb/testsuite/gdb.trace/pendshr1.c create mode 100644 gdb/testsuite/gdb.trace/pendshr2.c diff --git a/gdb/testsuite/gdb.trace/change-loc.exp b/gdb/testsuite/gdb.trace/change-loc.exp index e125024..d01f71c 100644 --- a/gdb/testsuite/gdb.trace/change-loc.exp +++ b/gdb/testsuite/gdb.trace/change-loc.exp @@ -118,27 +118,145 @@ proc tracepoint_change_loc_1 { trace_type } { \[0-9\]+\[\t \]+\(|fast \)tracepoint\[ \]+keep y.*\.*4\.1.* in func4.*4\.2.* in func4.*" \ "tracepoint with two locations" - setup_kfail "gdb/13392" x86_64-*-* - gdb_test "continue" ".*Breakpoint.*marker.*at.*$srcfile.*" \ - "continue to marker 2" - + gdb_test_multiple "continue" "continue to marker 2" { + -re ".*Breakpoint.*marker.*at.*$srcfile.*$gdb_prompt $" { + pass "continue to marker 2" + } + -re ".*$gdb_prompt $" { + kfail "gdb/13392" "continue to marker 2" + set pf_prefix $old_pf_prefix + return + } + } # tracepoint has three locations after shlib change-loc-2 is loaded. gdb_test "info trace" \ "Num Type\[ \]+Disp Enb Address\[ \]+What.* \[0-9\]+\[\t \]+\(|fast \)tracepoint\[ \]+keep y.*\.*4\.1.* in func4.*4\.2.* in func4.*4\.3.* in func4 .*" \ "tracepoint with three locations" + gdb_test "continue" ".*Breakpoint.*marker.*at.*$srcfile.*" \ + "continue to marker 3" + + # shlib is unloaded, there are still three locations, but one is pending. + gdb_test "info trace" \ + "Num Type\[ \]+Disp Enb Address\[ \]+What.* +\[0-9\]+\[\t \]+\(|fast \)tracepoint\[ \]+keep y.*\.*4\.1.* in func4.*4\.2.* in func4.*4\.3.* \\[\t \]+set_tracepoint.*" \ + "tracepoint with two locations (unload)" + gdb_test_no_output "tstop" - setup_kfail "gdb/13392" x86_64-*-* gdb_test "tfind" "Found trace frame 0, tracepoint 4.*" "tfind frame 0" gdb_test "tfind" "Target failed to find requested trace frame\\..*" set pf_prefix $old_pf_prefix } +# Set pending tracepoint. + +proc tracepoint_change_loc_2 { trace_type } { + global srcdir + global srcfile + global subdir + global pcreg + global binfile + global gdb_prompt + global pf_prefix + + set old_pf_prefix $pf_prefix + set pf_prefix "$pf_prefix 2 $trace_type:" + + gdb_exit + gdb_start + gdb_reinitialize_dir $srcdir/$subdir + + gdb_test_multiple "${trace_type} set_tracepoint" "set pending tracepoint" { + -re ".*Make \(|fast \)tracepoint pending.*y or \\\[n\\\]. $" { + gdb_test "y" "\(Fast t|T\)racepoint.*set_tracepoint.*pending." "set pending tracepoint" + } + } + + gdb_trace_setactions "set action for tracepoint" "" \ + "collect \$$pcreg" "^$" + + # tracepoint has no location information now. + gdb_test "info trace" \ + "Num Type\[ \]+Disp Enb Address\[ \]+What.* +\[0-9\]+\[\t \]+\(|fast \)tracepoint\[ \]+keep y.*PENDING.*set_tracepoint.*" \ + "single pending tracepoint info (without symbols)" + + gdb_load ${binfile} + # tracepoint has one location after executable is loaded. + gdb_test "info trace" \ + "Num Type\[ \]+Disp Enb Address\[ \]+What.* +\[0-9\]+\[\t \]+\(|fast \)tracepoint\[ \]+keep y.*func4.*" \ + "tracepoint with one location" + + set main_bp 0 + gdb_test_multiple "break main" "set breakpoint on main" { + -re "Breakpoint (\[0-9\]*) at .*, line.*$gdb_prompt $" { + set main_bp $expect_out(1,string) + } + } + gdb_run_cmd + + gdb_test "" \ + ".*Breakpoint.*main.*at.*$srcfile.*" \ + "run to main" + gdb_test_no_output "delete break $main_bp" + + # tracepoint has two locations after shlib change-loc-1 is loaded. + gdb_test "info trace" \ + "Num Type\[ \]+Disp Enb Address\[ \]+What.* +\[0-9\]+\[\t \]+\(|fast \)tracepoint\[ \]+keep y.*\.*1\.1.* in func4.*1\.2.* in func4.*" \ + "tracepoint with two locations" + + gdb_test "break marker" "Breakpoint.*at.* file .*$srcfile, line.*" \ + "breakpoint on marker" + + # tracepoint with two locations will be downloaded and installed. + gdb_test_no_output "tstart" + + gdb_test_multiple "continue" "continue to marker 1" { + -re ".*Breakpoint.*marker.*at.*$srcfile.*$gdb_prompt $" { + pass "continue to marker 1" + } + -re ".*$gdb_prompt $" { + kfail "gdb/13392" "continue to marker 1" + set pf_prefix $old_pf_prefix + return + } + } + + gdb_test "continue" ".*Breakpoint.*marker.*at.*$srcfile.*" \ + "continue to marker 2" + + # tracepoint has three locations after shlib change-loc-2 is loaded. + gdb_test "info trace" \ + "Num Type\[ \]+Disp Enb Address\[ \]+What.* +\[0-9\]+\[\t \]+\(|fast \)tracepoint\[ \]+keep y.*\.*1\.1.* in func4.*1\.2.* in func4.*1\.3.* in func4 .*" \ + "tracepoint with three locations" + + gdb_test "continue" ".*Breakpoint.*marker.*at.*$srcfile.*" \ + "continue to marker 3" + + # shlib is unloaded, there are still three locations, but one is pending. + gdb_test "info trace" \ + "Num Type\[ \]+Disp Enb Address\[ \]+What.* +\[0-9\]+\[\t \]+\(|fast \)tracepoint\[ \]+keep y.*\.*1\.1.* in func4.*1\.2.* in func4.*1\.3.* \\[\t \]+set_tracepoint.*" \ + "tracepoint with two locations (unload)" + + gdb_test_no_output "tstop" + + gdb_test "tfind" "Found trace frame 0, tracepoint 1.*" "tfind frame 0" + gdb_test "tfind" "Found trace frame 1, tracepoint 1.*" "tfind frame 1" + gdb_test "tfind" "Found trace frame 2, tracepoint 1.*" "tfind frame 2" + gdb_test "tfind" "Target failed to find requested trace frame\\..*" + + set pf_prefix $old_pf_prefix +} tracepoint_change_loc_1 "trace" +tracepoint_change_loc_2 "trace" # Re-compile test case with IPA. set libipa $objdir/../gdbserver/libinproctrace.so @@ -151,3 +269,4 @@ if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile executable \ } tracepoint_change_loc_1 "ftrace" +tracepoint_change_loc_2 "ftrace" diff --git a/gdb/testsuite/gdb.trace/pending.c b/gdb/testsuite/gdb.trace/pending.c new file mode 100644 index 0000000..08c751b --- /dev/null +++ b/gdb/testsuite/gdb.trace/pending.c @@ -0,0 +1,50 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2011 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 . */ + +#include +#include + +extern void pendfunc (int x); + +static void +marker () {} + +int main() +{ + const char *libname = "pendshr2.sl"; + void *h; + int (*p_func) (int); + + pendfunc (3); + pendfunc (4); + pendfunc (3); + + marker (); + + h = dlopen (libname, RTLD_LAZY); + if (h == NULL) return 1; + + p_func = dlsym (h, "pendfunc2"); + if (p_func == NULL) return 2; + + (*p_func) (4); + + marker (); + + dlclose (h); + return 0; +} diff --git a/gdb/testsuite/gdb.trace/pending.exp b/gdb/testsuite/gdb.trace/pending.exp new file mode 100644 index 0000000..5851f04 --- /dev/null +++ b/gdb/testsuite/gdb.trace/pending.exp @@ -0,0 +1,525 @@ +# Copyright 2011 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 +} + +if {[skip_shlib_tests]} { + return 0 +} + +set testfile "pending" +set libfile1 "pendshr1" +set libfile2 "pendshr2" +set executable $testfile +set srcfile $testfile.c +set libsrc1 $srcdir/$subdir/$libfile1.c +set libsrc2 $srcdir/$subdir/$libfile2.c +set binfile $objdir/$subdir/$testfile +set lib_sl1 $objdir/$subdir/$libfile1.sl +set lib_sl2 $objdir/$subdir/$libfile2.sl + +set lib_opts [gdb_target_symbol_prefix_flags] + +if { [gdb_compile_shlib $libsrc1 $lib_sl1 $lib_opts] != "" + || [gdb_compile_shlib $libsrc2 $lib_sl2 $lib_opts] != ""} { + untested "Could not compile either $libsrc1 or $libsrc2" + return -1 +} + +set exec_opts [list debug shlib=$lib_sl1 shlib_load] +if { [gdb_compile $srcdir/$subdir/$srcfile $binfile executable $exec_opts] != "" } { + untested "Failed to compile $srcfile" + return -1 +} + +clean_restart $executable + +gdb_load_shlibs $lib_sl1 +gdb_load_shlibs $lib_sl2 + +if ![runto_main] { + fail "Can't run to main to check for trace support" + return -1 +} + +if ![gdb_target_supports_trace] { + unsupported "Current target does not support trace" + return -1; +} + +# Verify pending tracepoint is resolved to running to main. + +proc pending_tracepoint_resolved { trace_type } { + global srcdir + global subdir + global binfile + global srcfile + global lib_sl1 + global pf_prefix + + set old_pf_prefix $pf_prefix + lappend pf_prefix "$trace_type" "resolved:" + + # Start with a fresh gdb. + gdb_exit + gdb_start + gdb_reinitialize_dir $srcdir/$subdir + + gdb_test_multiple "$trace_type set_point1" "set pending tracepoint" { + -re ".*Make \(fast |\)tracepoint pending.*y or \\\[n\\\]. $" { + gdb_test "y" "\(Fast t|T\)racepoint.*set_point1.*pending." \ + "set pending tracepoint (without symbols)" + } + } + + gdb_test "info trace" \ + "Num Type\[ \]+Disp Enb Address\[ \]+What.* +\[0-9\]+\[\t \]+\(fast |\)tracepoint\[ \]+keep y.*PENDING.*set_point1.*" \ + "single pending tracepoint info (without symbols)" + + gdb_load ${binfile} + + gdb_test "break main" "Breakpoint.*at.* file .*$srcfile, line.*" \ + "breakpoint function" + + gdb_run_cmd + gdb_test "" "Breakpoint 2, main.*" + + # Run to main which should resolve a pending tracepoint + gdb_test "info trace" \ + "Num Type\[ \]+Disp Enb Address\[ \]+What.* +\[0-9\]+\[\t \]+\(fast |\)tracepoint\[ \]+keep y.*pendfunc.*" \ + "single tracepoint info" + + set pf_prefix $old_pf_prefix +} + +# Verify pending tracepoint is resolved and works as expected. + +proc pending_tracepoint_works { trace_type } { + global executable + global srcfile + global lib_sl1 + global pf_prefix + global gdb_prompt + + set old_pf_prefix $pf_prefix + lappend pf_prefix "$trace_type" "works:" + + # Restart with a fresh gdb. + clean_restart $executable + + # Test setting and querying pending tracepoints + + gdb_test_multiple "$trace_type set_point1" "set pending tracepoint" { + -re ".*Make \(fast |\)tracepoint pending.*y or \\\[n\\\]. $" { + gdb_test "y" "\(Fast t|T\)racepoint.*set_point1.*pending." "set pending tracepoint" + } + } + + gdb_test "info trace" \ + "Num Type\[ \]+Disp Enb Address\[ \]+What.* +\[0-9\]+\[\t \]+\(fast |\)tracepoint\[ \]+keep y.*PENDING.*set_point1.*" \ + "single pending tracepoint info" + + # Run to main which should resolve a pending tracepoint + gdb_test "break main" "Breakpoint.*at.* file .*$srcfile, line.*" \ + "breakpoint function" + gdb_run_cmd + gdb_test "" "Breakpoint 2, main.*" + + gdb_test "break marker" "Breakpoint.*at.* file .*$srcfile, line.*" \ + "breakpoint on marker" + + gdb_test_no_output "tstart" "start trace experiment" + + gdb_test_multiple "continue" "continue to marker" { + -re "Continuing.\r\n\r\nBreakpoint.*marker.*at.*$srcfile.*$gdb_prompt $" { + pass "continue to marker" + } + -re ".*$gdb_prompt $" { + kfail "gdb/13392" "continue to marker" + set pf_prefix $old_pf_prefix + return + } + } + + gdb_test "tstop" "\[\r\n\]+" "stop trace experiment" + + gdb_test "tfind start" "#0 .*" "tfind test frame 0" + gdb_test "tfind" "Found trace frame 1, tracepoint 1.*" "tfind test frame 1" + gdb_test "tfind" "Found trace frame 2, tracepoint 1.*" "tfind test frame 2" + gdb_test "tfind" "Target failed to find requested trace frame..*" "tfind test frame" + + set pf_prefix $old_pf_prefix +} + +# Verify pending tracepoint is resolved during trace. + +proc pending_tracepoint_resolved_during_trace { trace_type } { + global executable + global srcfile + global gdb_prompt + global lib_sl1 + global pf_prefix + + set old_pf_prefix $pf_prefix + lappend pf_prefix "$trace_type" "resolved_in_trace:" + + # Start with a fresh gdb. + clean_restart $executable + if ![runto_main] { + fail "Can't run to main" + set pf_prefix $old_pf_prefix + return -1 + } + + gdb_test_multiple "$trace_type set_point2" "set pending tracepoint on set_point2" { + -re ".*Make \(fast |\)tracepoint pending.*y or \\\[n\\\]. $" { + gdb_test "y" "\(Fast t|T\)racepoint.*set_point2.*pending." \ + "set pending tracepoint (without symbols)" + } + } + + gdb_test "info trace" \ + "Num Type\[ \]+Disp Enb Address\[ \]+What.* +\[0-9\]+\[\t \]+\(fast |\)tracepoint\[ \]+keep y.*PENDING.*set_point2.*" \ + "single pending tracepoint on set_point2" + + gdb_test "break marker" "Breakpoint.*at.* file .*$srcfile, line.*" \ + "breakpoint on marker" + + gdb_test_no_output "tstart" "start trace experiment" + + gdb_test "continue" "Continuing.\r\n\r\nBreakpoint.*marker.*at.*pending.c.*" \ + "continue to marker 1" + + gdb_test_multiple "continue" "continue to marker 2" { + -re "Continuing.\r\n\r\nBreakpoint.*marker.*at.*$srcfile.*$gdb_prompt $" { + pass "continue to marker 2" + } + -re ".*$gdb_prompt $" { + kfail "gdb/13392" "continue to marker 2" + set pf_prefix $old_pf_prefix + return + } + } + + gdb_test "tstop" "\[\r\n\]+" "stop trace experiment" + + # tracepoint should be resolved. + gdb_test "info trace" \ + "Num Type\[ \]+Disp Enb Address\[ \]+What.* +\[0-9\]+\[\t \]+\(fast |\)tracepoint\[ \]+keep y.*pendfunc2.*" \ + "tracepoint is resolved" + + gdb_test "tfind start" "#0 .*" "tfind test frame 0" + gdb_test "tfind" "Target failed to find requested trace frame..*" "tfind test frame" + + set pf_prefix $old_pf_prefix +} + +# Verify pending tracepoint is resolved and installed during trace. + +proc pending_tracepoint_installed_during_trace { trace_type } { + global executable + global srcfile + global lib_sl1 + global gdb_prompt + global pf_prefix + global hex + + set old_pf_prefix $pf_prefix + lappend pf_prefix "$trace_type" "installed_in_trace:" + + # Start with a fresh gdb. + clean_restart $executable + if ![runto_main] { + fail "Can't run to main" + set pf_prefix $old_pf_prefix + return -1 + } + + gdb_test "next" ".*" + gdb_test "trace main" "Tracepoint \[0-9\] at .*" "set tracepoint on main" + + gdb_test "break marker" "Breakpoint.*at.* file .*$srcfile, line.*" \ + "breakpoint on marker" + + gdb_test_no_output "tstart" "start trace experiment" + + gdb_test "continue" "Continuing.\r\n\r\nBreakpoint.*marker.*at.*${srcfile}.*" \ + "continue to marker 1" + + # Set a pending tracepoint during a tracing experiment. + gdb_test_multiple "$trace_type set_point2" "set pending tracepoint on set_point2" { + -re ".*Make \(fast |\)tracepoint pending.*y or \\\[n\\\]. $" { + gdb_test "y" "\(Fast t|T\)racepoint.*set_point2.*pending." \ + "set pending tracepoint" + } + } + + gdb_test "info trace" \ + "Num Type\[ \]+Disp Enb Address\[ \]+What.* +\[0-9\]+\[\t \]+\(fast |\)tracepoint\[ \t\]+keep y.*PENDING.*set_point2.*" \ + "single pending tracepoint on set_point2" + + gdb_test_multiple "continue" "continue to marker 2" { + -re "Continuing.\r\n\r\nBreakpoint.*marker.*at.*$srcfile.*$gdb_prompt $" { + pass "continue to marker 2" + } + -re ".*$gdb_prompt $" { + kfail "gdb/13392" "continue to marker 2" + set pf_prefix $old_pf_prefix + return + } + } + + gdb_test "tstop" "\[\r\n\]+" "stop trace experiment" + + # tracepoint should be resolved. + gdb_test "info trace" \ + "Num Type\[ \]+Disp Enb Address\[ \]+What.* +\[0-9\]+\[\t \]+\(fast |\)tracepoint\[ \]+keep y.*pendfunc2.*" \ + "tracepoint is resolved" + + gdb_test "tfind start" "#0 $hex in pendfunc2 .*" "tfind test frame 0" + gdb_test "tfind" "Target failed to find requested trace frame..*" "tfind test frame" + + set pf_prefix $old_pf_prefix +} + + +# Verify pending tracepoint will no longer work if we disconnect during tracing. + +proc pending_tracepoint_disconnect_during_trace { trace_type } { + global executable + global srcfile + global lib_sl1 + global pf_prefix + global gdb_prompt + + set old_pf_prefix $pf_prefix + lappend pf_prefix "$trace_type" "disconn:" + + # Start with a fresh gdb. + clean_restart $executable + if ![runto_main] { + fail "Can't run to main" + set pf_prefix $old_pf_prefix + return -1 + } + + gdb_test_multiple "trace pendfunc3" "set pending tracepoint on set_point2" { + -re ".*Make \(fast |\)tracepoint pending.*y or \\\[n\\\]. $" { + gdb_test "y" "\(Fast t|T\)racepoint.*pendfunc3.*pending." \ + "set pending tracepoint on pendfun3" + } + } + + gdb_test "break marker" "Breakpoint.*at.* file .*$srcfile, line.*" \ + "breakpoint on marker" + + gdb_test_no_output "tstart" "start trace experiment" + + gdb_test "continue" "Continuing.\r\n\r\nBreakpoint.*marker.*at.*pending.c.*" \ + "continue to marker" + + set test "disconnect with pending tracepoint" + gdb_test_multiple "disconnect" $test { + -re "warning: Pending tracepoints will not be resolved while GDB is disconnected.*Trace is running but will stop on detach; detach anyway\\? \\(y or n\\) $" { + pass $test + + set test "disconnected" + gdb_test_multiple "y" $test { + -re "$gdb_prompt $" { + pass "$test" + } + } + } + } + + set pf_prefix $old_pf_prefix +} + + +# Verify disconnect after pending tracepoint has been resolved. + +proc pending_tracepoint_disconnect_after_resolved { trace_type } { + global executable + global srcfile + global lib_sl1 + global gdb_prompt + global pf_prefix + + set old_pf_prefix $pf_prefix + lappend pf_prefix "$trace_type" "disconn_resolved:" + + # Start with a fresh gdb. + clean_restart $executable + if ![runto_main] { + fail "Can't run to main" + set pf_prefix $old_pf_prefix + return -1 + } + + gdb_test_multiple "trace set_point2" "set pending tracepoint on set_point2" { + -re ".*Make \(fast |\)tracepoint pending.*y or \\\[n\\\]. $" { + gdb_test "y" "\(Fast t|T\)racepoint.*set_point2.*pending." \ + "set pending tracepoint on pendfun2" + } + } + + gdb_test "break marker" "Breakpoint.*at.* file .*$srcfile, line.*" \ + "breakpoint on marker" + + gdb_test_no_output "tstart" "start trace experiment" + + gdb_test "continue" "Continuing.\r\n\r\nBreakpoint.*marker.*at.*pending.c.*" \ + "continue to marker 1" + gdb_test "continue" "Continuing.\r\n\r\nBreakpoint.*marker.*at.*pending.c.*" \ + "continue to marker 2" + + # There should be no pending tracepoint, so no warning should be emitted. + set test "disconnect with resolved tracepoint" + gdb_test_multiple "disconnect" $test { + -re "warning: Pending tracepoints will not be resolved while GDB is disconnected.*Trace is running but will stop on detach; detach anyway\\? \\(y or n\\) $" { + fail $test + } + -re "Trace is running but will stop on detach; detach anyway\\? \\(y or n\\) $" { + pass $test + } + } + set test "disconnected" + gdb_test_multiple "y" $test { + -re "$gdb_prompt $" { + pass "$test" + } + } + + set pf_prefix $old_pf_prefix +} + +# Verify action works properly in resolved tracepoint. + +proc pending_tracepoint_with_action_resolved { trace_type } { + global executable + global srcfile + global lib_sl1 + global gdb_prompt + global pf_prefix + + set old_pf_prefix $pf_prefix + lappend pf_prefix "$trace_type" "action_resolved:" + + # Start with a fresh gdb. + clean_restart $executable + if ![runto_main] { + fail "Can't run to main" + set pf_prefix $old_pf_prefix + return -1 + } + + gdb_test_multiple "$trace_type set_point2" "set pending tracepoint on set_point2" { + -re ".*Make \(fast |\)tracepoint pending.*y or \\\[n\\\]. $" { + gdb_test "y" "\(Fast t|T\)racepoint.*set_point2.*pending." \ + "set pending tracepoint (without symbols)" + } + } + + set pcreg "pc" + if [is_amd64_regs_target] { + set pcreg "rip" + } elseif [is_x86_like_target] { + set pcreg "eip" + } + + gdb_trace_setactions "set action for pending tracepoint" "" \ + "collect \$$pcreg" "^$" + + gdb_test "info trace" \ + "Num Type\[ \]+Disp Enb Address\[ \]+What.* +\[0-9\]+\[\t \]+\(fast |\)tracepoint\[ \]+keep y.*PENDING.*set_point2.*" \ + "single pending tracepoint on set_point2" + + gdb_test "break marker" "Breakpoint.*at.* file .*$srcfile, line.*" \ + "breakpoint on marker" + + gdb_test_no_output "tstart" "start trace experiment" + + gdb_test "continue" "Continuing.\r\n\r\nBreakpoint.*marker.*at.*pending.c.*" \ + "continue to marker 1" + + gdb_test_multiple "continue" "continue to marker 2" { + -re "Continuing.\r\n\r\nBreakpoint.*marker.*at.*$srcfile.*$gdb_prompt $" { + pass "continue to marker 2" + } + -re ".*$gdb_prompt $" { + kfail "gdb/13392" "continue to marker 2" + set pf_prefix $old_pf_prefix + return + } + } + + gdb_test "tstop" "\[\r\n\]+" "stop trace experiment" + + # tracepoint should be resolved. + gdb_test "info trace" \ + "Num Type\[ \]+Disp Enb Address\[ \]+What.* +\[0-9\]+\[\t \]+\(fast |\)tracepoint\[ \]+keep y.*pendfunc2.*" \ + "tracepoint is resolved" + + gdb_test "tfind start" "#0 .*" "tfind test frame 0" + gdb_test "tdump" "Data collected at tracepoint .*, trace frame \[0-9\]:.*\\$${pcreg} = .*" + gdb_test "tfind" "Target failed to find requested trace frame..*" "tfind test frame" + + set pf_prefix $old_pf_prefix +} + +pending_tracepoint_resolved "trace" + +pending_tracepoint_works "trace" + +pending_tracepoint_resolved_during_trace "trace" + +pending_tracepoint_disconnect_during_trace "trace" + +pending_tracepoint_disconnect_after_resolved "trace" + +pending_tracepoint_with_action_resolved "trace" + +pending_tracepoint_installed_during_trace "trace" + +# Re-compile test case with IPA. +set libipa $objdir/../gdbserver/libinproctrace.so +gdb_load_shlibs $libipa + +lappend exec_opts "shlib=$libipa" + +if { [gdb_compile $srcdir/$subdir/$srcfile $binfile executable $exec_opts] != "" } { + untested "Failed to compile $srcfile" + return -1 +} + +pending_tracepoint_resolved "ftrace" +pending_tracepoint_works "ftrace" +pending_tracepoint_resolved_during_trace "ftrace" +pending_tracepoint_disconnect_during_trace "ftrace" +pending_tracepoint_disconnect_after_resolved "ftrace" +pending_tracepoint_with_action_resolved "ftrace" +pending_tracepoint_installed_during_trace "ftrace" diff --git a/gdb/testsuite/gdb.trace/pendshr1.c b/gdb/testsuite/gdb.trace/pendshr1.c new file mode 100644 index 0000000..f2826c6 --- /dev/null +++ b/gdb/testsuite/gdb.trace/pendshr1.c @@ -0,0 +1,43 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2011 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 . */ + +#ifdef SYMBOL_PREFIX +#define SYMBOL(str) SYMBOL_PREFIX #str +#else +#define SYMBOL(str) #str +#endif + +static void +pendfunc1 (void) +{ + int x = 0; + int y = x + 4; +} + +void +pendfunc (int x) +{ + /* `set_point1' is the label where we'll set multiple tracepoints and + breakpoints at. The insn at the label must the large enough to + fit a fast tracepoint jump. */ + asm (" .global " SYMBOL(set_point1) "\n" + SYMBOL(set_point1) ":\n" +#if (defined __x86_64__ || defined __i386__) + " call " SYMBOL(pendfunc1) "\n" +#endif + ); +} diff --git a/gdb/testsuite/gdb.trace/pendshr2.c b/gdb/testsuite/gdb.trace/pendshr2.c new file mode 100644 index 0000000..46eedee --- /dev/null +++ b/gdb/testsuite/gdb.trace/pendshr2.c @@ -0,0 +1,40 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2011 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 . */ + +#ifdef SYMBOL_PREFIX +#define SYMBOL(str) SYMBOL_PREFIX #str +#else +#define SYMBOL(str) #str +#endif + +static void +foo () +{} + +void +pendfunc2 (int x) +{ + /* `set_point2' is the label where we'll set multiple tracepoints and + breakpoints at. The insn at the label must the large enough to + fit a fast tracepoint jump. */ + asm (" .global " SYMBOL(set_point2) "\n" + SYMBOL(set_point2) ":\n" +#if (defined __x86_64__ || defined __i386__) + " call " SYMBOL(foo) "\n" +#endif + ); +} -- 1.7.0.4 --------------070304070003060004000904--