diff options
author | Yao Qi <yao@codesourcery.com> | 2011-11-18 01:21:35 +0000 |
---|---|---|
committer | Yao Qi <yao@codesourcery.com> | 2011-11-18 01:21:35 +0000 |
commit | bfccc43c1218b6d89bb021381276ac742e7a9a9e (patch) | |
tree | 4cb5a36039810f966bf54f316a3123ade3e3d952 /gdb/testsuite/gdb.trace/pending.exp | |
parent | 3ea46bff735f66cca658e990155816c57cc194d3 (diff) | |
download | gdb-bfccc43c1218b6d89bb021381276ac742e7a9a9e.zip gdb-bfccc43c1218b6d89bb021381276ac742e7a9a9e.tar.gz gdb-bfccc43c1218b6d89bb021381276ac742e7a9a9e.tar.bz2 |
gdb/
* breakpoint.c (create_breakpoint): Produce query message according to
breakpoint's type.
Allocate tracepoint per correct type.
Don't check SALs for pending fast tracepoints.
* tracepoint.c (process_tracepoint_on_disconnect): New.
(disconnect_tracing): Call process_tracepoint_on_disconnect.
gdb/doc/
* gdb.texinfo (Create and Delete Tracepoints): Mention pending
tracepoint.
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.
Diffstat (limited to 'gdb/testsuite/gdb.trace/pending.exp')
-rw-r--r-- | gdb/testsuite/gdb.trace/pending.exp | 525 |
1 files changed, 525 insertions, 0 deletions
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 <http://www.gnu.org/licenses/>. + +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" |