xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/testsuite/gdb.trace/report.exp (revision bdc22b2e01993381dcefeff2bc9b56ca75a4235c)
1#   Copyright 1998-2016 Free Software Foundation, Inc.
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
5# the Free Software Foundation; either version 3 of the License, or
6# (at your option) any later version.
7#
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.
12#
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/>.
15
16# This file was written by Michael Snyder (msnyder@cygnus.com)
17
18load_lib "trace-support.exp"
19
20
21gdb_exit
22gdb_start
23
24standard_testfile actions.c
25if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \
26	  executable {debug nowarnings}] != "" } {
27    untested report.exp
28    return -1
29}
30gdb_load $binfile
31gdb_test "tstop"       ".*" ""
32gdb_test "tfind none"  ".*" ""
33runto_main
34gdb_reinitialize_dir $srcdir/$subdir
35
36if { ![gdb_target_supports_trace] } then {
37    unsupported "Current target does not support trace"
38    return 1
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
65set gdb_recursion_test_baseline [gdb_find_recursion_test_baseline $srcfile]
66if { $gdb_recursion_test_baseline == -1 } {
67    fail "Could not find gdb_recursion_test function"
68    return
69}
70
71set return_me 0
72
73gdb_test_multiple "list $gdb_recursion_test_baseline, +12" "" {
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) } {
100	    untested report.exp
101	    set return_me 1
102all tests in this module will fail."
103	}
104    }
105    default {
106	    untested report.exp
107	    set return_me 1
108all tests in this module will fail."
109    }
110}
111
112if { $return_me == 1 } then {
113    return -1
114}
115
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"
137    return
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" \
155	"collect \$$fpreg, \*\(void \*\*\) \$$spreg @ 64" "^$"
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
161gdb_test "tstart" ".*" ""
162
163gdb_test "break end" ".*" ""
164gdb_test "continue" \
165    "Continuing.*Breakpoint $decimal, end.*" \
166    "run trace experiment"
167
168gdb_test "tstop" ".*" ""
169
170gdb_tfind_test "9.1: init: make sure not debugging any trace frame" \
171    "none" "-1"
172
173# 9.3 help tdump
174
175gdb_test "help tdump" "Print everything collected at the current.*" \
176	"9.3: help tdump"
177
178# Check the collected trace data from different sources, such as live
179# inferior and tfile.
180
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
186	global srcfile srcdir subdir binfile
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	    }
278	}
279
280	#gdb_test "print \$trace_file" "\"$srcdir/$subdir/$srcfile\"" \
281	    #	"11.4: test \$trace_file"
282
283	#
284	# 12.x test report generation using arbitrary GDB commands, loops etc.
285	#
286
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		}
324	    }
325	}
326
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"
330
331	set linecount2 0
332
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		}
344	    }
345	}
346
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"
350
351	set linecount3 0
352
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		}
364	    }
365	}
366
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"
370
371	set linecount6 0
372
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		}
384	    }
385	}
386
387	# There is always a thread of an inferior, either a live one or
388	# a faked one.
389	gdb_test "info threads" "\\* ${decimal}    (process|Thread) \[0-9\.\]+\[ \t\].*"
390	gdb_test "info inferiors" "\\* 1    process ${decimal} \[ \t\]+${binfile}.*"
391    }
392}
393
394use_collected_data "live"
395
396# Finished!
397gdb_tfind_test "finished: make sure not debugging any trace frame" \
398    "none" "-1"
399
400# Save trace frames to tfile.
401set tracefile [standard_output_file ${testfile}]
402gdb_test "tsave ${tracefile}.tf" \
403    "Trace data saved to file '${tracefile}.tf'.*" \
404    "save tfile trace file"
405
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
411# Change target to tfile.
412set test "change to tfile target"
413gdb_test_multiple "target tfile ${tracefile}.tf" "$test" {
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"
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}
433