Index: gdb/testsuite/gdb.trace/strace.exp |
diff --git a/gdb/testsuite/gdb.trace/strace.exp b/gdb/testsuite/gdb.trace/strace.exp |
index d9e90b6efd8660036d70575cd250436318f26a2b..ab7ccb5797558aa1cd1ef9f536b8bd51d349938b 100644 |
--- a/gdb/testsuite/gdb.trace/strace.exp |
+++ b/gdb/testsuite/gdb.trace/strace.exp |
@@ -1,4 +1,4 @@ |
-# Copyright 2011-2012 Free Software Foundation, Inc. |
+# Copyright 2011-2013 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 |
@@ -12,7 +12,7 @@ |
# 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"; |
+load_lib "trace-support.exp" |
if {[skip_shlib_tests]} { |
return 0 |
@@ -37,231 +37,359 @@ if { [gdb_compile $srcdir/$subdir/$srcfile $binfile executable $additional_flags |
return -1 |
} |
-proc strace_info_marker { } { with_test_prefix "info_marker" { |
+# Test that the socket file is removed when GDB quits, detaches or |
+# resumes the inferior until it exits. |
+ |
+proc strace_remove_socket { action } { |
+ with_test_prefix "remove_socket_after_${action}" { |
+ |
global executable |
global gdb_prompt |
+ global libipa |
# Restart with a fresh gdb. |
clean_restart $executable |
+ gdb_load_shlibs $libipa |
if ![runto_main] { |
fail "Can't run to main" |
return -1 |
} |
- # List the markers in program. They should be disabled. |
+ # List the markers in program. |
gdb_test "info static-tracepoint-markers" \ |
".*ust/bar\[\t \]+n\[\t \]+.*ust/bar2\[\t \]+n\[\t \]+.*" |
- # List all the thread. It is expected to get three threads without |
- # any errors. |
- gdb_test_multiple "info threads 3 2 1" "info threads" { |
- -re "3\[ \t\]+Thread .*2\[ \t\]+Thread .*1\[ \t\]+Thread .*${gdb_prompt} $" { |
- pass "info threads" |
+ set pid "" |
+ set test "collect pid" |
+ gdb_test_multiple "info inferiors" $test { |
+ -re "process (\[-0-9a-fx\]+) \[^\n\]*\n.*${gdb_prompt} $" { |
+ set pid $expect_out(1,string) |
+ pass $test |
+ } |
+ -re ".*${gdb_prompt} $" { |
+ fail $test |
} |
} |
-}} |
-proc strace_probe_marker { } { with_test_prefix "probe_marker" { |
- global executable |
- global expect_out |
- global gdb_prompt |
- global hex |
+ set test "socket file exists" |
+ set socket_file "/tmp/gdb_ust${pid}" |
+ set status [remote_exec target "sh -c { \[ -S $socket_file \] }"] |
- # Restart with a fresh gdb. |
- clean_restart $executable |
- if ![runto_main] { |
- fail "Can't run to main" |
- return -1 |
+ if { [lindex $status 0] == 0 } { |
+ pass $test |
+ } else { |
+ fail $test |
} |
- gdb_test "strace -m ust/bar" "Static tracepoint \[0-9\]+ at ${hex}: file.*" |
- gdb_test "strace -m ust/bar2" "Static tracepoint \[0-9\]+ at ${hex}: file.*" |
- # Two trace markers should be enabled. |
- gdb_test "info static-tracepoint-markers" \ |
- "ust/bar\[\t \]+y\[\t \]+$hex .*ust/bar2\[\t \]+y\[\t \]+$hex.*" |
- |
- gdb_test "break end" "Breakpoint \[0-9\]+ at.*" |
+ send_gdb "${action}\n" |
+ gdb_expect { |
+ -re "A debugging session is active.\r\n.*\r\nQuit anyway\\? \\(y or n\\) $" { |
+ send_gdb "y\n" |
+ } |
+ -re "Detaching .*, process .*$" { |
+ } |
+ -re "Continuing.*$" { |
+ } |
+ } |
- gdb_test_no_output "tstart" |
- gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" "continue to end" |
- gdb_test_no_output "tstop" |
+ set exists 1 |
- gdb_test "tfind" "Found trace frame 0, tracepoint .*" "tfind frame 0" |
- gdb_test "tfind" "Found trace frame 1, tracepoint .*" "tfind frame 1" |
- gdb_test "tfind" "Target failed to find requested trace frame\\..*" |
-}} |
- |
-proc strace_trace_on_same_addr { type } { |
-with_test_prefix "trace_same_addr $type" { |
- global executable |
- global expect_out |
- global gdb_prompt |
- global hex |
+ for {set i 1} {$i <= 5} {incr i} { |
+ set status [remote_exec target "sh -c { \[ -S $socket_file \] }"] |
+ if { [lindex $status 0] != 0 } { |
+ set exists 0 |
+ break |
+ } |
+ sleep 1 |
+ } |
- # Restart with a fresh gdb. |
- clean_restart $executable |
- if ![runto_main] { |
- fail "Can't run to main" |
- return -1 |
+ if { ![is_remote target] && ![string equal $action "detach"] } { |
+ setup_kfail gdb/14161 *-*-* |
} |
- set marker_bar_addr "" |
- set marker_bar2_addr "" |
+ set test "socket file removed" |
- # List the markers in program. They should be disabled. |
- gdb_test_multiple "info static-tracepoint-markers" "info static-tracepoint-markers 1" { |
- -re ".*ust/bar\[\t \]+n.*${gdb_prompt} $" { |
- set ignore "" |
+ if { $exists } { |
+ fail $test |
+ # Since $socket_file is a socket file instead of a regular file, we |
+ # can't use 'remote_file target delete $socket_file' here. |
+ remote_exec target "sh -c \"rm -r $socket_file\"" |
+ } else { |
+ pass $test |
+ } |
- regexp "ust/bar\[\t \]+n\[\t \]+($hex) .*ust/bar2\[\t \]+n\[\t \]+($hex) " \ |
- "$expect_out(0,string)" ignore marker_bar_addr marker_bar2_addr |
+ if { [string equal $action "quit"] && [is_remote host] } { |
+ global gdb_spawn_id |
+ # unset gdb_spawn_id here to avoid sending command 'quit' to GDB |
+ # later in default_gdb_exit. |
+ unset gdb_spawn_id |
+ } |
+}} |
- pass "info static-tracepoint-markers 1" |
- } |
- -re ".*${gdb_prompt} $" { |
- fail "info static-tracepoint-markers 1" |
+proc strace_info_marker { } { |
+ with_test_prefix "info_marker" { |
+ global executable |
+ global gdb_prompt |
+ global libipa |
+ |
+ # Restart with a fresh gdb. |
+ clean_restart $executable |
+ gdb_load_shlibs $libipa |
+ if ![runto_main] { |
+ fail "Can't run to main" |
+ return -1 |
} |
- } |
- gdb_test "strace -m ust/bar" "Static tracepoint \[0-9\]+ at ${hex}: file.*" |
- gdb_test "strace -m ust/bar2" "Static tracepoint \[0-9\]+ at ${hex}: file.*" |
- # Two trace markers should be enabled. |
- gdb_test "info static-tracepoint-markers" \ |
- "ust/bar\[\t \]+y\[\t \]+$hex .*ust/bar2\[\t \]+y\[\t \]+$hex.*" \ |
- "info static-tracepoint-markers 2" |
+ # List the markers in program. They should be disabled. |
+ gdb_test "info static-tracepoint-markers" \ |
+ ".*ust/bar\[\t \]+n\[\t \]+.*ust/bar2\[\t \]+n\[\t \]+.*" |
- # Set breapoints or tracepoints. |
- set test "${type} on marker bar" |
- gdb_test_multiple "${type} *${marker_bar_addr}" $test { |
- -re "\(Fast trace|Trace|Break\)point \[0-9\]+ at ${hex}: file.*\r\n$gdb_prompt $" { |
- pass $test |
- } |
- -re ".*\r\n$gdb_prompt $" { |
- if [string equal $type "ftrace"] { |
- # The instruction may be not long enough to set a fast |
- # tracepoint. Skip the rest of this test. |
- return -1; |
- } else { |
- fail $test |
+ # List all the thread. It is expected to get three threads without |
+ # any errors. |
+ gdb_test_multiple "info threads 3 2 1" "info threads" { |
+ -re "3\[ \t\]+Thread .*2\[ \t\]+Thread .*1\[ \t\]+Thread .*${gdb_prompt} $" { |
+ pass "info threads" |
} |
} |
- } |
- set test "${type} on marker bar2" |
- gdb_test_multiple "${type} *${marker_bar2_addr}" $test { |
- -re "\(Fast trace|Trace|Break\)point \[0-9\]+ at ${hex}: file.*" { |
- pass $test |
- } |
- -re ".*\r\n$gdb_prompt $" { |
- if [string equal $type "ftrace"] { |
- # The instruction may be not long enough to set a fast |
- # tracepoint. Skip the rest of this test. |
- return -1; |
- } else { |
- fail $test |
+ |
+ # GDB detaches inferior so that the socket file can be removed. |
+ gdb_test_multiple "detach" "detach" { |
+ -re "Detaching .*, process .*${gdb_prompt} $" { |
+ pass "detach" |
} |
} |
} |
+} |
- gdb_test "break end" "Breakpoint \[0-9\]+ at.*" |
+proc strace_probe_marker { } { |
+ with_test_prefix "probe_marker" { |
+ global executable |
+ global expect_out |
+ global gdb_prompt |
+ global hex |
+ global libipa |
+ |
+ # Restart with a fresh gdb. |
+ clean_restart $executable |
+ gdb_load_shlibs $libipa |
+ if ![runto_main] { |
+ fail "Can't run to main" |
+ return -1 |
+ } |
- if [string equal $type "break"] { |
- gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" \ |
- "continue to bar" |
- gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" \ |
- "continue to bar2" |
- gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" \ |
- "continue to end" |
- } else { |
+ gdb_test "strace -m ust/bar" \ |
+ "Static tracepoint \[0-9\]+ at ${hex}: file.*" |
+ gdb_test "strace -m ust/bar2" \ |
+ "Static tracepoint \[0-9\]+ at ${hex}: file.*" |
+ # Two trace markers should be enabled. |
+ gdb_test "info static-tracepoint-markers" \ |
+ "ust/bar\[\t \]+y\[\t \]+$hex .*ust/bar2\[\t \]+y\[\t \]+$hex.*" |
+ |
+ gdb_test "break end" "Breakpoint \[0-9\]+ at.*" |
gdb_test_no_output "tstart" |
gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" \ |
"continue to end" |
gdb_test_no_output "tstop" |
- gdb_test "tfind" "Found trace frame 0, tracepoint .*" "tfind frame 0" |
- gdb_test "tfind" "Found trace frame 1, tracepoint .*" "tfind frame 1" |
- gdb_test "tfind" "Found trace frame 2, tracepoint .*" "tfind frame 2" |
- gdb_test "tfind" "Found trace frame 3, tracepoint .*" "tfind frame 3" |
- gdb_test "tfind" "Target failed to find requested trace frame\\..*" |
+ gdb_test "tfind" "Found trace frame 0, tracepoint .*" \ |
+ "tfind frame 0" |
+ gdb_test "tfind" "Found trace frame 1, tracepoint .*" \ |
+ "tfind frame 1" |
+ gdb_test "tfind" \ |
+ "Target failed to find requested trace frame\\..*" |
} |
-}} |
- |
-proc strace_trace_on_diff_addr { } { with_test_prefix "trace_diff_addr" { |
+} |
- global executable |
- global expect_out |
- global gdb_prompt |
- global hex |
+proc strace_trace_on_same_addr { type } { |
+ with_test_prefix "trace_same_addr $type" { |
+ global executable |
+ global expect_out |
+ global gdb_prompt |
+ global hex |
+ global libipa |
+ |
+ # Restart with a fresh gdb. |
+ clean_restart $executable |
+ gdb_load_shlibs $libipa |
+ if ![runto_main] { |
+ fail "Can't run to main" |
+ return -1 |
+ } |
- # Restart with a fresh gdb. |
- clean_restart $executable |
- if ![runto_main] { |
- fail "Can't run to main" |
- return -1 |
- } |
+ set marker_bar_addr "" |
+ set marker_bar2_addr "" |
- set marker_bar_addr "" |
- set marker_bar2_addr "" |
+ # List the markers in program. They should be disabled. |
+ gdb_test_multiple "info static-tracepoint-markers" "info static-tracepoint-markers 1" { |
+ -re ".*ust/bar\[\t \]+n.*${gdb_prompt} $" { |
+ set ignore "" |
- # List the markers in program. They should be disabled. |
- gdb_test_multiple "info static-tracepoint-markers" "info static-tracepoint-markers 1" { |
- -re ".*ust/bar\[\t \]+n.*${gdb_prompt} $" { |
- set ignore "" |
+ regexp "ust/bar\[\t \]+n\[\t \]+($hex) .*ust/bar2\[\t \]+n\[\t \]+($hex) " \ |
+ "$expect_out(0,string)" ignore marker_bar_addr marker_bar2_addr |
- regexp "ust/bar\[\t \]+n\[\t \]+($hex) .*ust/bar2\[\t \]+n\[\t \]+($hex) " \ |
- "$expect_out(0,string)" ignore marker_bar_addr marker_bar2_addr |
+ pass "info static-tracepoint-markers 1" |
+ } |
+ -re ".*${gdb_prompt} $" { |
+ fail "info static-tracepoint-markers 1" |
+ } |
+ } |
- pass "info static-tracepoint-markers 1" |
+ gdb_test "strace -m ust/bar" "Static tracepoint \[0-9\]+ at ${hex}: file.*" |
+ gdb_test "strace -m ust/bar2" "Static tracepoint \[0-9\]+ at ${hex}: file.*" |
+ # Two trace markers should be enabled. |
+ gdb_test "info static-tracepoint-markers" \ |
+ "ust/bar\[\t \]+y\[\t \]+$hex .*ust/bar2\[\t \]+y\[\t \]+$hex.*" \ |
+ "info static-tracepoint-markers 2" |
+ |
+ # Set breapoints or tracepoints. |
+ set test "${type} on marker bar" |
+ gdb_test_multiple "${type} *${marker_bar_addr}" $test { |
+ -re "\(Fast trace|Trace|Break\)point \[0-9\]+ at ${hex}: file.*\r\n$gdb_prompt $" { |
+ pass $test |
+ } |
+ -re ".*\r\n$gdb_prompt $" { |
+ if [string equal $type "ftrace"] { |
+ # The instruction may be not long enough to set a fast |
+ # tracepoint. Skip the rest of this test. |
+ return -1 |
+ } else { |
+ fail $test |
+ } |
+ } |
} |
- -re ".*${gdb_prompt} $" { |
- fail "info static-tracepoint-markers 1" |
+ set test "${type} on marker bar2" |
+ gdb_test_multiple "${type} *${marker_bar2_addr}" $test { |
+ -re "\(Fast trace|Trace|Break\)point \[0-9\]+ at ${hex}: file.*" { |
+ pass $test |
+ } |
+ -re ".*\r\n$gdb_prompt $" { |
+ if [string equal $type "ftrace"] { |
+ # The instruction may be not long enough to set a fast |
+ # tracepoint. Skip the rest of this test. |
+ return -1 |
+ } else { |
+ fail $test |
+ } |
+ } |
+ } |
+ |
+ gdb_test "break end" "Breakpoint \[0-9\]+ at.*" |
+ |
+ if [string equal $type "break"] { |
+ gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" \ |
+ "continue to bar" |
+ gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" \ |
+ "continue to bar2" |
+ gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" \ |
+ "continue to end" |
+ } else { |
+ |
+ gdb_test_no_output "tstart" |
+ gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" \ |
+ "continue to end" |
+ gdb_test_no_output "tstop" |
+ |
+ gdb_test "tfind" "Found trace frame 0, tracepoint .*" \ |
+ "tfind frame 0" |
+ gdb_test "tfind" "Found trace frame 1, tracepoint .*" \ |
+ "tfind frame 1" |
+ gdb_test "tfind" "Found trace frame 2, tracepoint .*" \ |
+ "tfind frame 2" |
+ gdb_test "tfind" "Found trace frame 3, tracepoint .*" \ |
+ "tfind frame 3" |
+ gdb_test "tfind" \ |
+ "Target failed to find requested trace frame\\..*" |
} |
} |
+} |
+ |
+proc strace_trace_on_diff_addr { } { |
+ with_test_prefix "trace_diff_addr" { |
+ |
+ global executable |
+ global expect_out |
+ global gdb_prompt |
+ global hex |
+ global libipa |
+ |
+ # Restart with a fresh gdb. |
+ clean_restart $executable |
+ gdb_load_shlibs $libipa |
+ if ![runto_main] { |
+ fail "Can't run to main" |
+ return -1 |
+ } |
- gdb_test "strace -m ust/bar" "Static tracepoint \[0-9\]+ at ${hex}: file.*" |
+ set marker_bar_addr "" |
+ set marker_bar2_addr "" |
- gdb_test "info static-tracepoint-markers" \ |
- "ust/bar\[\t \]+y\[\t \]+$hex .*ust/bar2\[\t \]+n\[\t \]+$hex.*" \ |
- "info static-tracepoint-markers 2" |
+ # List the markers in program. They should be disabled. |
+ gdb_test_multiple "info static-tracepoint-markers" "info static-tracepoint-markers 1" { |
+ -re ".*ust/bar\[\t \]+n.*${gdb_prompt} $" { |
+ set ignore "" |
+ regexp "ust/bar\[\t \]+n\[\t \]+($hex) .*ust/bar2\[\t \]+n\[\t \]+($hex) " \ |
+ "$expect_out(0,string)" ignore marker_bar_addr marker_bar2_addr |
- # Set common tracepoint. |
- gdb_test "trace *${marker_bar2_addr}" \ |
- "Tracepoint \[0-9\]+ at ${hex}: file.*" |
+ pass "info static-tracepoint-markers 1" |
+ } |
+ -re ".*${gdb_prompt} $" { |
+ fail "info static-tracepoint-markers 1" |
+ } |
+ } |
- gdb_test "break end" "Breakpoint \[0-9\]+ at.*" |
+ gdb_test "strace -m ust/bar" "Static tracepoint \[0-9\]+ at ${hex}: file.*" |
- gdb_test_no_output "tstart" |
- gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" "continue to end" |
- gdb_test_no_output "tstop" |
+ gdb_test "info static-tracepoint-markers" \ |
+ "ust/bar\[\t \]+y\[\t \]+$hex .*ust/bar2\[\t \]+n\[\t \]+$hex.*" \ |
+ "info static-tracepoint-markers 2" |
- gdb_test "tfind" "Found trace frame 0, tracepoint .*" "tfind frame 0" |
- gdb_test "tfind" "Found trace frame 1, tracepoint .*" "tfind frame 1" |
- gdb_test "tfind" "Target failed to find requested trace frame\\..*" |
-}} |
-clean_restart $executable |
+ # Set common tracepoint. |
+ gdb_test "trace *${marker_bar2_addr}" \ |
+ "Tracepoint \[0-9\]+ at ${hex}: file.*" |
-if ![runto_main] { |
- fail "Can't run to main to check for trace support" |
- return -1 |
+ gdb_test "break end" "Breakpoint \[0-9\]+ at.*" |
+ |
+ gdb_test_no_output "tstart" |
+ gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" \ |
+ "continue to end" |
+ gdb_test_no_output "tstop" |
+ |
+ gdb_test "tfind" "Found trace frame 0, tracepoint .*" \ |
+ "tfind frame 0" |
+ gdb_test "tfind" "Found trace frame 1, tracepoint .*" \ |
+ "tfind frame 1" |
+ gdb_test "tfind" \ |
+ "Target failed to find requested trace frame\\..*" |
+ } |
} |
-# Run it on native x86/x86_64 linux. |
-if { ![is_remote target] |
- && ([istarget "x86_64-*-linux*"] || [istarget "i\[34567\]86-*-linux*"]) } { |
+# Run it on x86/x86_64 linux. |
+if { [istarget "x86_64-*-linux*"] || [istarget "i\[34567\]86-*-linux*"] } { |
strace_info_marker |
- return |
+ strace_remove_socket "quit" |
+ strace_remove_socket "detach" |
+ strace_remove_socket "continue" |
} |
+clean_restart $executable |
+gdb_load_shlibs $libipa |
+if ![runto_main] { |
+ fail "Can't run to main to check for trace support" |
+ return -1 |
+} |
if { ![gdb_target_supports_trace] } then { |
+ # At this point, the socket file has been created. We must make sure it is |
+ # removed when we return here. GDB detaches inferior so that the socket |
+ # file can be removed. Note that GDB simply kill inferior doesn't remove |
+ # the socket file. |
+ gdb_test "detach" "Detaching .*, process .*" |
unsupported "Current target does not support trace" |
- return -1; |
+ return -1 |
} |
-gdb_load_shlibs $libipa |
- |
-strace_info_marker |
strace_probe_marker |
strace_trace_on_same_addr "trace" |