| # Copyright 2013-2018 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 <http://www.gnu.org/licenses/>. |
| |
| load_lib trace-support.exp |
| |
| standard_testfile |
| |
| if ![gdb_trace_common_supports_arch] { |
| unsupported "no trace-common.h support for arch" |
| return -1 |
| } |
| |
| if {[prepare_for_testing "failed to prepare" $testfile $srcfile debug]} { |
| return -1 |
| } |
| |
| proc test_actions_changed { } { |
| gdb_breakpoint "end" qualified |
| |
| gdb_test "trace subr" "Tracepoint .*" \ |
| "tracepoint at subr" |
| |
| # The first set of tests are regression tests for a GDB bug where |
| # the while-stepping count of a tracepoint would be left stale if |
| # the tracepoint's actions were redefined, and the new action list |
| # had no while-stepping action. |
| |
| # First pass, define simple action. |
| with_test_prefix "1" { |
| gdb_trace_setactions "define simple action" \ |
| "" \ |
| "collect parm" "^$" |
| |
| gdb_test_no_output "tstart" |
| |
| gdb_test "continue" ".*Breakpoint \[0-9\]+, end \\(i=1\\) .*" \ |
| "advance through tracing" |
| |
| gdb_test "tstatus" ".*Collected 1 trace frame.*" \ |
| "collected 1 trace frame" |
| |
| gdb_test_no_output "tstop" |
| } |
| |
| # Redefine action, run second trace. |
| with_test_prefix "2" { |
| gdb_trace_setactions "redefine simple action" \ |
| "" \ |
| "collect keeping, busy" "^$" |
| |
| gdb_test_no_output "tstart" |
| |
| gdb_test "continue" ".*Breakpoint \[0-9\]+, end \\(i=2\\) .*" \ |
| "advance through tracing" |
| |
| gdb_test "tstatus" ".*Collected 1 trace frame.*" \ |
| "collected 1 trace frame" |
| |
| gdb_test_no_output "tstop" |
| } |
| |
| # Redefine to stepping action, run third trace. |
| with_test_prefix "3" { |
| gdb_trace_setactions "redefine to stepping action" \ |
| "" \ |
| "collect parm" "^$" \ |
| "while-stepping 5" "^$" \ |
| "collect parm" "^$" \ |
| "end" "^$" |
| |
| gdb_test_no_output "tstart" |
| |
| gdb_test "continue" ".*Breakpoint \[0-9\]+, end \\(i=3\\) .*" \ |
| "advance through tracing" |
| |
| gdb_test "tstatus" ".*Collected 6 trace frames.*" \ |
| "collected 6 trace frames" |
| |
| gdb_test_no_output "tstop" |
| } |
| |
| # Redefine to non-stepping, run fourth trace. |
| with_test_prefix "4" { |
| gdb_trace_setactions "redefine to non-stepping action" \ |
| "" \ |
| "collect parm" "^$" |
| |
| gdb_test_no_output "tstart" |
| |
| gdb_test "continue" ".*Breakpoint \[0-9\]+, end \\(i=4\\) .*" \ |
| "advance through tracing" |
| |
| gdb_test "tstatus" ".*Collected 1 trace frame.*" \ |
| "collected 1 trace frame" |
| |
| gdb_test_no_output "tstop" |
| } |
| |
| # The following tests are related to the above, but use two |
| # tracepoints. They are regression tests for a GDB bug where only |
| # the first tracepoint would end up with the step count set. |
| |
| # Store the first tracepoint's number. |
| gdb_test_no_output "set \$prev_tpnum=\$tpnum" "store previous \$tpnum" |
| |
| # And here's the second tracepoint. |
| gdb_test "trace subr2" "Tracepoint .*" "tracepoint at subr2" |
| |
| # Set a stepping action in both tracepoints, with the "commands" |
| # command. |
| with_test_prefix "5" { |
| gdb_trace_setcommands \ |
| "redefine 2 tracepoints to stepping action, using commands" \ |
| "\$prev_tpnum-\$tpnum" \ |
| "collect parm" "^$" \ |
| "while-stepping 5" "^$" \ |
| "collect parm" "^$" \ |
| "end" "^$" |
| |
| gdb_test_no_output "tstart" |
| |
| gdb_test "continue" ".*Breakpoint \[0-9\]+, end \\(i=5\\) .*" \ |
| "advance through tracing" |
| |
| gdb_test "tstatus" ".*Collected 12 trace frames.*" \ |
| "collected 12 trace frames" |
| |
| gdb_test_no_output "tstop" |
| } |
| |
| # Redefine the actions of both tracepoints to non-stepping, also |
| # using the "commands" command. |
| with_test_prefix "6" { |
| gdb_trace_setcommands \ |
| "redefine 2 tracepoints to non-stepping action, using commands" \ |
| "\$prev_tpnum-\$tpnum" \ |
| "collect parm" "^$" |
| |
| gdb_test_no_output "tstart" |
| |
| gdb_test "continue" ".*Breakpoint \[0-9\]+, end \\(i=6\\) .*" \ |
| "advance through tracing" |
| |
| gdb_test "tstatus" ".*Collected 2 trace frame.*" \ |
| "collected 2 trace frames" |
| |
| gdb_test_no_output "tstop" |
| } |
| } |
| |
| # Check whether the target supports tracepoints. |
| |
| clean_restart $testfile |
| |
| if ![runto_main] { |
| fail "can't run to main to check for trace support" |
| return -1 |
| } |
| |
| if ![gdb_target_supports_trace] { |
| unsupported "current target does not support trace" |
| return -1 |
| } |
| |
| test_actions_changed |
| |
| return 0 |