]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/testsuite/gdb.trace/report.exp
update copyright year range in GDB files
[thirdparty/binutils-gdb.git] / gdb / testsuite / gdb.trace / report.exp
CommitLineData
61baf725 1# Copyright 1998-2017 Free Software Foundation, Inc.
c906108c
SS
2#
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
e22f8b7c 5# the Free Software Foundation; either version 3 of the License, or
c906108c 6# (at your option) any later version.
e22f8b7c 7#
c906108c
SS
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.
e22f8b7c 12#
c906108c 13# You should have received a copy of the GNU General Public License
e22f8b7c 14# along with this program. If not, see <http://www.gnu.org/licenses/>.
c906108c 15
c906108c
SS
16# This file was written by Michael Snyder (msnyder@cygnus.com)
17
4ec70201 18load_lib "trace-support.exp"
c906108c 19
c906108c
SS
20
21gdb_exit
22gdb_start
23
497a5eb0 24standard_testfile actions.c
f8b7eaf3
DJ
25if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \
26 executable {debug nowarnings}] != "" } {
84c93cd5 27 untested "failed to compile"
f8b7eaf3 28 return -1
c906108c 29}
f8b7eaf3 30gdb_load $binfile
de7ff789
MS
31gdb_test "tstop" ".*" ""
32gdb_test "tfind none" ".*" ""
f8b7eaf3 33runto_main
c906108c
SS
34gdb_reinitialize_dir $srcdir/$subdir
35
c906108c 36if { ![gdb_target_supports_trace] } then {
bc6c7af4 37 unsupported "current target does not support trace"
ae59b1da 38 return 1
c906108c
SS
39
40}
41
42set cr "\[\r\n\]+"
43
44# If testing on a remote host, download the source file.
45# remote_download host $srcdir/$subdir/$srcfile
46
47#
48# test general reporting of trace experiment results
49#
50
51set testline1 0
52set testline2 0
53set testline3 0
54set testline4 0
55set testline5 0
56set testline6 0
57
58set arg1 1
59set arg2 2
60set arg3 3
61set arg4 4
62set arg5 5
63set arg6 6
64
4ec70201 65set gdb_recursion_test_baseline [gdb_find_recursion_test_baseline $srcfile]
c906108c 66if { $gdb_recursion_test_baseline == -1 } {
bc6c7af4 67 fail "could not find gdb_recursion_test function"
4ec70201 68 return
c906108c
SS
69}
70
0ab48859
MS
71set return_me 0
72
73gdb_test_multiple "list $gdb_recursion_test_baseline, +12" "" {
c906108c
SS
74 -re "\[\r\n\](\[0-9\]+)\[^\r\n\]+gdbtestline 1 " {
75 set testline1 $expect_out(1,string)
76 exp_continue
77 }
78 -re "\[\r\n\](\[0-9\]+)\[^\r\n\]+gdbtestline 2 " {
79 set testline2 $expect_out(1,string)
80 exp_continue
81 }
82 -re "\[\r\n\](\[0-9\]+)\[^\r\n\]+gdbtestline 3 " {
83 set testline3 $expect_out(1,string)
84 exp_continue
85 }
86 -re "\[\r\n\](\[0-9\]+)\[^\r\n\]+gdbtestline 4 " {
87 set testline4 $expect_out(1,string)
88 exp_continue
89 }
90 -re "\[\r\n\](\[0-9\]+)\[^\r\n\]+gdbtestline 5 " {
91 set testline5 $expect_out(1,string)
92 exp_continue
93 }
94 -re "\[\r\n\](\[0-9\]+)\[^\r\n\]+gdbtestline 6 " {
95 set testline6 $expect_out(1,string)
96 exp_continue
97 }
98 -re ".*$gdb_prompt $" {
99 if { ($testline1 == 0) || ($testline2 == 0) || ($testline3 == 0) || ($testline4 == 0) || ($testline5 == 0) || ($testline6 == 0) } {
84c93cd5 100 untested "unexpected testline values"
0ab48859 101 set return_me 1
c906108c
SS
102all tests in this module will fail."
103 }
104 }
105 default {
84c93cd5 106 untested "couldn't match pattern"
0ab48859 107 set return_me 1
c906108c
SS
108all tests in this module will fail."
109 }
110}
111
0ab48859 112if { $return_me == 1 } then {
ae59b1da 113 return -1
0ab48859
MS
114}
115
c906108c
SS
116#
117# Setup trace experiment. This will involve:
118# 1) a tracepoint where nothing is collected
119# 2) a tracepoint where only regs are collected
120# 3) a tracepoint where only args are collected
121# 4) a tracepoint where only locals are collected
122# 5) a tracepoint where some amount of stack memory is collected.
123# 6) a tracepoint where some expressions are collected.
124#
125
126gdb_delete_tracepoints
127set tdp1 [gdb_gettpnum $testline1]
128set tdp2 [gdb_gettpnum $testline2]
129set tdp3 [gdb_gettpnum $testline3]
130set tdp4 [gdb_gettpnum $testline4]
131set tdp5 [gdb_gettpnum $testline5]
132set tdp6 [gdb_gettpnum $testline6]
133
134if { $tdp1 <= 0 || $tdp2 <= 0 || $tdp3 <= 0 || \
135 $tdp4 <= 0 || $tdp5 <= 0 || $tdp6 <= 0 } then {
136 fail "setting tracepoints failed"
4ec70201 137 return
c906108c
SS
138}
139
140gdb_trace_setactions "9.x: setup TP to collect regs" \
141 "$tdp2" \
142 "collect \$regs" "^$"
143
144
145gdb_trace_setactions "9.x: setup TP to collect args" \
146 "$tdp3" \
147 "collect \$args" "^$"
148
149gdb_trace_setactions "9.x: setup TP to collect locals" \
150 "$tdp4" \
151 "collect \$locs" "^$"
152
153gdb_trace_setactions "9.x: setup TP to collect stack memory" \
154 "$tdp5" \
6a8f2671 155 "collect \$$fpreg, \*\(void \*\*\) \$$spreg @ 64" "^$"
c906108c
SS
156
157gdb_trace_setactions "9.x: setup TP to collect expressions" \
158 "$tdp6" \
159 "collect gdb_char_test, gdb_short_test, gdb_long_test" "^$"
160
de7ff789 161gdb_test "tstart" ".*" ""
c906108c 162
de7ff789 163gdb_test "break end" ".*" ""
f8b7eaf3
DJ
164gdb_test "continue" \
165 "Continuing.*Breakpoint $decimal, end.*" \
166 "run trace experiment"
c906108c 167
de7ff789 168gdb_test "tstop" ".*" ""
c906108c 169
1c942fb9
YQ
170gdb_tfind_test "9.1: init: make sure not debugging any trace frame" \
171 "none" "-1"
c906108c 172
1c942fb9 173# 9.3 help tdump
c906108c 174
1c942fb9
YQ
175gdb_test "help tdump" "Print everything collected at the current.*" \
176 "9.3: help tdump"
c906108c 177
1c942fb9
YQ
178# Check the collected trace data from different sources, such as live
179# inferior and tfile.
180
0a251e08
YQ
181proc use_collected_data { data_source } {
182 with_test_prefix "${data_source}" {
183 global tdp1 tdp2 tdp3 tdp4 tdp5 tdp6
184 global testline1 testline2 testline3 testline4 testline5 testline6
185 global pcreg fpreg spreg
de7b2893 186 global srcfile srcdir subdir binfile
0a251e08
YQ
187 global arg1 arg3
188 global decimal hex gdb_prompt
189 #
190 # 9.1 test the tdump command
191 #
192
193 set timeout 60
194
195 gdb_tfind_test "9.1: find frame for TP $tdp1" "tracepoint $tdp1" \
196 "\$tracepoint" "$tdp1"
197
198 # Nothing was collected at tdp1, so this tdump should be empty.
199 gdb_test "tdump" \
200 "Data collected at tracepoint $tdp1, trace frame $decimal:" \
201 "9.1: tdump, nothing collected"
202
203 gdb_tfind_test "9.1: find frame for TP $tdp2" "tracepoint $tdp2" \
204 "\$tracepoint" "$tdp2"
205
206 # regs were collected at tdp2.
207 # How to match for the output of "info registers" on an unknown architecture?
208 # For now, assume that most architectures have a register called "pc".
209
210 gdb_test "tdump" \
211 "\[\r\n\]$pcreg .*" \
212 "9.1: tdump, regs collected"
213
214 gdb_tfind_test "9.1: find frame for TP $tdp3" "tracepoint $tdp3" \
215 "\$tracepoint" "$tdp3"
216
217 # args were collected at tdp3
218 gdb_test "tdump" \
219 "depth = 3.*q1 = 2.*q2 = 2.*q3 = 3.*q4 = 4.*q5 = 5.*q6 = 6" \
220 "9.1: tdump, args collected"
221
222 gdb_tfind_test "9.1: find frame for TP $tdp4" "tracepoint $tdp4" \
223 "\$tracepoint" "$tdp4"
224
225 # locals were collected at tdp4
226 gdb_test "tdump" \
227 "q = 1" \
228 "9.1: tdump, locals collected"
229
230 gdb_tfind_test "9.1: find frame for TP $tdp5" "tracepoint $tdp5" \
231 "\$tracepoint" "$tdp5"
232
233 # stack was collected at tdp5, plus the frame pointer
234 gdb_test "tdump" \
235 ".$fpreg = .*$spreg @ 64 = .*" \
236 "9.1: tdump, memrange collected"
237
238 gdb_tfind_test "9.1: find frame for TP $tdp6" "tracepoint $tdp6" \
239 "\$tracepoint" "$tdp6"
240
241 # globals were collected at tdp6
242 gdb_test "tdump" \
243 "gdb_char_test = 1.*gdb_short_test = 2.*gdb_long_test = 3" \
244 "9.1: tdump, global variables collected"
245
246 # 9.2 test tdump with arguments
247 # [no go, tdump doesn't have any arguments]
248
249 set linecount1 0
250 set linecount2 0
251 set linecount3 0
252 set linecount4 0
253 set linecount5 0
254 set linecount6 0
255
256 gdb_tfind_test "11.x, 12.1: find start frame" "start" "0"
257
258 #
259 # 11.x test built-in trace variables $trace_frame, $trace_line etc.
260 #
261
262 gdb_test "printf \"x %d x\\n\", \$trace_frame" "x 0 x" \
263 "11.1: test \$trace_frame"
264
265 gdb_test "printf \"x %d x\\n\", \$tracepoint" "x $tdp1 x" \
266 "11.2: test \$tracepoint"
267
268 gdb_test "printf \"x %d x\\n\", \$trace_line" "x $testline1 x" \
269 "11.3: test \$trace_line"
270
271 gdb_test_multiple "print \$trace_file" "11.4: test \$trace_file" {
272 -re "\\$\[0-9\]+ = \"$srcfile\"\[\r\n\]+$gdb_prompt $" {
273 pass "11.4: test \$trace_file"
274 }
275 -re "\\$\[0-9\]+ = \"$srcdir/$subdir/$srcfile\"\[\r\n\]+$gdb_prompt $" {
276 pass "11.4: test \$trace_file"
277 }
1c942fb9 278 }
c906108c 279
0a251e08
YQ
280 #gdb_test "print \$trace_file" "\"$srcdir/$subdir/$srcfile\"" \
281 # "11.4: test \$trace_file"
c906108c 282
0a251e08
YQ
283 #
284 # 12.x test report generation using arbitrary GDB commands, loops etc.
285 #
c906108c 286
0a251e08
YQ
287 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" {
288 -re "> end\r\n" {
289 exp_continue
290 }
291 -re "^Found trace frame \[0-9\]+, tracepoint \[0-9\]+\r\n" {
292 exp_continue
293 }
294 -re "^\[^\r\n\]* line $testline1 .tracepoint .$tdp1\\)\r\n" {
295 set linecount1 [expr $linecount1 + 1]
296 exp_continue
297 }
298 -re "^\[^\r\n\]* line $testline2 .tracepoint .$tdp2\\)\r\n" {
299 set linecount2 [expr $linecount2 + 1]
300 exp_continue
301 }
302 -re "^\[^\r\n\]* line $testline3 .tracepoint .$tdp3\\)\r\n" {
303 set linecount3 [expr $linecount3 + 1]
304 exp_continue
305 }
306 -re "^\[^\r\n\]* line $testline4 .tracepoint .$tdp4\\)\r\n" {
307 set linecount4 [expr $linecount4 + 1]
308 exp_continue
309 }
310 -re "^\[^\r\n\]* line $testline5 .tracepoint .$tdp5\\)\r\n" {
311 set linecount5 [expr $linecount5 + 1]
312 exp_continue
313 }
314 -re "^\[^\r\n\]* line $testline6 .tracepoint .$tdp6\\)\r\n" {
315 set linecount6 [expr $linecount6 + 1]
316 exp_continue
317 }
318 -re "^No trace frame found\r\n$gdb_prompt $" {
319 if { ($linecount1 < 4) || ($linecount2 < 4) || ($linecount3 < 4) || ($linecount4 < 4) || ($linecount5 < 4) || ($linecount6 < 4) } {
320 fail "12.1: trace report #1"
321 } else {
322 pass "12.1: trace report #1"
323 }
1c942fb9 324 }
c906108c 325 }
c906108c 326
0a251e08
YQ
327 gdb_tfind_test "12.2: tfind end, selects no frame" "end" "-1"
328 gdb_tfind_test "12.2: find first TDP #2 frame" "tracepoint $tdp2" \
329 "\$tracepoint" "$tdp2"
c906108c 330
0a251e08 331 set linecount2 0
c906108c 332
0a251e08
YQ
333 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" {
334 -re "tracepoint #$tdp2, FP $hex, SP $hex, PC $hex" {
335 set linecount2 [expr $linecount2 + 1]
336 exp_continue
337 }
338 -re ".*$gdb_prompt $" {
339 if { ($linecount2 < 4) } {
340 fail "12.2: trace report #2"
341 } else {
342 pass "12.2: trace report #2"
343 }
1c942fb9 344 }
c906108c 345 }
c906108c 346
0a251e08
YQ
347 gdb_tfind_test "12.3: tfind end, selects no frame" "end" "-1"
348 gdb_tfind_test "12.3: find first TDP #3 frame" "tracepoint $tdp3" \
349 "\$tracepoint" "$tdp3"
c906108c 350
0a251e08 351 set linecount3 0
c906108c 352
0a251e08
YQ
353 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" {
354 -re "TDP #$tdp3, frame $decimal: depth = $decimal, q1 = $decimal" {
355 set linecount3 [expr $linecount3 + 1]
356 exp_continue
357 }
358 -re ".*$gdb_prompt $" {
359 if { ($linecount3 < 4) } {
360 fail "12.3: trace report #3"
361 } else {
362 pass "12.3: trace report #3"
363 }
1c942fb9 364 }
c906108c 365 }
c906108c 366
0a251e08
YQ
367 gdb_tfind_test "12.4: tfind end, selects no frame" "end" "-1"
368 gdb_tfind_test "12.4: find first TDP #6 frame" "tracepoint $tdp6" \
369 "\$tracepoint" "$tdp6"
c906108c 370
0a251e08 371 set linecount6 0
c906108c 372
0a251e08
YQ
373 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" {
374 -re "TDP #$tdp6, frame $decimal: char_test = $arg1, long_test = $arg3" {
375 set linecount6 [expr $linecount6 + 1]
376 exp_continue
377 }
378 -re ".*$gdb_prompt $" {
379 if { ($linecount6 < 4) } {
380 fail "12.4: trace report #4"
381 } else {
382 pass "12.4: trace report #4"
383 }
1c942fb9 384 }
c906108c 385 }
de7b2893
YQ
386
387 # There is always a thread of an inferior, either a live one or
388 # a faked one.
a8f077dc 389 gdb_test "info threads" "\\* ${decimal} (process|Thread) \[0-9\.\]+\[ \t\].*"
de7b2893 390 gdb_test "info inferiors" "\\* 1 process ${decimal} \[ \t\]+${binfile}.*"
c906108c 391 }
c906108c 392}
1c942fb9
YQ
393
394use_collected_data "live"
c906108c
SS
395
396# Finished!
1c942fb9
YQ
397gdb_tfind_test "finished: make sure not debugging any trace frame" \
398 "none" "-1"
399
400# Save trace frames to tfile.
f3786771
YQ
401set tracefile [standard_output_file ${testfile}]
402gdb_test "tsave ${tracefile}.tf" \
403 "Trace data saved to file '${tracefile}.tf'.*" \
404 "save tfile trace file"
1c942fb9 405
393fd4c3
YQ
406# Save trace frames to ctf.
407gdb_test "tsave -ctf ${tracefile}.ctf" \
408 "Trace data saved to directory '${tracefile}.ctf'.*" \
409 "save ctf trace file"
410
1c942fb9
YQ
411# Change target to tfile.
412set test "change to tfile target"
f3786771 413gdb_test_multiple "target tfile ${tracefile}.tf" "$test" {
1c942fb9
YQ
414 -re "A program is being debugged already. Kill it. .y or n. " {
415 send_gdb "y\n"
416 exp_continue
417 }
418 -re "$gdb_prompt $" {
419 pass "$test"
420 }
421}
422# Test the collected trace frames from tfile.
423use_collected_data "tfile"
393fd4c3
YQ
424
425# Try to read ctf data if GDB supports.
426gdb_test_multiple "target ctf ${tracefile}.ctf" "" {
427 -re "Undefined target command: \"ctf ${tracefile}.ctf\"\. Try \"help target\"\.\r\n$gdb_prompt $" {
428 }
429 -re ".*\r\n$gdb_prompt $" {
430 use_collected_data "ctf"
431 }
432}