| # Copyright 2012 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 {[skip_shlib_tests]} { |
| return 0 |
| } |
| |
| standard_testfile pending.c |
| set libfile1 "pendshr1" |
| set libfile2 "pendshr2" |
| set executable $testfile |
| set libsrc1 $srcdir/$subdir/$libfile1.c |
| set libsrc2 $srcdir/$subdir/$libfile2.c |
| set lib_sl1 [standard_output_file pendshr1.sl] |
| set lib_sl2 [standard_output_file pendshr2.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 |
| } |
| |
| load_lib mi-support.exp |
| set MIFLAGS "-i=mi" |
| |
| # Test when GDB connects to a disconnected stub, existing tracepoints in |
| # remote stub can be uploaded to GDB, and GDB emits MI notification if |
| # new tracepoints are created. |
| |
| proc test_reconnect { } { with_test_prefix "reconnect" { |
| |
| global gdbserver_reconnect_p |
| global gdb_prompt |
| global executable |
| global lib_sl1 lib_sl2 |
| |
| set gdbserver_reconnect_p 1 |
| if { [info proc gdb_reconnect] == "" } { |
| return 0 |
| } |
| |
| clean_restart $executable |
| gdb_load_shlibs $lib_sl1 |
| gdb_load_shlibs $lib_sl2 |
| if ![runto_main] then { |
| fail "Can't run to main" |
| return 0 |
| } |
| gdb_test "trace marker" "Tracepoint.*at.* file .*" \ |
| "tracepointpoint on marker" |
| gdb_test_no_output "tstart" "start trace experiment" |
| |
| set test "disconnect" |
| gdb_test_multiple "disconnect" $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" |
| } |
| } |
| } |
| } |
| |
| gdb_exit |
| |
| if [mi_gdb_start] { |
| return |
| } |
| |
| global srcdir |
| global subdir |
| global binfile |
| |
| mi_gdb_reinitialize_dir $srcdir/$subdir |
| mi_gdb_load ${binfile} |
| |
| global gdbserver_protocol |
| global gdbserver_gdbport |
| |
| send_gdb "47-target-select $gdbserver_protocol $gdbserver_gdbport\n" |
| |
| global mi_gdb_prompt |
| set test "tracepoint created" |
| gdb_expect { |
| -re "=breakpoint-created,bkpt=\{number=\"1\",type=\"tracepoint\",disp=\"keep\",enabled=\"y\",.*,func=\"marker\".*${mi_gdb_prompt}" { |
| pass $test |
| } |
| timeout { |
| fail $test |
| } |
| } |
| |
| set gdbserver_reconnect_p 0 |
| }} |
| |
| |
| # Test 'breakpoint-modified' notification is emited when pending tracepoints are |
| # resolved. |
| |
| proc test_pending_resolved { } { with_test_prefix "pending resolved" { |
| global decimal hex |
| global executable |
| global srcdir |
| global subdir |
| global binfile |
| global lib_sl1 lib_sl2 |
| global mi_gdb_prompt |
| |
| gdb_exit |
| if [mi_gdb_start] { |
| continue |
| } |
| |
| mi_gdb_reinitialize_dir $srcdir/$subdir |
| mi_gdb_load ${binfile} |
| mi_load_shlibs $lib_sl1 $lib_sl2 |
| |
| # Create a pending tracepoint on pendfunc2 |
| mi_gdb_test "-break-insert -a -f pendfunc2" \ |
| {.*\^done,bkpt=.*addr=\"<PENDING>\".*} \ |
| "insert breakpoint on pendfunc2" |
| # Insert breakpoint on marker |
| mi_gdb_test "-break-insert marker" {.*\^done,bkpt=.*} \ |
| "insert breakpoint on marker" |
| |
| mi_run_cmd |
| mi_expect_stop "breakpoint-hit" "marker" ""\ |
| ".*" ".*" {"" "disp=\"keep\""} \ |
| "continue to marker breakpoint" |
| mi_gdb_test "-trace-start" {\^done} "trace start" |
| |
| mi_send_resuming_command "exec-continue" "continuing execution to marker 1" |
| |
| set test "tracepoint on pendfunc2 resolved" |
| gdb_expect { |
| -re ".*=breakpoint-modified,bkpt=\{number=\"1\",type=\"tracepoint\".*.*times=\"0\"" { |
| pass "$test" |
| } |
| -re ".*${mi_gdb_prompt}$" { |
| fail $test |
| } |
| timeout { |
| fail "$test (timeout)" |
| } |
| } |
| mi_expect_stop "breakpoint-hit" "marker" ".*" ".*" ".*" \ |
| {"" "disp=\"keep\""} "continue to marker" |
| |
| |
| mi_gdb_test "-trace-stop" {\^done,.*} "trace stop" |
| mi_gdb_test "-trace-find frame-number 0" \ |
| "-trace-find frame-number 0\r\n\\^done,found=\"1\",tracepoint=\"${decimal}\",traceframe=\"0\",frame=\{.*" \ |
| "-trace-find frame-number 0" |
| mi_gdb_test "-trace-find none" {\^done,found="0"} "back to live inferior" |
| |
| mi_send_resuming_command "exec-continue" "continuing to exit" |
| set test "tracepoint on pendfunc2 becomes pending again" |
| gdb_expect { |
| -re ".*=breakpoint-modified,bkpt=\{number=\"1\",type=\"tracepoint\".*addr=\"<PENDING>\",.*times=\"0\"" { |
| pass "$test" |
| } |
| -re ".*${mi_gdb_prompt}$" { |
| fail $test |
| } |
| timeout { |
| fail "$test (timeout)" |
| } |
| } |
| |
| mi_expect_stop "exited-normally" "" "" "" "" "" "" |
| }} |
| |
| # Test target supports tracepoints or not. |
| |
| 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; |
| } |
| |
| gdb_exit |
| |
| test_reconnect |
| |
| test_pending_resolved |
| |
| return 0 |