diff options
Diffstat (limited to 'gdb/testsuite/gdb.trace/trace-break.exp')
-rw-r--r-- | gdb/testsuite/gdb.trace/trace-break.exp | 202 |
1 files changed, 202 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.trace/trace-break.exp b/gdb/testsuite/gdb.trace/trace-break.exp index c2d7b2ce4dc..50344d2090d 100644 --- a/gdb/testsuite/gdb.trace/trace-break.exp +++ b/gdb/testsuite/gdb.trace/trace-break.exp @@ -39,6 +39,20 @@ if ![gdb_target_supports_trace] { return -1; } +set fpreg "fp" +set spreg "sp" +set pcreg "pc" + +if [is_amd64_regs_target] { + set fpreg "rbp" + set spreg "rsp" + set pcreg "rip" +} elseif [is_x86_like_target] { + set fpreg "ebp" + set spreg "esp" + set pcreg "eip" +} + # Set breakpoint and tracepoint at the same address. proc break_trace_same_addr_1 { trace_type option } { @@ -200,6 +214,159 @@ proc break_trace_same_addr_4 { trace_type option } { set pf_prefix $old_pf_prefix } +# Set two tracepoints TRACE1 and TRACE2 at two locations, and start tracing. +# Then, set tracepoint TRACE3 at either of these two locations. +# TRACE3_AT_FIRST_LOC is a boolean variable to decide insert TRACE3 at which +# of two locations. Verify these tracepoints work as expected. + +proc break_trace_same_addr_5 { trace1 trace2 trace3 trace3_at_first_loc } { + global executable + global pf_prefix + global hex + global fpreg + global spreg + global pcreg + + set old_pf_prefix $pf_prefix + set pf_prefix "$pf_prefix 5 $trace1 $trace2 ${trace3}@${trace3_at_first_loc}:" + + # Start with a fresh gdb. + clean_restart ${executable} + if ![runto_main] { + fail "Can't run to main" + set pf_prefix $old_pf_prefix + return -1 + } + + gdb_test "break marker" "Breakpoint \[0-9\] at $hex: file.*" + gdb_test "break end" "Breakpoint \[0-9\] at $hex: file.*" + + gdb_test "${trace1} set_point" "\(Fast t|T\)racepoint \[0-9\] at $hex: file.*" \ + "${trace1} set_point 1" + gdb_trace_setactions "set action for tracepoint 1" "" \ + "collect \$$pcreg" "^$" + gdb_test "${trace2} after_set_point" \ + "\(Fast t|T\)racepoint \[0-9\] at $hex: file.*" \ + "${trace2} after_set_point 1" + + gdb_trace_setactions "set action for tracepoint 2" "" \ + "collect \$$spreg" "^$" + + gdb_test_no_output "tstart" + + gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" "continue to marker" + + if [string equal $trace3_at_first_loc "1"] { + gdb_test "${trace3} set_point" "\(Fast t|T\)racepoint \[0-9\] at $hex: file.*" \ + "${trace3} set_point 2" + } else { + gdb_test "${trace3} after_set_point" \ + "\(Fast t|T\)racepoint \[0-9\] at $hex: file.*" \ + "${trace2} after_set_point 2" + } + gdb_trace_setactions "set action for tracepoint 3" "" \ + "collect \$$fpreg" "^$" + + gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" "continue to end" + gdb_test_no_output "tstop" + + gdb_test "tfind tracepoint 4" "Found trace frame \[0-9\], tracepoint .*" \ + "tfind test frame of tracepoint 4" + gdb_test "tdump" \ + "Data collected at tracepoint .*, trace frame \[0-9\]:.*\\$${pcreg} = .*" \ + "tdump 1" + gdb_test "tfind 0" "Found trace frame 0, tracepoint .*" \ + "reset to frame 0 (1)" + gdb_test "tfind tracepoint 5" "Found trace frame \[0-9\], tracepoint .*" \ + "tfind test frame of tracepoint 5" + gdb_test "tdump" \ + "Data collected at tracepoint .*, trace frame \[0-9\]:.*\\$${spreg} = .*" \ + "tdump 2" + gdb_test "tfind 0" "Found trace frame 0, tracepoint .*" \ + "reset to frame 0 (2)" + gdb_test "tfind tracepoint 6" "Found trace frame \[0-9\], tracepoint .*" \ + "tfind test frame of tracepoint 6" + gdb_test "tdump" \ + "Data collected at tracepoint .*, trace frame \[0-9\]:.*\\$${fpreg} = .*" \ + "tdump 3" + + set pf_prefix $old_pf_prefix +} + +# Set two tracepoints at the same address, and enable/disable them. Verify +# tracepoints work as expect. + +proc break_trace_same_addr_6 { trace1 enable1 trace2 enable2 } { + global executable + global pf_prefix + global hex + global gdb_prompt + global spreg + global pcreg + + set old_pf_prefix $pf_prefix + set pf_prefix "$pf_prefix 6 $trace1 $enable1 $trace2 $enable2:" + + # Start with a fresh gdb. + clean_restart ${executable} + if ![runto_main] { + fail "Can't run to main" + set pf_prefix $old_pf_prefix + return -1 + } + + gdb_test "break marker" "Breakpoint \[0-9\] at $hex: file.*" + gdb_test "break end" "Breakpoint \[0-9\] at $hex: file.*" + + gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" "continue to marker" + + gdb_test "${trace1} set_point" "\(Fast t|T\)racepoint \[0-9\] at $hex: file.*" \ + "${trace1} set_point 1" + gdb_trace_setactions "set action for tracepoint 1" "" \ + "collect \$$pcreg" "^$" + gdb_test "${trace2} set_point" "\(Fast t|T\)racepoint \[0-9\] at $hex: file.*" \ + "${trace2} set_point 2" + gdb_trace_setactions "set action for tracepoint 2" "" \ + "collect \$$spreg" "^$" + + gdb_test_no_output "$enable1 4" + gdb_test_no_output "$enable2 5" + + gdb_test_no_output "tstart" + gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" "continue to end" + gdb_test_no_output "tstop" + + + if [string equal $enable1 "enable"] { + gdb_test "tfind tracepoint 4" "Found trace frame \[0-9\], tracepoint .*" \ + "tfind test frame of tracepoint 4" + gdb_test "tdump" \ + "Data collected at tracepoint .*, trace frame \[0-9\]:.*\\$${pcreg} = .*" \ + "tdump 1" + gdb_test "tfind 0" "Found trace frame 0, tracepoint .*" \ + "reset to frame 0 (1)" + } else { + gdb_test "tfind tracepoint 4" "Target failed to find requested trace frame.*" \ + "tfind test frame of tracepoint 4" + } + + if [string equal $enable2 "enable"] { + gdb_test "tfind tracepoint 5" "Found trace frame \[0-9\], tracepoint .*" \ + "tfind test frame of tracepoint 5" + gdb_test "tdump" \ + "Data collected at tracepoint .*, trace frame \[0-9\]:.*\\$${spreg} = .*" \ + "tdump 2" + gdb_test "tfind 0" "Found trace frame 0, tracepoint .*" \ + "reset to frame 0 (2)" + } else { + gdb_test "tfind tracepoint 5" "Target failed to find requested trace frame.*" \ + "tfind test frame of tracepoint 5" + } + + set pf_prefix $old_pf_prefix +} + + foreach break_always_inserted { "on" "off" } { break_trace_same_addr_1 "trace" ${break_always_inserted} break_trace_same_addr_2 "trace" "trace" ${break_always_inserted} @@ -207,6 +374,13 @@ foreach break_always_inserted { "on" "off" } { break_trace_same_addr_4 "trace" ${break_always_inserted} } +foreach at_first_loc { "1" "0" } { + break_trace_same_addr_5 "trace" "trace" "trace" ${at_first_loc} +} + +break_trace_same_addr_6 "trace" "enable" "trace" "disable" +break_trace_same_addr_6 "trace" "disable" "trace" "enable" + set libipa $objdir/../gdbserver/libinproctrace.so gdb_load_shlibs $libipa @@ -238,4 +412,32 @@ if { [gdb_test "info sharedlibrary" ".*libinproctrace\.so.*" "IPA loaded"] != 0 break_trace_same_addr_3 "ftrace" ${break_always_inserted} break_trace_same_addr_4 "ftrace" ${break_always_inserted} } + + foreach trace1 { "trace" "ftrace" } { + foreach trace2 { "trace" "ftrace" } { + foreach trace3 { "trace" "ftrace" } { + + if { [string equal $trace1 "trace"] + && [string equal $trace2 "trace"] + && [string equal $trace3 "trace"] } { + continue + } + + foreach at_first_loc { "1" "0" } { + break_trace_same_addr_5 $trace1 $trace2 $trace3 $at_first_loc + } + } + } + } + + foreach trace1 { "trace" "ftrace" } { + foreach trace2 { "trace" "ftrace" } { + if { [string equal $trace1 "trace"] + && [string equal $trace2 "trace"] } { + continue + } + break_trace_same_addr_6 $trace1 "enable" $trace2 "disable" + break_trace_same_addr_6 $trace1 "disable" $trace2 "enable" + } + } } |