X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Ftestsuite%2Fgdb.trace%2Fstrace.exp;h=e0a40824e7a51f6794155fc6aab51889d9d8c64c;hb=ad89c2aa677c28c76ffd5a35e2b36eece4d82597;hp=4d6ea1013765b4abeca2154c02959656c784e316;hpb=97ccebe869a69550b5a89a59b99955fb783f2b81;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/testsuite/gdb.trace/strace.exp b/gdb/testsuite/gdb.trace/strace.exp index 4d6ea10137..e0a40824e7 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-2015 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,260 +12,389 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -load_lib "trace-support.exp"; +load_lib "trace-support.exp" if {[skip_shlib_tests]} { return 0 } -set testfile "strace" -set srcfile $testfile.c -set binfile $objdir/$subdir/$testfile +standard_testfile set executable $testfile -set libipa $objdir/../gdbserver/libinproctrace.so +set libipa [get_in_proc_agent] set lib_opts debug -if [get_compiler_info ${binfile}] { +if [get_compiler_info] { return -1 } -set additional_flags [list debug shlib=$libipa shlib_load "additional_flags=-lust -lurcu-bp" ] +set additional_flags [list quiet debug shlib=$libipa shlib_load \ + "additional_flags=-lust -lurcu-bp" ] if { [gdb_compile $srcdir/$subdir/$srcfile $binfile executable $additional_flags] != ""} { untested "UST library or headers are not installed" return -1 } -clean_restart $executable +# Test that the socket file is removed when GDB quits, detaches or +# resumes the inferior until it exits. -if ![runto_main] { - fail "Can't run to main to check for trace support" - return -1 -} +proc strace_remove_socket { action } { + with_test_prefix "remove_socket_after_${action}" { -if { ![gdb_target_supports_trace] } then { - unsupported "Current target does not support trace" - return -1; -} - -gdb_load_shlibs $libipa - -proc strace_info_marker { } { global executable - global pf_prefix - - set old_pf_prefix $pf_prefix - lappend pf_prefix "info_marker" + 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" - set pf_prefix $old_pf_prefix 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 \]+.*" - set pf_prefix $old_pf_prefix -} - -proc strace_probe_marker { } { - global executable - global pf_prefix - global expect_out - global gdb_prompt - global hex - - set old_pf_prefix $pf_prefix - lappend pf_prefix "probe_marker" - - # Restart with a fresh gdb. - clean_restart $executable - if ![runto_main] { - fail "Can't run to main" - set pf_prefix $old_pf_prefix - return -1 + 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 + } } - 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.*" + set test "socket file exists" + set socket_file "/tmp/gdb_ust${pid}" + set status [remote_exec target "sh -c { \[ -S $socket_file \] }"] - 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\\..*" + if { [lindex $status 0] == 0 } { + pass $test + } else { + fail $test + } - set pf_prefix $old_pf_prefix -} + 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.*$" { + } + } -proc strace_trace_on_same_addr { type } { - global executable - global pf_prefix - global expect_out - global gdb_prompt - global hex + set exists 1 - set old_pf_prefix $pf_prefix - lappend pf_prefix "trace_same_addr" "$type" + 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" - set pf_prefix $old_pf_prefix - 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 "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\\..*" } - set pf_prefix $old_pf_prefix } -proc strace_trace_on_diff_addr { } { - global executable - global pf_prefix - global expect_out - global gdb_prompt - global hex - - set old_pf_prefix $pf_prefix - lappend pf_prefix "trace_diff_addr" +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" - set pf_prefix $old_pf_prefix - 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\\..*" } } +} - gdb_test "strace -m ust/bar" "Static tracepoint \[0-9\]+ at ${hex}: file.*" +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 "info static-tracepoint-markers" \ - "ust/bar\[\t \]+y\[\t \]+$hex .*ust/bar2\[\t \]+n\[\t \]+$hex.*" \ - "info static-tracepoint-markers 2" + 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 "" - # Set common tracepoint. - gdb_test "trace *${marker_bar2_addr}" "Tracepoint \[0-9\]+ at ${hex}: file.*" + regexp "ust/bar\[\t \]+n\[\t \]+($hex) .*ust/bar2\[\t \]+n\[\t \]+($hex) " \ + "$expect_out(0,string)" ignore marker_bar_addr marker_bar2_addr - gdb_test "break end" "Breakpoint \[0-9\]+ at.*" + pass "info static-tracepoint-markers 1" + } + -re ".*${gdb_prompt} $" { + fail "info static-tracepoint-markers 1" + } + } - gdb_test_no_output "tstart" - gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" "continue to end" - gdb_test_no_output "tstop" + gdb_test "strace -m ust/bar" "Static tracepoint \[0-9\]+ at ${hex}: file.*" - 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\\..*" + gdb_test "info static-tracepoint-markers" \ + "ust/bar\[\t \]+y\[\t \]+$hex .*ust/bar2\[\t \]+n\[\t \]+$hex.*" \ + "info static-tracepoint-markers 2" - set pf_prefix $old_pf_prefix + + # Set common tracepoint. + gdb_test "trace *${marker_bar2_addr}" \ + "Tracepoint \[0-9\]+ at ${hex}: file.*" + + 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\\..*" + } } -strace_info_marker +# Run it on x86/x86_64 linux. +if { [istarget "x86_64-*-linux*"] || [istarget "i\[34567\]86-*-linux*"] } { + strace_info_marker + 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 +} + +# Double-check that marker ID ("-m") is not mistaken for an explicit location +# flag. +gdb_test "strace -m gdbfoobarbaz" \ + "No known static tracepoint marker named gdbfoobarbaz" + strace_probe_marker strace_trace_on_same_addr "trace"