2012-02-21 Pedro Alves <palves@redhat.com>
[deliverable/binutils-gdb.git] / gdb / testsuite / gdb.trace / pending.exp
1 # Copyright 2011-2012 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 if {[skip_shlib_tests]} {
18 return 0
19 }
20
21 set testfile "pending"
22 set libfile1 "pendshr1"
23 set libfile2 "pendshr2"
24 set executable $testfile
25 set srcfile $testfile.c
26 set libsrc1 $srcdir/$subdir/$libfile1.c
27 set libsrc2 $srcdir/$subdir/$libfile2.c
28 set binfile $objdir/$subdir/$testfile
29 set lib_sl1 $objdir/$subdir/$libfile1.sl
30 set lib_sl2 $objdir/$subdir/$libfile2.sl
31
32 set lib_opts [gdb_target_symbol_prefix_flags]
33
34 if { [gdb_compile_shlib $libsrc1 $lib_sl1 $lib_opts] != ""
35 || [gdb_compile_shlib $libsrc2 $lib_sl2 $lib_opts] != ""} {
36 untested "Could not compile either $libsrc1 or $libsrc2"
37 return -1
38 }
39
40 set exec_opts [list debug shlib=$lib_sl1 shlib_load]
41 if { [gdb_compile $srcdir/$subdir/$srcfile $binfile executable $exec_opts] != "" } {
42 untested "Failed to compile $srcfile"
43 return -1
44 }
45
46 clean_restart $executable
47
48 gdb_load_shlibs $lib_sl1
49 gdb_load_shlibs $lib_sl2
50
51 if ![runto_main] {
52 fail "Can't run to main to check for trace support"
53 return -1
54 }
55
56 if ![gdb_target_supports_trace] {
57 unsupported "Current target does not support trace"
58 return -1;
59 }
60
61 # Verify pending tracepoint is resolved to running to main.
62
63 proc pending_tracepoint_resolved { trace_type } { with_test_prefix "$trace_type resolved" {
64 global srcdir
65 global subdir
66 global binfile
67 global srcfile
68 global lib_sl1
69
70 # Start with a fresh gdb.
71 gdb_exit
72 gdb_start
73 gdb_reinitialize_dir $srcdir/$subdir
74
75 gdb_test_multiple "$trace_type set_point1" "set pending tracepoint" {
76 -re ".*Make \(fast |\)tracepoint pending.*y or \\\[n\\\]. $" {
77 gdb_test "y" "\(Fast t|T\)racepoint.*set_point1.*pending." \
78 "set pending tracepoint (without symbols)"
79 }
80 }
81
82 gdb_test "info trace" \
83 "Num Type\[ \]+Disp Enb Address\[ \]+What.*
84 \[0-9\]+\[\t \]+\(fast |\)tracepoint\[ \]+keep y.*PENDING.*set_point1.*" \
85 "single pending tracepoint info (without symbols)"
86
87 gdb_load ${binfile}
88
89 gdb_test "break main" "Breakpoint.*at.* file .*$srcfile, line.*" \
90 "breakpoint function"
91
92 gdb_run_cmd
93 gdb_test "" "Breakpoint 2, main.*"
94
95 # Run to main which should resolve a pending tracepoint
96 gdb_test "info trace" \
97 "Num Type\[ \]+Disp Enb Address\[ \]+What.*
98 \[0-9\]+\[\t \]+\(fast |\)tracepoint\[ \]+keep y.*pendfunc.*" \
99 "single tracepoint info"
100 }}
101
102 # Verify pending tracepoint is resolved and works as expected.
103
104 proc pending_tracepoint_works { trace_type } { with_test_prefix "$trace_type works" {
105 global executable
106 global srcfile
107 global lib_sl1
108 global gdb_prompt
109
110 # Restart with a fresh gdb.
111 clean_restart $executable
112
113 # Test setting and querying pending tracepoints
114
115 gdb_test_multiple "$trace_type set_point1" "set pending tracepoint" {
116 -re ".*Make \(fast |\)tracepoint pending.*y or \\\[n\\\]. $" {
117 gdb_test "y" "\(Fast t|T\)racepoint.*set_point1.*pending." "set pending tracepoint"
118 }
119 }
120
121 gdb_test "info trace" \
122 "Num Type\[ \]+Disp Enb Address\[ \]+What.*
123 \[0-9\]+\[\t \]+\(fast |\)tracepoint\[ \]+keep y.*PENDING.*set_point1.*" \
124 "single pending tracepoint info"
125
126 # Run to main which should resolve a pending tracepoint
127 gdb_test "break main" "Breakpoint.*at.* file .*$srcfile, line.*" \
128 "breakpoint function"
129 gdb_run_cmd
130 gdb_test "" "Breakpoint 2, main.*"
131
132 gdb_test "break marker" "Breakpoint.*at.* file .*$srcfile, line.*" \
133 "breakpoint on marker"
134
135 gdb_test_no_output "tstart" "start trace experiment"
136
137 gdb_test_multiple "continue" "continue to marker" {
138 -re "Continuing.\r\n\r\nBreakpoint.*marker.*at.*$srcfile.*$gdb_prompt $" {
139 pass "continue to marker"
140 }
141 -re ".*$gdb_prompt $" {
142 kfail "gdb/13392" "continue to marker"
143 return
144 }
145 }
146
147 gdb_test "tstop" "\[\r\n\]+" "stop trace experiment"
148
149 gdb_test "tfind start" "#0 .*" "tfind test frame 0"
150 gdb_test "tfind" "Found trace frame 1, tracepoint 1.*" "tfind test frame 1"
151 gdb_test "tfind" "Found trace frame 2, tracepoint 1.*" "tfind test frame 2"
152 gdb_test "tfind" "Target failed to find requested trace frame..*" "tfind test frame"
153 }}
154
155 # Verify pending tracepoint is resolved during trace.
156
157 proc pending_tracepoint_resolved_during_trace { trace_type } \
158 { with_test_prefix "$trace_type resolved_in_trace" \
159 {
160 global executable
161 global srcfile
162 global gdb_prompt
163 global lib_sl1
164
165 # Start with a fresh gdb.
166 clean_restart $executable
167 if ![runto_main] {
168 fail "Can't run to main"
169 return -1
170 }
171
172 gdb_test_multiple "$trace_type set_point2" "set pending tracepoint on set_point2" {
173 -re ".*Make \(fast |\)tracepoint pending.*y or \\\[n\\\]. $" {
174 gdb_test "y" "\(Fast t|T\)racepoint.*set_point2.*pending." \
175 "set pending tracepoint (without symbols)"
176 }
177 }
178
179 gdb_test "info trace" \
180 "Num Type\[ \]+Disp Enb Address\[ \]+What.*
181 \[0-9\]+\[\t \]+\(fast |\)tracepoint\[ \]+keep y.*PENDING.*set_point2.*" \
182 "single pending tracepoint on set_point2"
183
184 gdb_test "break marker" "Breakpoint.*at.* file .*$srcfile, line.*" \
185 "breakpoint on marker"
186
187 gdb_test_no_output "tstart" "start trace experiment"
188
189 gdb_test "continue" "Continuing.\r\n\r\nBreakpoint.*marker.*at.*pending.c.*" \
190 "continue to marker 1"
191
192 gdb_test_multiple "continue" "continue to marker 2" {
193 -re "Continuing.\r\n\r\nBreakpoint.*marker.*at.*$srcfile.*$gdb_prompt $" {
194 pass "continue to marker 2"
195 }
196 -re ".*$gdb_prompt $" {
197 kfail "gdb/13392" "continue to marker 2"
198 return
199 }
200 }
201
202 gdb_test "tstop" "\[\r\n\]+" "stop trace experiment"
203
204 # tracepoint should be resolved.
205 gdb_test "info trace" \
206 "Num Type\[ \]+Disp Enb Address\[ \]+What.*
207 \[0-9\]+\[\t \]+\(fast |\)tracepoint\[ \]+keep y.*pendfunc2.*" \
208 "tracepoint is resolved"
209
210 gdb_test "tfind start" "#0 .*" "tfind test frame 0"
211 gdb_test "tfind" "Target failed to find requested trace frame..*" "tfind test frame"
212 }}
213
214 # Verify pending tracepoint is resolved and installed during trace.
215
216 proc pending_tracepoint_installed_during_trace { trace_type } \
217 { with_test_prefix "$trace_type installed_in_trace" \
218 {
219 global executable
220 global srcfile
221 global lib_sl1
222 global gdb_prompt
223 global hex
224
225 # Start with a fresh gdb.
226 clean_restart $executable
227 if ![runto_main] {
228 fail "Can't run to main"
229 return -1
230 }
231
232 gdb_test "next" ".*"
233 gdb_test "trace main" "Tracepoint \[0-9\] at .*" "set tracepoint on main"
234
235 gdb_test "break marker" "Breakpoint.*at.* file .*$srcfile, line.*" \
236 "breakpoint on marker"
237
238 gdb_test_no_output "tstart" "start trace experiment"
239
240 gdb_test "continue" "Continuing.\r\n\r\nBreakpoint.*marker.*at.*${srcfile}.*" \
241 "continue to marker 1"
242
243 # Set a pending tracepoint during a tracing experiment.
244 gdb_test_multiple "$trace_type set_point2" "set pending tracepoint on set_point2" {
245 -re ".*Make \(fast |\)tracepoint pending.*y or \\\[n\\\]. $" {
246 gdb_test "y" "\(Fast t|T\)racepoint.*set_point2.*pending." \
247 "set pending tracepoint"
248 }
249 }
250
251 gdb_test "info trace" \
252 "Num Type\[ \]+Disp Enb Address\[ \]+What.*
253 \[0-9\]+\[\t \]+\(fast |\)tracepoint\[ \t\]+keep y.*PENDING.*set_point2.*" \
254 "single pending tracepoint on set_point2"
255
256 gdb_test_multiple "continue" "continue to marker 2" {
257 -re "Continuing.\r\n\r\nBreakpoint.*marker.*at.*$srcfile.*$gdb_prompt $" {
258 pass "continue to marker 2"
259 }
260 -re ".*$gdb_prompt $" {
261 kfail "gdb/13392" "continue to marker 2"
262 return
263 }
264 }
265
266 gdb_test "tstop" "\[\r\n\]+" "stop trace experiment"
267
268 # tracepoint should be resolved.
269 gdb_test "info trace" \
270 "Num Type\[ \]+Disp Enb Address\[ \]+What.*
271 \[0-9\]+\[\t \]+\(fast |\)tracepoint\[ \]+keep y.*pendfunc2.*" \
272 "tracepoint is resolved"
273
274 gdb_test "tfind start" "#0 $hex in pendfunc2 .*" "tfind test frame 0"
275 gdb_test "tfind" "Target failed to find requested trace frame..*" "tfind test frame"
276 }}
277
278
279 # Verify pending tracepoint will no longer work if we disconnect during tracing.
280
281 proc pending_tracepoint_disconnect_during_trace { trace_type } \
282 { with_test_prefix "$trace_type disconn" \
283 {
284 global executable
285 global srcfile
286 global lib_sl1
287 global gdb_prompt
288
289 # Start with a fresh gdb.
290 clean_restart $executable
291 if ![runto_main] {
292 fail "Can't run to main"
293 return -1
294 }
295
296 gdb_test_multiple "trace pendfunc3" "set pending tracepoint on set_point2" {
297 -re ".*Make \(fast |\)tracepoint pending.*y or \\\[n\\\]. $" {
298 gdb_test "y" "\(Fast t|T\)racepoint.*pendfunc3.*pending." \
299 "set pending tracepoint on pendfun3"
300 }
301 }
302
303 gdb_test "break marker" "Breakpoint.*at.* file .*$srcfile, line.*" \
304 "breakpoint on marker"
305
306 gdb_test_no_output "tstart" "start trace experiment"
307
308 gdb_test "continue" "Continuing.\r\n\r\nBreakpoint.*marker.*at.*pending.c.*" \
309 "continue to marker"
310
311 set test "disconnect with pending tracepoint"
312 gdb_test_multiple "disconnect" $test {
313 -re "warning: Pending tracepoints will not be resolved while GDB is disconnected.*Trace is running but will stop on detach; detach anyway\\? \\(y or n\\) $" {
314 pass $test
315
316 set test "disconnected"
317 gdb_test_multiple "y" $test {
318 -re "$gdb_prompt $" {
319 pass "$test"
320 }
321 }
322 }
323 }
324 }}
325
326
327 # Verify disconnect after pending tracepoint has been resolved.
328
329 proc pending_tracepoint_disconnect_after_resolved { trace_type } \
330 { with_test_prefix "$trace_type disconn_resolved" \
331 {
332 global executable
333 global srcfile
334 global lib_sl1
335 global gdb_prompt
336
337 # Start with a fresh gdb.
338 clean_restart $executable
339 if ![runto_main] {
340 fail "Can't run to main"
341 return -1
342 }
343
344 gdb_test_multiple "trace set_point2" "set pending tracepoint on set_point2" {
345 -re ".*Make \(fast |\)tracepoint pending.*y or \\\[n\\\]. $" {
346 gdb_test "y" "\(Fast t|T\)racepoint.*set_point2.*pending." \
347 "set pending tracepoint on pendfun2"
348 }
349 }
350
351 gdb_test "break marker" "Breakpoint.*at.* file .*$srcfile, line.*" \
352 "breakpoint on marker"
353
354 gdb_test_no_output "tstart" "start trace experiment"
355
356 gdb_test "continue" "Continuing.\r\n\r\nBreakpoint.*marker.*at.*pending.c.*" \
357 "continue to marker 1"
358 gdb_test "continue" "Continuing.\r\n\r\nBreakpoint.*marker.*at.*pending.c.*" \
359 "continue to marker 2"
360
361 # There should be no pending tracepoint, so no warning should be emitted.
362 set test "disconnect with resolved tracepoint"
363 gdb_test_multiple "disconnect" $test {
364 -re "warning: Pending tracepoints will not be resolved while GDB is disconnected.*Trace is running but will stop on detach; detach anyway\\? \\(y or n\\) $" {
365 fail $test
366 }
367 -re "Trace is running but will stop on detach; detach anyway\\? \\(y or n\\) $" {
368 pass $test
369 }
370 }
371 set test "disconnected"
372 gdb_test_multiple "y" $test {
373 -re "$gdb_prompt $" {
374 pass "$test"
375 }
376 }
377 }}
378
379 # Verify action works properly in resolved tracepoint.
380
381 proc pending_tracepoint_with_action_resolved { trace_type } \
382 { with_test_prefix "$trace_type action_resolved" \
383 {
384 global executable
385 global srcfile
386 global lib_sl1
387 global gdb_prompt
388
389 # Start with a fresh gdb.
390 clean_restart $executable
391 if ![runto_main] {
392 fail "Can't run to main"
393 return -1
394 }
395
396 gdb_test_multiple "$trace_type set_point2" "set pending tracepoint on set_point2" {
397 -re ".*Make \(fast |\)tracepoint pending.*y or \\\[n\\\]. $" {
398 gdb_test "y" "\(Fast t|T\)racepoint.*set_point2.*pending." \
399 "set pending tracepoint (without symbols)"
400 }
401 }
402
403 set pcreg "pc"
404 if [is_amd64_regs_target] {
405 set pcreg "rip"
406 } elseif [is_x86_like_target] {
407 set pcreg "eip"
408 }
409
410 gdb_trace_setactions "set action for pending tracepoint" "" \
411 "collect \$$pcreg" "^$"
412
413 gdb_test "info trace" \
414 "Num Type\[ \]+Disp Enb Address\[ \]+What.*
415 \[0-9\]+\[\t \]+\(fast |\)tracepoint\[ \]+keep y.*PENDING.*set_point2.*" \
416 "single pending tracepoint on set_point2"
417
418 gdb_test "break marker" "Breakpoint.*at.* file .*$srcfile, line.*" \
419 "breakpoint on marker"
420
421 gdb_test_no_output "tstart" "start trace experiment"
422
423 gdb_test "continue" "Continuing.\r\n\r\nBreakpoint.*marker.*at.*pending.c.*" \
424 "continue to marker 1"
425
426 gdb_test_multiple "continue" "continue to marker 2" {
427 -re "Continuing.\r\n\r\nBreakpoint.*marker.*at.*$srcfile.*$gdb_prompt $" {
428 pass "continue to marker 2"
429 }
430 -re ".*$gdb_prompt $" {
431 kfail "gdb/13392" "continue to marker 2"
432 return
433 }
434 }
435
436 gdb_test "tstop" "\[\r\n\]+" "stop trace experiment"
437
438 # tracepoint should be resolved.
439 gdb_test "info trace" \
440 "Num Type\[ \]+Disp Enb Address\[ \]+What.*
441 \[0-9\]+\[\t \]+\(fast |\)tracepoint\[ \]+keep y.*pendfunc2.*" \
442 "tracepoint is resolved"
443
444 gdb_test "tfind start" "#0 .*" "tfind test frame 0"
445 gdb_test "tdump" "Data collected at tracepoint .*, trace frame \[0-9\]:.*\\$${pcreg} = .*"
446 gdb_test "tfind" "Target failed to find requested trace frame..*" "tfind test frame"
447 }}
448
449 pending_tracepoint_resolved "trace"
450
451 pending_tracepoint_works "trace"
452
453 pending_tracepoint_resolved_during_trace "trace"
454
455 pending_tracepoint_disconnect_during_trace "trace"
456
457 pending_tracepoint_disconnect_after_resolved "trace"
458
459 pending_tracepoint_with_action_resolved "trace"
460
461 pending_tracepoint_installed_during_trace "trace"
462
463 # Re-compile test case with IPA.
464 set libipa $objdir/../gdbserver/libinproctrace.so
465 gdb_load_shlibs $libipa
466
467 lappend exec_opts "shlib=$libipa"
468
469 if { [gdb_compile $srcdir/$subdir/$srcfile $binfile executable $exec_opts] != "" } {
470 untested "Failed to compile $srcfile"
471 return -1
472 }
473
474 pending_tracepoint_resolved "ftrace"
475 pending_tracepoint_works "ftrace"
476 pending_tracepoint_resolved_during_trace "ftrace"
477 pending_tracepoint_disconnect_during_trace "ftrace"
478 pending_tracepoint_disconnect_after_resolved "ftrace"
479 pending_tracepoint_with_action_resolved "ftrace"
480 pending_tracepoint_installed_during_trace "ftrace"
This page took 0.055277 seconds and 4 git commands to generate.