# Copyright 2011-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 . load_lib "trace-support.exp"; if {[skip_shlib_tests]} { return 0 } set testfile "strace" set srcfile $testfile.c set binfile $objdir/$subdir/$testfile set executable $testfile set libipa $objdir/../gdbserver/libinproctrace.so set lib_opts debug if [get_compiler_info ${binfile}] { return -1 } set additional_flags [list 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" { global executable global gdb_prompt # Restart with a fresh gdb. clean_restart $executable if ![runto_main] { fail "Can't run to main" return -1 } # 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 \]+.*" # 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" } } }} proc strace_probe_marker { } { with_test_prefix "probe_marker" { global executable global expect_out global gdb_prompt global hex # Restart with a fresh gdb. clean_restart $executable 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.*" 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\\..*" }} proc strace_trace_on_same_addr { type } { with_test_prefix "trace_same_addr $type" { global executable global expect_out global gdb_prompt global hex # 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 "" # 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 pass "info static-tracepoint-markers 1" } -re ".*${gdb_prompt} $" { fail "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 } } } 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 # 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 "" # 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 pass "info static-tracepoint-markers 1" } -re ".*${gdb_prompt} $" { fail "info static-tracepoint-markers 1" } } gdb_test "strace -m ust/bar" "Static tracepoint \[0-9\]+ at ${hex}: file.*" gdb_test "info static-tracepoint-markers" \ "ust/bar\[\t \]+y\[\t \]+$hex .*ust/bar2\[\t \]+n\[\t \]+$hex.*" \ "info static-tracepoint-markers 2" # 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\\..*" }} clean_restart $executable if ![runto_main] { fail "Can't run to main to check for trace support" return -1 } # Run it on native x86/x86_64 linux. if { ![is_remote target] && ([istarget "x86_64-*-linux*"] || [istarget "i\[34567\]86-*-linux*"]) } { strace_info_marker return } if { ![gdb_target_supports_trace] } then { unsupported "Current target does not support trace" return -1; } gdb_load_shlibs $libipa strace_info_marker strace_probe_marker strace_trace_on_same_addr "trace" strace_trace_on_same_addr "ftrace" strace_trace_on_same_addr "break" strace_trace_on_diff_addr