diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 40bedc5d12..cabffb5722 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2012-01-03 Yao Qi + + * gdb.trace/strace.exp (strace_trace_on_same_addr): New. + (strace_trace_on_diff_addr): New. + * gdb.trace/strace.c: (main): Add two local variables. + 2011-01-02 Ulrich Weigand * gdb.cell/fork.exp: Delete breakpoints after reaching main. diff --git a/gdb/testsuite/gdb.trace/strace.c b/gdb/testsuite/gdb.trace/strace.c index cec4c14d34..5e1e120dec 100644 --- a/gdb/testsuite/gdb.trace/strace.c +++ b/gdb/testsuite/gdb.trace/strace.c @@ -24,6 +24,11 @@ end (void) int main (void) { + /* Some code to make sure that breakpoints on `main' and `ust/bar' marker + are set at different addresses. */ + int a = 0; + int b = a; + trace_mark(ust, bar, "str %s", "FOOBAZ"); trace_mark(ust, bar2, "number1 %d number2 %d", 53, 9800); diff --git a/gdb/testsuite/gdb.trace/strace.exp b/gdb/testsuite/gdb.trace/strace.exp index 51a9f5666c..39924105ac 100644 --- a/gdb/testsuite/gdb.trace/strace.exp +++ b/gdb/testsuite/gdb.trace/strace.exp @@ -114,5 +114,165 @@ proc strace_probe_marker { } { set pf_prefix $old_pf_prefix } +proc strace_trace_on_same_addr { type } { + global executable + global pf_prefix + global expect_out + global gdb_prompt + global hex + + set old_pf_prefix $pf_prefix + lappend pf_prefix "trace_same_addr" "$type" + + # 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 "" + + # 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\\..*" + } + 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" + + # 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 "" + + # 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\\..*" + + set pf_prefix $old_pf_prefix +} + 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