Fix: Null pointer dereference in ldlex.l
[binutils-gdb.git] / gdb / testsuite / gdb.trace / report.exp
blob14db2511d40cc392061d2dfd89dfac5168fbb07c
1 # Copyright 1998-2023 Free Software Foundation, Inc.
3 # This program is free software; you can redistribute it and/or modify
4 # it under the terms of the GNU General Public License as published by
5 # the Free Software Foundation; either version 3 of the License, or
6 # (at your option) any later version.
8 # This program is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # GNU General Public License for more details.
13 # You should have received a copy of the GNU General Public License
14 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 # This file was written by Michael Snyder (msnyder@cygnus.com)
18 load_lib "trace-support.exp"
20 standard_testfile actions.c
21 require gdb_trace_common_supports_arch
22 if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \
23 executable {debug nowarnings nopie}] != "" } {
24 untested "failed to compile"
25 return -1
27 clean_restart $binfile
28 runto_main
30 if {![gdb_target_supports_trace]} {
31 unsupported "current target does not support trace"
32 return 1
36 set cr "\[\r\n\]+"
38 # If testing on a remote host, download the source file.
39 # remote_download host $srcdir/$subdir/$srcfile
42 # test general reporting of trace experiment results
45 set testline1 0
46 set testline2 0
47 set testline3 0
48 set testline4 0
49 set testline5 0
50 set testline6 0
52 set arg1 1
53 set arg2 2
54 set arg3 3
55 set arg4 4
56 set arg5 5
57 set arg6 6
59 set gdb_recursion_test_baseline [gdb_find_recursion_test_baseline $srcfile]
60 if { $gdb_recursion_test_baseline == -1 } {
61 fail "could not find gdb_recursion_test function"
62 return
65 set return_me 0
67 gdb_test_multiple "list $gdb_recursion_test_baseline, +12" "" {
68 -re "\[\r\n\](\[0-9\]+)\[^\r\n\]+gdbtestline 1 " {
69 set testline1 $expect_out(1,string)
70 exp_continue
72 -re "\[\r\n\](\[0-9\]+)\[^\r\n\]+gdbtestline 2 " {
73 set testline2 $expect_out(1,string)
74 exp_continue
76 -re "\[\r\n\](\[0-9\]+)\[^\r\n\]+gdbtestline 3 " {
77 set testline3 $expect_out(1,string)
78 exp_continue
80 -re "\[\r\n\](\[0-9\]+)\[^\r\n\]+gdbtestline 4 " {
81 set testline4 $expect_out(1,string)
82 exp_continue
84 -re "\[\r\n\](\[0-9\]+)\[^\r\n\]+gdbtestline 5 " {
85 set testline5 $expect_out(1,string)
86 exp_continue
88 -re "\[\r\n\](\[0-9\]+)\[^\r\n\]+gdbtestline 6 " {
89 set testline6 $expect_out(1,string)
90 exp_continue
92 -re ".*$gdb_prompt $" {
93 if { ($testline1 == 0) || ($testline2 == 0) || ($testline3 == 0) || ($testline4 == 0) || ($testline5 == 0) || ($testline6 == 0) } {
94 untested "unexpected testline values"
95 set return_me 1
96 all tests in this module will fail."
99 default {
100 untested "couldn't match pattern"
101 set return_me 1
102 all tests in this module will fail."
106 if {$return_me == 1} {
107 return -1
111 # Setup trace experiment. This will involve:
112 # 1) a tracepoint where nothing is collected
113 # 2) a tracepoint where only regs are collected
114 # 3) a tracepoint where only args are collected
115 # 4) a tracepoint where only locals are collected
116 # 5) a tracepoint where some amount of stack memory is collected.
117 # 6) a tracepoint where some expressions are collected.
120 gdb_delete_tracepoints
121 set tdp1 [gdb_gettpnum $testline1]
122 set tdp2 [gdb_gettpnum $testline2]
123 set tdp3 [gdb_gettpnum $testline3]
124 set tdp4 [gdb_gettpnum $testline4]
125 set tdp5 [gdb_gettpnum $testline5]
126 set tdp6 [gdb_gettpnum $testline6]
128 if { $tdp1 <= 0 || $tdp2 <= 0 || $tdp3 <= 0 || \
129 $tdp4 <= 0 || $tdp5 <= 0 || $tdp6 <= 0 } then {
130 fail "setting tracepoints failed"
131 return
134 gdb_trace_setactions "9.x: setup TP to collect regs" \
135 "$tdp2" \
136 "collect \$regs" "^$"
139 gdb_trace_setactions "9.x: setup TP to collect args" \
140 "$tdp3" \
141 "collect \$args" "^$"
143 gdb_trace_setactions "9.x: setup TP to collect locals" \
144 "$tdp4" \
145 "collect \$locs" "^$"
147 gdb_trace_setactions "9.x: setup TP to collect stack memory" \
148 "$tdp5" \
149 "collect \$$fpreg, \*\(void \*\*\) \$$spreg @ 64" "^$"
151 gdb_trace_setactions "9.x: setup TP to collect expressions" \
152 "$tdp6" \
153 "collect gdb_char_test, gdb_short_test, gdb_long_test" "^$"
155 gdb_test "tstart" ".*" ""
157 gdb_breakpoint "end" qualified
158 gdb_test "continue" \
159 "Continuing.*Breakpoint $decimal, end.*" \
160 "run trace experiment"
162 gdb_test "tstop" ".*" ""
164 gdb_tfind_test "9.1: init: make sure not debugging any trace frame" \
165 "none" "-1"
167 # 9.3 help tdump
169 gdb_test "help tdump" "Print everything collected at the current.*" \
170 "9.3: help tdump"
172 # Check the collected trace data from different sources, such as live
173 # inferior and tfile.
175 proc use_collected_data { data_source } {
176 with_test_prefix "${data_source}" {
177 global tdp1 tdp2 tdp3 tdp4 tdp5 tdp6
178 global testline1 testline2 testline3 testline4 testline5 testline6
179 global pcreg fpreg spreg
180 global srcfile srcdir subdir binfile
181 global arg1 arg3
182 global decimal hex gdb_prompt
184 # 9.1 test the tdump command
187 set timeout 60
189 gdb_tfind_test "9.1: find frame for TP $tdp1" "tracepoint $tdp1" \
190 "\$tracepoint" "$tdp1"
192 # Nothing was collected at tdp1, so this tdump should be empty.
193 gdb_test "tdump" \
194 "Data collected at tracepoint $tdp1, trace frame $decimal:" \
195 "9.1: tdump, nothing collected"
197 gdb_tfind_test "9.1: find frame for TP $tdp2" "tracepoint $tdp2" \
198 "\$tracepoint" "$tdp2"
200 # regs were collected at tdp2.
201 # How to match for the output of "info registers" on an unknown architecture?
202 # For now, assume that most architectures have a register called "pc".
204 gdb_test "tdump" \
205 "\[\r\n\]$pcreg .*" \
206 "9.1: tdump, regs collected"
208 gdb_tfind_test "9.1: find frame for TP $tdp3" "tracepoint $tdp3" \
209 "\$tracepoint" "$tdp3"
211 # args were collected at tdp3
212 gdb_test "tdump" \
213 "depth = 3.*q1 = 2.*q2 = 2.*q3 = 3.*q4 = 4.*q5 = 5.*q6 = 6" \
214 "9.1: tdump, args collected"
216 gdb_tfind_test "9.1: find frame for TP $tdp4" "tracepoint $tdp4" \
217 "\$tracepoint" "$tdp4"
219 # locals were collected at tdp4
220 gdb_test "tdump" \
221 "q = 1" \
222 "9.1: tdump, locals collected"
224 gdb_tfind_test "9.1: find frame for TP $tdp5" "tracepoint $tdp5" \
225 "\$tracepoint" "$tdp5"
227 # stack was collected at tdp5, plus the frame pointer
228 gdb_test "tdump" \
229 ".$fpreg = .*$spreg @ 64 = .*" \
230 "9.1: tdump, memrange collected"
232 gdb_tfind_test "9.1: find frame for TP $tdp6" "tracepoint $tdp6" \
233 "\$tracepoint" "$tdp6"
235 # globals were collected at tdp6
236 gdb_test "tdump" \
237 "gdb_char_test = 1.*gdb_short_test = 2.*gdb_long_test = 3" \
238 "9.1: tdump, global variables collected"
240 # 9.2 test tdump with arguments
241 # [no go, tdump doesn't have any arguments]
243 set linecount1 0
244 set linecount2 0
245 set linecount3 0
246 set linecount4 0
247 set linecount5 0
248 set linecount6 0
250 gdb_tfind_test "11.x, 12.1: find start frame" "start" "0"
253 # 11.x test built-in trace variables $trace_frame, $trace_line etc.
256 gdb_test "printf \"x %d x\\n\", \$trace_frame" "x 0 x" \
257 "11.1: test \$trace_frame"
259 gdb_test "printf \"x %d x\\n\", \$tracepoint" "x $tdp1 x" \
260 "11.2: test \$tracepoint"
262 gdb_test "printf \"x %d x\\n\", \$trace_line" "x $testline1 x" \
263 "11.3: test \$trace_line"
265 gdb_test_multiple "print \$trace_file" "11.4: test \$trace_file" {
266 -re "\\$\[0-9\]+ = \"$srcfile\"\[\r\n\]+$gdb_prompt $" {
267 pass "11.4: test \$trace_file"
269 -re "\\$\[0-9\]+ = \"$srcdir/$subdir/$srcfile\"\[\r\n\]+$gdb_prompt $" {
270 pass "11.4: test \$trace_file"
274 #gdb_test "print \$trace_file" "\"$srcdir/$subdir/$srcfile\"" \
275 # "11.4: test \$trace_file"
278 # 12.x test report generation using arbitrary GDB commands, loops etc.
281 gdb_test_multiple "while \$trace_frame != -1\n output \$trace_file\n printf \", line \%d \(tracepoint #\%d\)\\n\", \$trace_line, \$tracepoint\n tfind\n end" "12.1: trace report #1" {
282 -re "> end\r\n" {
283 exp_continue
285 -re "^Found trace frame \[0-9\]+, tracepoint \[0-9\]+\r\n" {
286 exp_continue
288 -re "^\[^\r\n\]* line $testline1 .tracepoint .$tdp1\\)\r\n" {
289 set linecount1 [expr $linecount1 + 1]
290 exp_continue
292 -re "^\[^\r\n\]* line $testline2 .tracepoint .$tdp2\\)\r\n" {
293 set linecount2 [expr $linecount2 + 1]
294 exp_continue
296 -re "^\[^\r\n\]* line $testline3 .tracepoint .$tdp3\\)\r\n" {
297 set linecount3 [expr $linecount3 + 1]
298 exp_continue
300 -re "^\[^\r\n\]* line $testline4 .tracepoint .$tdp4\\)\r\n" {
301 set linecount4 [expr $linecount4 + 1]
302 exp_continue
304 -re "^\[^\r\n\]* line $testline5 .tracepoint .$tdp5\\)\r\n" {
305 set linecount5 [expr $linecount5 + 1]
306 exp_continue
308 -re "^\[^\r\n\]* line $testline6 .tracepoint .$tdp6\\)\r\n" {
309 set linecount6 [expr $linecount6 + 1]
310 exp_continue
312 -re "^No trace frame found\r\n$gdb_prompt $" {
313 if { ($linecount1 < 4) || ($linecount2 < 4) || ($linecount3 < 4) || ($linecount4 < 4) || ($linecount5 < 4) || ($linecount6 < 4) } {
314 fail "12.1: trace report #1"
315 } else {
316 pass "12.1: trace report #1"
321 gdb_tfind_test "12.2: tfind end, selects no frame" "end" "-1"
322 gdb_tfind_test "12.2: find first TDP #2 frame" "tracepoint $tdp2" \
323 "\$tracepoint" "$tdp2"
325 set linecount2 0
327 gdb_test_multiple "while \$trace_frame != -1\n printf \"tracepoint #\%d, FP 0x\%08x, SP 0x\%08x, PC 0x%08x\\n\", \$tracepoint, \$fp, \$sp, \$pc\n tfind tracepoint\n end" "12.2: trace report #2" {
328 -re "tracepoint #$tdp2, FP $hex, SP $hex, PC $hex" {
329 set linecount2 [expr $linecount2 + 1]
330 exp_continue
332 -re ".*$gdb_prompt $" {
333 if { ($linecount2 < 4) } {
334 fail "12.2: trace report #2"
335 } else {
336 pass "12.2: trace report #2"
341 gdb_tfind_test "12.3: tfind end, selects no frame" "end" "-1"
342 gdb_tfind_test "12.3: find first TDP #3 frame" "tracepoint $tdp3" \
343 "\$tracepoint" "$tdp3"
345 set linecount3 0
347 gdb_test_multiple "while \$trace_frame != -1\n printf \"TDP #\%d, frame \%d: depth = \%d, q1 = \%d\\n\", \$tracepoint, \$trace_frame, depth, q1\n tfind tracepoint\n end" "12.3: trace report #3" {
348 -re "TDP #$tdp3, frame $decimal: depth = $decimal, q1 = $decimal" {
349 set linecount3 [expr $linecount3 + 1]
350 exp_continue
352 -re ".*$gdb_prompt $" {
353 if { ($linecount3 < 4) } {
354 fail "12.3: trace report #3"
355 } else {
356 pass "12.3: trace report #3"
361 gdb_tfind_test "12.4: tfind end, selects no frame" "end" "-1"
362 gdb_tfind_test "12.4: find first TDP #6 frame" "tracepoint $tdp6" \
363 "\$tracepoint" "$tdp6"
365 set linecount6 0
367 gdb_test_multiple "while \$trace_frame != -1\n printf \"TDP #\%d, frame %d: char_test = \%d, long_test = \%d\\n\", \$tracepoint, \$trace_frame, gdb_char_test, gdb_long_test\n tfind tracepoint\n end" "12.4: trace report #4" {
368 -re "TDP #$tdp6, frame $decimal: char_test = $arg1, long_test = $arg3" {
369 set linecount6 [expr $linecount6 + 1]
370 exp_continue
372 -re ".*$gdb_prompt $" {
373 if { ($linecount6 < 4) } {
374 fail "12.4: trace report #4"
375 } else {
376 pass "12.4: trace report #4"
381 # There is always a thread of an inferior, either a live one or
382 # a faked one.
383 gdb_test "info threads" "\\* ${decimal} (process|Thread) \[0-9\.\]+\[ \t\].*"
384 gdb_test "info inferiors" "\\* 1 process ${decimal} \[ \t\]+\[^\r\n\]*\[ \t\]+${binfile}.*"
388 use_collected_data "live"
390 # Finished!
391 gdb_tfind_test "finished: make sure not debugging any trace frame" \
392 "none" "-1"
394 # Save trace frames to tfile.
395 set tracefile [standard_output_file ${testfile}]
396 gdb_test "tsave ${tracefile}.tf" \
397 "Trace data saved to file '${tracefile}.tf'.*" \
398 "save tfile trace file"
400 # Save trace frames to ctf.
401 gdb_test "tsave -ctf ${tracefile}.ctf" \
402 "Trace data saved to directory '${tracefile}.ctf'.*" \
403 "save ctf trace file"
405 # Change target to tfile.
406 set test "change to tfile target"
407 gdb_test_multiple "target tfile ${tracefile}.tf" "$test" {
408 -re "A program is being debugged already. Kill it. .y or n. " {
409 send_gdb "y\n"
410 exp_continue
412 -re "$gdb_prompt $" {
413 pass "$test"
416 # Test the collected trace frames from tfile.
417 use_collected_data "tfile"
419 # Try to read ctf data if GDB supports.
420 gdb_test_multiple "target ctf ${tracefile}.ctf" "" {
421 -re "Undefined target command: \"ctf ${tracefile}.ctf\"\. Try \"help target\"\.\r\n$gdb_prompt $" {
423 -re ".*\r\n$gdb_prompt $" {
424 use_collected_data "ctf"