1# Copyright 2011-2020 Free Software Foundation, Inc. 2# This program is free software; you can redistribute it and/or modify 3# it under the terms of the GNU General Public License as published by 4# the Free Software Foundation; either version 3 of the License, or 5# (at your option) any later version. 6# 7# This program is distributed in the hope that it will be useful, 8# but WITHOUT ANY WARRANTY; without even the implied warranty of 9# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10# GNU General Public License for more details. 11# 12# You should have received a copy of the GNU General Public License 13# along with this program. If not, see <http://www.gnu.org/licenses/>. 14 15load_lib "trace-support.exp" 16 17standard_testfile actions.c 18set executable $testfile 19set expfile tstatus.exp 20 21if ![gdb_trace_common_supports_arch] { 22 unsupported "no trace-common.h support for arch" 23 return -1 24} 25 26if [prepare_for_testing "failed to prepare" $executable $srcfile \ 27 [list debug]] { 28 return -1 29} 30 31if ![runto_main] { 32 fail "can't run to main to check for trace support" 33 return -1 34} 35 36if ![gdb_target_supports_trace] { 37 unsupported "target does not support trace" 38 return -1 39} 40 41set tstatus_output "" 42 43proc run_trace_experiment {} { 44 global gdb_prompt 45 global decimal 46 global tstatus_output 47 48# gdb_test_no_output "set debug remote 1" "" 49 50 gdb_test "continue" \ 51 ".*Breakpoint \[0-9\]+, begin .*" \ 52 "advance to trace begin" 53 54 gdb_test_no_output "tstart my tracing note" "start trace experiment" 55 56 gdb_test "continue" \ 57 ".*Breakpoint \[0-9\]+, end .*" \ 58 "advance through tracing" 59 60 # Now play with tstatus a bit. 61 62 # Since support for notes, user, stop reason, etc. is optional, we 63 # need to match both with and without cases. 64 65 set test "tstatus reports trace note" 66 gdb_test_multiple "tstatus" $test { 67 -re "Trace is running.*Trace will stop if GDB disconnects\.\[\r\n\]+Trace notes: my tracing note\.\[\r\n\]+Not looking at any trace frame\..*\r\n$gdb_prompt $" { 68 pass $test 69 } 70 -re "Trace is running.*Trace will stop if GDB disconnects\.\[\r\n\]+Not looking at any trace frame.*\r\n$gdb_prompt $" { 71 unsupported $test 72 } 73 } 74 75 gdb_test "set trace-notes different note" "" "change tracing note" 76 77 set test "tstatus reports different trace note" 78 gdb_test_multiple "tstatus" $test { 79 -re "Trace is running.*Trace will stop if GDB disconnects\.\[\r\n\]+Trace notes: different note\.\[\r\n\]+Not looking at any trace frame\..*\r\n$gdb_prompt $" { 80 pass $test 81 } 82 -re "Trace is running.*Trace will stop if GDB disconnects\.\[\r\n\]+Not looking at any trace frame.*\r\n$gdb_prompt $" { 83 unsupported $test 84 } 85 } 86 87 gdb_test "set trace-user me me me" "" "change tracing user" 88 89 set test "tstatus reports trace user" 90 gdb_test_multiple "tstatus" $test { 91 -re "Trace is running.*Trace will stop if GDB disconnects\.\[\r\n\]+Trace user is me me me\.\[\r\n\]+Trace notes: different note\.\[\r\n\]+Not looking at any trace frame\..*\r\n$gdb_prompt $" { 92 pass $test 93 } 94 -re "Trace is running.*Trace will stop if GDB disconnects\.\[\r\n\]+Not looking at any trace frame.*\r\n$gdb_prompt $" { 95 unsupported $test 96 } 97 } 98 99 gdb_test_no_output "tstop because I can" "trace stopped with note" 100 101 set test "tstatus reports trace stop reason" 102 gdb_test_multiple "tstatus" $test { 103 -re "(Trace stopped by a tstop command \\(because I can\\)\..*Trace will stop if GDB disconnects\.\[\r\n\]+Trace user is me me me\.\[\r\n\]+Trace notes: different note\.\[\r\n\]+Not looking at any trace frame\.).*\r\n$gdb_prompt $" { 104 set tstatus_output $expect_out(1,string) 105 pass $test 106 } 107 -re "(Trace stopped by a tstop command\.).*\r\n$gdb_prompt $" { 108 set tstatus_output $expect_out(1,string) 109 unsupported $test 110 } 111 } 112 113 set test "info trace reports tracepoint hit count and traceframe usage" 114 gdb_test_multiple "info trace" $test { 115 -re "actions\.c:\[0-9\]+\[\r\n\]+\[\t ]+tracepoint already hit 1 time\[\r\n\]+\[\t ]+trace buffer usage ${decimal} bytes\.\[\r\n\]+\[\t ]+collect parm.*\r\n$gdb_prompt $" { 116 pass $test 117 } 118 -re "actions\.c:\[0-9\]+\[\r\n\]+\[\t ]+collect parm.*\r\n$gdb_prompt $" { 119 unsupported $test 120 } 121 } 122} 123 124proc test_tracepoints {} { 125 global gdb_prompt 126 127 gdb_breakpoint "begin" qualified 128 129 gdb_breakpoint "end" qualified 130 131 gdb_test "trace gdb_c_test" "Tracepoint .*" \ 132 "tracepoint at gdb_c_test" 133 134 gdb_trace_setactions "collect at set_point: define actions" \ 135 "" \ 136 "collect parm" "^$" 137 138 run_trace_experiment 139 140} 141 142test_tracepoints 143 144set tracefile [standard_output_file ${testfile}] 145# Save trace frames to tfile. 146gdb_test "tsave ${tracefile}.tf" \ 147 "Trace data saved to file '${tracefile}.tf'.*" \ 148 "save tfile trace file" 149# Save trace frames to CTF. 150gdb_test "tsave -ctf ${tracefile}.ctf" \ 151 "Trace data saved to directory '${tracefile}.ctf'.*" \ 152 "save ctf trace file" 153 154# Change target to tfile. 155set test "change to tfile target" 156gdb_test_multiple "target tfile ${tracefile}.tf" "$test" { 157 -re "A program is being debugged already. Kill it. .y or n. " { 158 send_gdb "y\n" 159 exp_continue 160 } 161 -re "$gdb_prompt $" { 162 pass "$test" 163 } 164} 165 166# Convert "(because I can) to "\(because I can\)" 167set tstatus_output [string map {\( \\(} $tstatus_output] 168set tstatus_output [string map {\) \\)} $tstatus_output] 169 170# The status should be identical to the status of live inferior. 171gdb_test "tstatus" "Using a trace file\.\r\n${tstatus_output}.*" \ 172 "tstatus on tfile target" 173 174# Change target to ctf if GDB supports. 175gdb_test_multiple "target ctf ${tracefile}.ctf" "" { 176 -re "Undefined target command: \"ctf ${tracefile}.ctf\"\. Try \"help target\"\.\r\n$gdb_prompt $" { 177 } 178 -re ".*\r\n$gdb_prompt $" { 179 gdb_test "tstatus" "Using a trace file\.\r\n${tstatus_output}.*" \ 180 "tstatus on ctf target" 181 } 182} 183