aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.trace/pending.exp
diff options
context:
space:
mode:
authorYao Qi <yao@codesourcery.com>2011-11-18 01:21:35 +0000
committerYao Qi <yao@codesourcery.com>2011-11-18 01:21:35 +0000
commitbfccc43c1218b6d89bb021381276ac742e7a9a9e (patch)
tree4cb5a36039810f966bf54f316a3123ade3e3d952 /gdb/testsuite/gdb.trace/pending.exp
parent3ea46bff735f66cca658e990155816c57cc194d3 (diff)
downloadgdb-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.exp525
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"