50344d2090d1fae572ec50d0ee1be09d51e7a0b3
[deliverable/binutils-gdb.git] / gdb / testsuite / gdb.trace / trace-break.exp
1 # Copyright 2011 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
15 load_lib "trace-support.exp";
16
17 set testfile "trace-break"
18 set executable $testfile
19 set srcfile $testfile.c
20 set binfile $objdir/$subdir/$testfile
21 set expfile $testfile.exp
22
23 # Some targets have leading underscores on assembly symbols.
24 set additional_flags [gdb_target_symbol_prefix_flags]
25
26 if [prepare_for_testing $expfile $executable $srcfile \
27 [list debug $additional_flags]] {
28 untested "failed to prepare for trace tests"
29 return -1
30 }
31
32 if ![runto_main] {
33 fail "Can't run to main to check for trace support"
34 return -1
35 }
36
37 if ![gdb_target_supports_trace] {
38 unsupported "target does not support trace"
39 return -1;
40 }
41
42 set fpreg "fp"
43 set spreg "sp"
44 set pcreg "pc"
45
46 if [is_amd64_regs_target] {
47 set fpreg "rbp"
48 set spreg "rsp"
49 set pcreg "rip"
50 } elseif [is_x86_like_target] {
51 set fpreg "ebp"
52 set spreg "esp"
53 set pcreg "eip"
54 }
55
56 # Set breakpoint and tracepoint at the same address.
57
58 proc break_trace_same_addr_1 { trace_type option } {
59 global executable
60 global pf_prefix
61 global hex
62
63 set old_pf_prefix $pf_prefix
64 set pf_prefix "$pf_prefix 1 $trace_type $option:"
65
66 # Start with a fresh gdb.
67 clean_restart ${executable}
68 if ![runto_main] {
69 fail "Can't run to main"
70 set pf_prefix $old_pf_prefix
71 return -1
72 }
73
74 gdb_test_no_output "set breakpoint always-inserted ${option}"
75
76 gdb_test "break end" "Breakpoint \[0-9\] at $hex: file.*"
77
78 gdb_test "break set_point" "Breakpoint \[0-9\] at $hex: file.*"
79 gdb_test "${trace_type} set_point" "\(Fast t|T\)racepoint \[0-9\] at $hex: file.*"
80
81 gdb_test_no_output "tstart"
82
83 gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" "continue to set_point"
84
85 gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" "continue to end"
86 gdb_test_no_output "tstop"
87
88 gdb_test "tfind" "Found trace frame 0, tracepoint .*" "tfind frame 0"
89 gdb_test "tfind" "Target failed to find requested trace frame\\..*"
90
91 set pf_prefix $old_pf_prefix
92 }
93
94 # Set multiple tracepoints at the same address.
95
96 proc break_trace_same_addr_2 { trace_type1 trace_type2 option } {
97 global executable
98 global pf_prefix
99 global hex
100
101 set old_pf_prefix $pf_prefix
102 set pf_prefix "$pf_prefix 2 $trace_type1 $trace_type2 $option:"
103
104 # Start with a fresh gdb.
105 clean_restart ${executable}
106 if ![runto_main] {
107 fail "Can't run to main"
108 set pf_prefix $old_pf_prefix
109 return -1
110 }
111
112 gdb_test_no_output "set breakpoint always-inserted ${option}"
113
114 gdb_test "break end" "Breakpoint \[0-9\] at $hex: file.*"
115
116 gdb_test "${trace_type1} set_point" \
117 "\(Fast t|T\)racepoint \[0-9\] at $hex: file.*" \
118 "${trace_type1} set_point (1)"
119
120 gdb_test "${trace_type2} set_point" \
121 "\(Fast t|T\)racepoint \[0-9\] at $hex: file.*" \
122 "${trace_type2} set_point (2)"
123
124 gdb_test_no_output "tstart"
125 gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" "continue to end"
126
127 gdb_test_no_output "tstop"
128
129 gdb_test "tfind" "Found trace frame 0, tracepoint .*" "tfind frame 0"
130 gdb_test "tfind" "Found trace frame 1, tracepoint .*" "tfind frame 1"
131 gdb_test "tfind" "Target failed to find requested trace frame\\..*"
132
133 set pf_prefix $old_pf_prefix
134 }
135
136 # Set breakpoint and tracepoint at the same address. Delete breakpoint, and verify
137 # that tracepoint still works.
138
139 proc break_trace_same_addr_3 { trace_type option } {
140 global executable
141 global pf_prefix
142 global hex
143
144 set old_pf_prefix $pf_prefix
145 set pf_prefix "$pf_prefix 3 $trace_type $option:"
146
147 # Start with a fresh gdb.
148 clean_restart ${executable}
149 if ![runto_main] {
150 fail "Can't run to main"
151 set pf_prefix $old_pf_prefix
152 return -1
153 }
154
155 gdb_test_no_output "set breakpoint always-inserted ${option}"
156 gdb_test "break marker" "Breakpoint \[0-9\] at $hex: file.*"
157 gdb_test "break end" "Breakpoint \[0-9\] at $hex: file.*"
158
159 gdb_test "break set_point" "Breakpoint \[0-9\] at $hex: file.*"
160 gdb_test "${trace_type} set_point" "\(Fast t|T\)racepoint \[0-9\] at $hex: file.*"
161
162 gdb_test_no_output "tstart"
163
164 gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" "continue to marker"
165 gdb_test "delete break 4"
166
167 gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" "continue to end"
168 gdb_test_no_output "tstop"
169
170 gdb_test "tfind" "Found trace frame 0, tracepoint .*" "tfind frame 0"
171 gdb_test "tfind" "Target failed to find requested trace frame\\..*"
172
173 set pf_prefix $old_pf_prefix
174 }
175
176 # Set breakpoint and tracepoint at the same address. Delete tracepoint, and verify
177 # that breakpoint still works.
178
179 proc break_trace_same_addr_4 { trace_type option } {
180 global executable
181 global pf_prefix
182 global hex
183
184 set old_pf_prefix $pf_prefix
185 set pf_prefix "$pf_prefix 4 $trace_type $option:"
186
187 # Start with a fresh gdb.
188 clean_restart ${executable}
189 if ![runto_main] {
190 fail "Can't run to main"
191 set pf_prefix $old_pf_prefix
192 return -1
193 }
194
195 gdb_test_no_output "set breakpoint always-inserted ${option}"
196 gdb_test "break marker" "Breakpoint \[0-9\] at $hex: file.*"
197 gdb_test "break end" "Breakpoint \[0-9\] at $hex: file.*"
198
199 gdb_test "break set_point" "Breakpoint \[0-9\] at $hex: file.*"
200 gdb_test "${trace_type} set_point" "\(Fast t|T\)racepoint \[0-9\] at $hex: file.*"
201
202 gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" "continue to marker"
203 # Delete tracepoint set on set_point.
204 gdb_test "delete trace 5"
205
206 gdb_test "tstart" "No tracepoints defined, not starting trace.*"
207
208 gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" "continue to set_point"
209 gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" "continue to end"
210 gdb_test "tstop" "Trace is not running.*"
211
212 gdb_test "tfind" "Target failed to find requested trace frame\\..*"
213
214 set pf_prefix $old_pf_prefix
215 }
216
217 # Set two tracepoints TRACE1 and TRACE2 at two locations, and start tracing.
218 # Then, set tracepoint TRACE3 at either of these two locations.
219 # TRACE3_AT_FIRST_LOC is a boolean variable to decide insert TRACE3 at which
220 # of two locations. Verify these tracepoints work as expected.
221
222 proc break_trace_same_addr_5 { trace1 trace2 trace3 trace3_at_first_loc } {
223 global executable
224 global pf_prefix
225 global hex
226 global fpreg
227 global spreg
228 global pcreg
229
230 set old_pf_prefix $pf_prefix
231 set pf_prefix "$pf_prefix 5 $trace1 $trace2 ${trace3}@${trace3_at_first_loc}:"
232
233 # Start with a fresh gdb.
234 clean_restart ${executable}
235 if ![runto_main] {
236 fail "Can't run to main"
237 set pf_prefix $old_pf_prefix
238 return -1
239 }
240
241 gdb_test "break marker" "Breakpoint \[0-9\] at $hex: file.*"
242 gdb_test "break end" "Breakpoint \[0-9\] at $hex: file.*"
243
244 gdb_test "${trace1} set_point" "\(Fast t|T\)racepoint \[0-9\] at $hex: file.*" \
245 "${trace1} set_point 1"
246 gdb_trace_setactions "set action for tracepoint 1" "" \
247 "collect \$$pcreg" "^$"
248 gdb_test "${trace2} after_set_point" \
249 "\(Fast t|T\)racepoint \[0-9\] at $hex: file.*" \
250 "${trace2} after_set_point 1"
251
252 gdb_trace_setactions "set action for tracepoint 2" "" \
253 "collect \$$spreg" "^$"
254
255 gdb_test_no_output "tstart"
256
257 gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" "continue to marker"
258
259 if [string equal $trace3_at_first_loc "1"] {
260 gdb_test "${trace3} set_point" "\(Fast t|T\)racepoint \[0-9\] at $hex: file.*" \
261 "${trace3} set_point 2"
262 } else {
263 gdb_test "${trace3} after_set_point" \
264 "\(Fast t|T\)racepoint \[0-9\] at $hex: file.*" \
265 "${trace2} after_set_point 2"
266 }
267 gdb_trace_setactions "set action for tracepoint 3" "" \
268 "collect \$$fpreg" "^$"
269
270 gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" "continue to end"
271 gdb_test_no_output "tstop"
272
273 gdb_test "tfind tracepoint 4" "Found trace frame \[0-9\], tracepoint .*" \
274 "tfind test frame of tracepoint 4"
275 gdb_test "tdump" \
276 "Data collected at tracepoint .*, trace frame \[0-9\]:.*\\$${pcreg} = .*" \
277 "tdump 1"
278 gdb_test "tfind 0" "Found trace frame 0, tracepoint .*" \
279 "reset to frame 0 (1)"
280 gdb_test "tfind tracepoint 5" "Found trace frame \[0-9\], tracepoint .*" \
281 "tfind test frame of tracepoint 5"
282 gdb_test "tdump" \
283 "Data collected at tracepoint .*, trace frame \[0-9\]:.*\\$${spreg} = .*" \
284 "tdump 2"
285 gdb_test "tfind 0" "Found trace frame 0, tracepoint .*" \
286 "reset to frame 0 (2)"
287 gdb_test "tfind tracepoint 6" "Found trace frame \[0-9\], tracepoint .*" \
288 "tfind test frame of tracepoint 6"
289 gdb_test "tdump" \
290 "Data collected at tracepoint .*, trace frame \[0-9\]:.*\\$${fpreg} = .*" \
291 "tdump 3"
292
293 set pf_prefix $old_pf_prefix
294 }
295
296 # Set two tracepoints at the same address, and enable/disable them. Verify
297 # tracepoints work as expect.
298
299 proc break_trace_same_addr_6 { trace1 enable1 trace2 enable2 } {
300 global executable
301 global pf_prefix
302 global hex
303 global gdb_prompt
304 global spreg
305 global pcreg
306
307 set old_pf_prefix $pf_prefix
308 set pf_prefix "$pf_prefix 6 $trace1 $enable1 $trace2 $enable2:"
309
310 # Start with a fresh gdb.
311 clean_restart ${executable}
312 if ![runto_main] {
313 fail "Can't run to main"
314 set pf_prefix $old_pf_prefix
315 return -1
316 }
317
318 gdb_test "break marker" "Breakpoint \[0-9\] at $hex: file.*"
319 gdb_test "break end" "Breakpoint \[0-9\] at $hex: file.*"
320
321 gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" "continue to marker"
322
323 gdb_test "${trace1} set_point" "\(Fast t|T\)racepoint \[0-9\] at $hex: file.*" \
324 "${trace1} set_point 1"
325 gdb_trace_setactions "set action for tracepoint 1" "" \
326 "collect \$$pcreg" "^$"
327 gdb_test "${trace2} set_point" "\(Fast t|T\)racepoint \[0-9\] at $hex: file.*" \
328 "${trace2} set_point 2"
329 gdb_trace_setactions "set action for tracepoint 2" "" \
330 "collect \$$spreg" "^$"
331
332 gdb_test_no_output "$enable1 4"
333 gdb_test_no_output "$enable2 5"
334
335 gdb_test_no_output "tstart"
336 gdb_test "continue" "Continuing\\.\[ \r\n\]+Breakpoint.*" "continue to end"
337 gdb_test_no_output "tstop"
338
339
340 if [string equal $enable1 "enable"] {
341 gdb_test "tfind tracepoint 4" "Found trace frame \[0-9\], tracepoint .*" \
342 "tfind test frame of tracepoint 4"
343 gdb_test "tdump" \
344 "Data collected at tracepoint .*, trace frame \[0-9\]:.*\\$${pcreg} = .*" \
345 "tdump 1"
346 gdb_test "tfind 0" "Found trace frame 0, tracepoint .*" \
347 "reset to frame 0 (1)"
348 } else {
349 gdb_test "tfind tracepoint 4" "Target failed to find requested trace frame.*" \
350 "tfind test frame of tracepoint 4"
351 }
352
353 if [string equal $enable2 "enable"] {
354 gdb_test "tfind tracepoint 5" "Found trace frame \[0-9\], tracepoint .*" \
355 "tfind test frame of tracepoint 5"
356 gdb_test "tdump" \
357 "Data collected at tracepoint .*, trace frame \[0-9\]:.*\\$${spreg} = .*" \
358 "tdump 2"
359 gdb_test "tfind 0" "Found trace frame 0, tracepoint .*" \
360 "reset to frame 0 (2)"
361 } else {
362 gdb_test "tfind tracepoint 5" "Target failed to find requested trace frame.*" \
363 "tfind test frame of tracepoint 5"
364 }
365
366 set pf_prefix $old_pf_prefix
367 }
368
369
370 foreach break_always_inserted { "on" "off" } {
371 break_trace_same_addr_1 "trace" ${break_always_inserted}
372 break_trace_same_addr_2 "trace" "trace" ${break_always_inserted}
373 break_trace_same_addr_3 "trace" ${break_always_inserted}
374 break_trace_same_addr_4 "trace" ${break_always_inserted}
375 }
376
377 foreach at_first_loc { "1" "0" } {
378 break_trace_same_addr_5 "trace" "trace" "trace" ${at_first_loc}
379 }
380
381 break_trace_same_addr_6 "trace" "enable" "trace" "disable"
382 break_trace_same_addr_6 "trace" "disable" "trace" "enable"
383
384 set libipa $objdir/../gdbserver/libinproctrace.so
385 gdb_load_shlibs $libipa
386
387 # Can't use prepare_for_testing, because that splits compiling into
388 # building objects and then linking, and we'd fail with "linker input
389 # file unused because linking not done" when building the object.
390
391 if { [gdb_compile "$srcdir/$subdir/$srcfile" $binfile \
392 executable [list debug $additional_flags shlib=$libipa] ] != "" } {
393 untested "failed to compile ftrace tests"
394 return -1
395 }
396 clean_restart ${executable}
397
398 if ![runto_main] {
399 fail "Can't run to main for ftrace tests"
400 return 0
401 }
402
403 gdb_reinitialize_dir $srcdir/$subdir
404 if { [gdb_test "info sharedlibrary" ".*libinproctrace\.so.*" "IPA loaded"] != 0 } {
405 untested "Could not find IPA lib loaded"
406 } else {
407 foreach break_always_inserted { "on" "off" } {
408 break_trace_same_addr_1 "ftrace" ${break_always_inserted}
409 break_trace_same_addr_2 "trace" "ftrace" ${break_always_inserted}
410 break_trace_same_addr_2 "ftrace" "trace" ${break_always_inserted}
411 break_trace_same_addr_2 "ftrace" "ftrace" ${break_always_inserted}
412 break_trace_same_addr_3 "ftrace" ${break_always_inserted}
413 break_trace_same_addr_4 "ftrace" ${break_always_inserted}
414 }
415
416 foreach trace1 { "trace" "ftrace" } {
417 foreach trace2 { "trace" "ftrace" } {
418 foreach trace3 { "trace" "ftrace" } {
419
420 if { [string equal $trace1 "trace"]
421 && [string equal $trace2 "trace"]
422 && [string equal $trace3 "trace"] } {
423 continue
424 }
425
426 foreach at_first_loc { "1" "0" } {
427 break_trace_same_addr_5 $trace1 $trace2 $trace3 $at_first_loc
428 }
429 }
430 }
431 }
432
433 foreach trace1 { "trace" "ftrace" } {
434 foreach trace2 { "trace" "ftrace" } {
435 if { [string equal $trace1 "trace"]
436 && [string equal $trace2 "trace"] } {
437 continue
438 }
439 break_trace_same_addr_6 $trace1 "enable" $trace2 "disable"
440 break_trace_same_addr_6 $trace1 "disable" $trace2 "enable"
441 }
442 }
443 }
This page took 0.041853 seconds and 4 git commands to generate.