X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Ftestsuite%2Fgdb.trace%2Fstrace.exp;h=e0a40824e7a51f6794155fc6aab51889d9d8c64c;hb=ad89c2aa677c28c76ffd5a35e2b36eece4d82597;hp=089b62bfbd3470a58787b37516e9bf75e3dff82f;hpb=9d198b1e46630ab0cbe79e42abf6227486ec9fec;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/testsuite/gdb.trace/strace.exp b/gdb/testsuite/gdb.trace/strace.exp index 089b62bfbd..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,250 +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 [get_in_proc_agent] set lib_opts debug -if [get_compiler_info ${binfile}] { +if [get_compiler_info] { return -1 } -set additional_flags [list quiet 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 } -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.*" - - gdb_test_no_output "tstart" - gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" "continue to end" - gdb_test_no_output "tstop" + 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 "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 exists 1 -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 "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\\..*" } } +} - 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" -clean_restart $executable -if ![runto_main] { - fail "Can't run to main to check for trace support" - return -1 + # 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\\..*" + } } -# 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 +# 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_info_marker strace_probe_marker strace_trace_on_same_addr "trace"