b32bca1fb49ca2254cd55e467447579702d7482d
[binutils-gdb.git] / gdb / testsuite / gdb.trace / report.exp
1 # Copyright 1998-2013 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
18 load_lib "trace-support.exp";
19
20
21 gdb_exit
22 gdb_start
23
24 standard_testfile actions.c
25 if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \
26 executable {debug nowarnings}] != "" } {
27 untested report.exp
28 return -1
29 }
30 gdb_load $binfile
31 gdb_test "tstop" ".*" ""
32 gdb_test "tfind none" ".*" ""
33 runto_main
34 gdb_reinitialize_dir $srcdir/$subdir
35
36 if { ![gdb_target_supports_trace] } then {
37 unsupported "Current target does not support trace"
38 return 1;
39
40 }
41
42 set 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
51 set testline1 0
52 set testline2 0
53 set testline3 0
54 set testline4 0
55 set testline5 0
56 set testline6 0
57
58 set arg1 1
59 set arg2 2
60 set arg3 3
61 set arg4 4
62 set arg5 5
63 set arg6 6
64
65 set gdb_recursion_test_baseline [gdb_find_recursion_test_baseline $srcfile];
66 if { $gdb_recursion_test_baseline == -1 } {
67 fail "Could not find gdb_recursion_test function"
68 return;
69 }
70
71 set return_me 0
72
73 gdb_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
102 all tests in this module will fail."
103 }
104 }
105 default {
106 untested report.exp
107 set return_me 1
108 all tests in this module will fail."
109 }
110 }
111
112 if { $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
126 gdb_delete_tracepoints
127 set tdp1 [gdb_gettpnum $testline1]
128 set tdp2 [gdb_gettpnum $testline2]
129 set tdp3 [gdb_gettpnum $testline3]
130 set tdp4 [gdb_gettpnum $testline4]
131 set tdp5 [gdb_gettpnum $testline5]
132 set tdp6 [gdb_gettpnum $testline6]
133
134 if { $tdp1 <= 0 || $tdp2 <= 0 || $tdp3 <= 0 || \
135 $tdp4 <= 0 || $tdp5 <= 0 || $tdp6 <= 0 } then {
136 fail "setting tracepoints failed"
137 return;
138 }
139
140 gdb_trace_setactions "9.x: setup TP to collect regs" \
141 "$tdp2" \
142 "collect \$regs" "^$"
143
144
145 gdb_trace_setactions "9.x: setup TP to collect args" \
146 "$tdp3" \
147 "collect \$args" "^$"
148
149 gdb_trace_setactions "9.x: setup TP to collect locals" \
150 "$tdp4" \
151 "collect \$locs" "^$"
152
153 if [is_amd64_regs_target] {
154 set fpreg "rbp"
155 set spreg "rsp"
156 set pcreg "rip"
157 } elseif [is_x86_like_target] {
158 set fpreg "ebp"
159 set spreg "esp"
160 set pcreg "eip"
161 } else {
162 set fpreg "fp"
163 set spreg "sp"
164 set pcreg "pc"
165 }
166
167 gdb_trace_setactions "9.x: setup TP to collect stack memory" \
168 "$tdp5" \
169 "collect \$$fpreg, \*\(void \*\*\) \$$spreg @ 64" "^$"
170
171 gdb_trace_setactions "9.x: setup TP to collect expressions" \
172 "$tdp6" \
173 "collect gdb_char_test, gdb_short_test, gdb_long_test" "^$"
174
175 gdb_test "tstart" ".*" ""
176
177 gdb_test "break end" ".*" ""
178 gdb_test "continue" \
179 "Continuing.*Breakpoint $decimal, end.*" \
180 "run trace experiment"
181
182 gdb_test "tstop" ".*" ""
183
184 gdb_tfind_test "9.1: init: make sure not debugging any trace frame" \
185 "none" "-1"
186
187 # 9.3 help tdump
188
189 gdb_test "help tdump" "Print everything collected at the current.*" \
190 "9.3: help tdump"
191
192 # Check the collected trace data from different sources, such as live
193 # inferior and tfile.
194
195 proc use_collected_data { data_source } { with_test_prefix "${data_source}" {
196 global tdp1 tdp2 tdp3 tdp4 tdp5 tdp6
197 global testline1 testline2 testline3 testline4 testline5 testline6
198 global pcreg fpreg spreg
199 global srcfile srcdir subdir
200 global arg1 arg3
201 global decimal hex gdb_prompt
202 #
203 # 9.1 test the tdump command
204 #
205
206 set timeout 60
207
208 gdb_tfind_test "9.1: find frame for TP $tdp1" "tracepoint $tdp1" \
209 "\$tracepoint" "$tdp1"
210
211 # Nothing was collected at tdp1, so this tdump should be empty.
212 gdb_test "tdump" \
213 "Data collected at tracepoint $tdp1, trace frame $decimal:" \
214 "9.1: tdump, nothing collected"
215
216 gdb_tfind_test "9.1: find frame for TP $tdp2" "tracepoint $tdp2" \
217 "\$tracepoint" "$tdp2"
218
219 # regs were collected at tdp2.
220 # How to match for the output of "info registers" on an unknown architecture?
221 # For now, assume that most architectures have a register called "pc".
222
223 gdb_test "tdump" \
224 "\[\r\n\]$pcreg .*" \
225 "9.1: tdump, regs collected"
226
227 gdb_tfind_test "9.1: find frame for TP $tdp3" "tracepoint $tdp3" \
228 "\$tracepoint" "$tdp3"
229
230 # args were collected at tdp3
231 gdb_test "tdump" \
232 "depth = 3.*q1 = 2.*q2 = 2.*q3 = 3.*q4 = 4.*q5 = 5.*q6 = 6" \
233 "9.1: tdump, args collected"
234
235 gdb_tfind_test "9.1: find frame for TP $tdp4" "tracepoint $tdp4" \
236 "\$tracepoint" "$tdp4"
237
238 # locals were collected at tdp4
239 gdb_test "tdump" \
240 "q = 1" \
241 "9.1: tdump, locals collected"
242
243 gdb_tfind_test "9.1: find frame for TP $tdp5" "tracepoint $tdp5" \
244 "\$tracepoint" "$tdp5"
245
246 # stack was collected at tdp5, plus the frame pointer
247 gdb_test "tdump" \
248 ".$fpreg = .*$spreg @ 64 = .*" \
249 "9.1: tdump, memrange collected"
250
251 gdb_tfind_test "9.1: find frame for TP $tdp6" "tracepoint $tdp6" \
252 "\$tracepoint" "$tdp6"
253
254 # globals were collected at tdp6
255 gdb_test "tdump" \
256 "gdb_char_test = 1.*gdb_short_test = 2.*gdb_long_test = 3" \
257 "9.1: tdump, global variables collected"
258
259 # 9.2 test tdump with arguments
260 # [no go, tdump doesn't have any arguments]
261
262 set linecount1 0
263 set linecount2 0
264 set linecount3 0
265 set linecount4 0
266 set linecount5 0
267 set linecount6 0
268
269 gdb_tfind_test "11.x, 12.1: find start frame" "start" "0"
270
271 #
272 # 11.x test built-in trace variables $trace_frame, $trace_line etc.
273 #
274
275 gdb_test "printf \"x %d x\\n\", \$trace_frame" "x 0 x" \
276 "11.1: test \$trace_frame"
277
278 gdb_test "printf \"x %d x\\n\", \$tracepoint" "x $tdp1 x" \
279 "11.2: test \$tracepoint"
280
281 gdb_test "printf \"x %d x\\n\", \$trace_line" "x $testline1 x" \
282 "11.3: test \$trace_line"
283
284 gdb_test_multiple "print \$trace_file" "11.4: test \$trace_file" {
285 -re "\\$\[0-9\]+ = \"$srcfile\"\[\r\n\]+$gdb_prompt $" {
286 pass "11.4: test \$trace_file"
287 }
288 -re "\\$\[0-9\]+ = \"$srcdir/$subdir/$srcfile\"\[\r\n\]+$gdb_prompt $" {
289 pass "11.4: test \$trace_file"
290 }
291 }
292
293 #gdb_test "print \$trace_file" "\"$srcdir/$subdir/$srcfile\"" \
294 # "11.4: test \$trace_file"
295
296 #
297 # 12.x test report generation using arbitrary GDB commands, loops etc.
298 #
299
300 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" {
301 -re "> end\r\n" {
302 exp_continue
303 }
304 -re "^Found trace frame \[0-9\]+, tracepoint \[0-9\]+\r\n" {
305 exp_continue
306 }
307 -re "^\[^\r\n\]* line $testline1 .tracepoint .$tdp1\\)\r\n" {
308 set linecount1 [expr $linecount1 + 1]
309 exp_continue
310 }
311 -re "^\[^\r\n\]* line $testline2 .tracepoint .$tdp2\\)\r\n" {
312 set linecount2 [expr $linecount2 + 1]
313 exp_continue
314 }
315 -re "^\[^\r\n\]* line $testline3 .tracepoint .$tdp3\\)\r\n" {
316 set linecount3 [expr $linecount3 + 1]
317 exp_continue
318 }
319 -re "^\[^\r\n\]* line $testline4 .tracepoint .$tdp4\\)\r\n" {
320 set linecount4 [expr $linecount4 + 1]
321 exp_continue
322 }
323 -re "^\[^\r\n\]* line $testline5 .tracepoint .$tdp5\\)\r\n" {
324 set linecount5 [expr $linecount5 + 1]
325 exp_continue
326 }
327 -re "^\[^\r\n\]* line $testline6 .tracepoint .$tdp6\\)\r\n" {
328 set linecount6 [expr $linecount6 + 1]
329 exp_continue
330 }
331 -re "^No trace frame found\r\n$gdb_prompt $" {
332 if { ($linecount1 < 4) || ($linecount2 < 4) || ($linecount3 < 4) || ($linecount4 < 4) || ($linecount5 < 4) || ($linecount6 < 4) } {
333 fail "12.1: trace report #1"
334 } else {
335 pass "12.1: trace report #1"
336 }
337 }
338 }
339
340 gdb_tfind_test "12.2: tfind end, selects no frame" "end" "-1"
341 gdb_tfind_test "12.2: find first TDP #2 frame" "tracepoint $tdp2" \
342 "\$tracepoint" "$tdp2"
343
344 set linecount2 0
345
346 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" {
347 -re "tracepoint #$tdp2, FP $hex, SP $hex, PC $hex" {
348 set linecount2 [expr $linecount2 + 1]
349 exp_continue
350 }
351 -re ".*$gdb_prompt $" {
352 if { ($linecount2 < 4) } {
353 fail "12.2: trace report #2"
354 } else {
355 pass "12.2: trace report #2"
356 }
357 }
358 }
359
360 gdb_tfind_test "12.3: tfind end, selects no frame" "end" "-1"
361 gdb_tfind_test "12.3: find first TDP #3 frame" "tracepoint $tdp3" \
362 "\$tracepoint" "$tdp3"
363
364 set linecount3 0
365
366 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" {
367 -re "TDP #$tdp3, frame $decimal: depth = $decimal, q1 = $decimal" {
368 set linecount3 [expr $linecount3 + 1]
369 exp_continue
370 }
371 -re ".*$gdb_prompt $" {
372 if { ($linecount3 < 4) } {
373 fail "12.3: trace report #3"
374 } else {
375 pass "12.3: trace report #3"
376 }
377 }
378 }
379
380 gdb_tfind_test "12.4: tfind end, selects no frame" "end" "-1"
381 gdb_tfind_test "12.4: find first TDP #6 frame" "tracepoint $tdp6" \
382 "\$tracepoint" "$tdp6"
383
384 set linecount6 0
385
386 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" {
387 -re "TDP #$tdp6, frame $decimal: char_test = $arg1, long_test = $arg3" {
388 set linecount6 [expr $linecount6 + 1]
389 exp_continue
390 }
391 -re ".*$gdb_prompt $" {
392 if { ($linecount6 < 4) } {
393 fail "12.4: trace report #4"
394 } else {
395 pass "12.4: trace report #4"
396 }
397 }
398 }
399 }
400 }
401
402 use_collected_data "live"
403
404 # Finished!
405 gdb_tfind_test "finished: make sure not debugging any trace frame" \
406 "none" "-1"
407
408 # Save trace frames to tfile.
409 gdb_test "tsave report.tf" "Trace data saved to file 'report.tf'.*"
410
411 # Change target to tfile.
412 set test "change to tfile target"
413 gdb_test_multiple "target tfile report.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.
423 use_collected_data "tfile"