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.
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.
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/>.
15 load_lib "trace-support.exp";
17 if {[skip_shlib_tests]} {
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
32 set lib_opts [gdb_target_symbol_prefix_flags]
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"
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"
46 clean_restart $executable
48 gdb_load_shlibs $lib_sl1
49 gdb_load_shlibs $lib_sl2
52 fail "Can't run to main to check for trace support"
56 if ![gdb_target_supports_trace] {
57 unsupported "Current target does not support trace"
61 # Verify pending tracepoint is resolved to running to main.
63 proc pending_tracepoint_resolved { trace_type } { with_test_prefix "$trace_type resolved" {
70 # Start with a fresh gdb.
73 gdb_reinitialize_dir $srcdir/$subdir
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)"
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)"
89 gdb_test "break main" "Breakpoint.*at.* file .*$srcfile, line.*" \
93 gdb_test "" "Breakpoint 2, main.*"
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"
102 # Verify pending tracepoint is resolved and works as expected.
104 proc pending_tracepoint_works { trace_type } { with_test_prefix "$trace_type works" {
110 # Restart with a fresh gdb.
111 clean_restart $executable
113 # Test setting and querying pending tracepoints
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"
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"
126 # Run to main which should resolve a pending tracepoint
127 gdb_test "break main" "Breakpoint.*at.* file .*$srcfile, line.*" \
128 "breakpoint function"
130 gdb_test "" "Breakpoint 2, main.*"
132 gdb_test "break marker" "Breakpoint.*at.* file .*$srcfile, line.*" \
133 "breakpoint on marker"
135 gdb_test_no_output "tstart" "start trace experiment"
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"
141 -re ".*$gdb_prompt $" {
142 kfail "gdb/13392" "continue to marker"
147 gdb_test "tstop" "\[\r\n\]+" "stop trace experiment"
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"
155 # Verify pending tracepoint is resolved during trace.
157 proc pending_tracepoint_resolved_during_trace { trace_type } \
158 { with_test_prefix "$trace_type resolved_in_trace" \
165 # Start with a fresh gdb.
166 clean_restart $executable
168 fail "Can't run to main"
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)"
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"
184 gdb_test "break marker" "Breakpoint.*at.* file .*$srcfile, line.*" \
185 "breakpoint on marker"
187 gdb_test_no_output "tstart" "start trace experiment"
189 gdb_test "continue" "Continuing.\r\n\r\nBreakpoint.*marker.*at.*pending.c.*" \
190 "continue to marker 1"
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"
196 -re ".*$gdb_prompt $" {
197 kfail "gdb/13392" "continue to marker 2"
202 gdb_test "tstop" "\[\r\n\]+" "stop trace experiment"
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"
210 gdb_test "tfind start" "#0 .*" "tfind test frame 0"
211 gdb_test "tfind" "Target failed to find requested trace frame..*" "tfind test frame"
214 # Verify pending tracepoint is resolved and installed during trace.
216 proc pending_tracepoint_installed_during_trace { trace_type } \
217 { with_test_prefix "$trace_type installed_in_trace" \
225 # Start with a fresh gdb.
226 clean_restart $executable
228 fail "Can't run to main"
233 gdb_test "trace main" "Tracepoint \[0-9\] at .*" "set tracepoint on main"
235 gdb_test "break marker" "Breakpoint.*at.* file .*$srcfile, line.*" \
236 "breakpoint on marker"
238 gdb_test_no_output "tstart" "start trace experiment"
240 gdb_test "continue" "Continuing.\r\n\r\nBreakpoint.*marker.*at.*${srcfile}.*" \
241 "continue to marker 1"
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"
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"
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"
260 -re ".*$gdb_prompt $" {
261 kfail "gdb/13392" "continue to marker 2"
266 gdb_test "tstop" "\[\r\n\]+" "stop trace experiment"
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"
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"
279 # Verify pending tracepoint will no longer work if we disconnect during tracing.
281 proc pending_tracepoint_disconnect_during_trace { trace_type } \
282 { with_test_prefix "$trace_type disconn" \
289 # Start with a fresh gdb.
290 clean_restart $executable
292 fail "Can't run to main"
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"
303 gdb_test "break marker" "Breakpoint.*at.* file .*$srcfile, line.*" \
304 "breakpoint on marker"
306 gdb_test_no_output "tstart" "start trace experiment"
308 gdb_test "continue" "Continuing.\r\n\r\nBreakpoint.*marker.*at.*pending.c.*" \
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\\) $" {
316 set test "disconnected"
317 gdb_test_multiple "y" $test {
318 -re "$gdb_prompt $" {
327 # Verify disconnect after pending tracepoint has been resolved.
329 proc pending_tracepoint_disconnect_after_resolved { trace_type } \
330 { with_test_prefix "$trace_type disconn_resolved" \
337 # Start with a fresh gdb.
338 clean_restart $executable
340 fail "Can't run to main"
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"
351 gdb_test "break marker" "Breakpoint.*at.* file .*$srcfile, line.*" \
352 "breakpoint on marker"
354 gdb_test_no_output "tstart" "start trace experiment"
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"
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\\) $" {
367 -re "Trace is running but will stop on detach; detach anyway\\? \\(y or n\\) $" {
371 set test "disconnected"
372 gdb_test_multiple "y" $test {
373 -re "$gdb_prompt $" {
379 # Verify action works properly in resolved tracepoint.
381 proc pending_tracepoint_with_action_resolved { trace_type } \
382 { with_test_prefix "$trace_type action_resolved" \
389 # Start with a fresh gdb.
390 clean_restart $executable
392 fail "Can't run to main"
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)"
404 if [is_amd64_regs_target] {
406 } elseif [is_x86_like_target] {
410 gdb_trace_setactions "set action for pending tracepoint" "" \
411 "collect \$$pcreg" "^$"
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"
418 gdb_test "break marker" "Breakpoint.*at.* file .*$srcfile, line.*" \
419 "breakpoint on marker"
421 gdb_test_no_output "tstart" "start trace experiment"
423 gdb_test "continue" "Continuing.\r\n\r\nBreakpoint.*marker.*at.*pending.c.*" \
424 "continue to marker 1"
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"
430 -re ".*$gdb_prompt $" {
431 kfail "gdb/13392" "continue to marker 2"
436 gdb_test "tstop" "\[\r\n\]+" "stop trace experiment"
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"
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"
449 pending_tracepoint_resolved "trace"
451 pending_tracepoint_works "trace"
453 pending_tracepoint_resolved_during_trace "trace"
455 pending_tracepoint_disconnect_during_trace "trace"
457 pending_tracepoint_disconnect_after_resolved "trace"
459 pending_tracepoint_with_action_resolved "trace"
461 pending_tracepoint_installed_during_trace "trace"
463 # Re-compile test case with IPA.
464 set libipa $objdir/../gdbserver/libinproctrace.so
465 gdb_load_shlibs $libipa
467 lappend exec_opts "shlib=$libipa"
469 if { [gdb_compile $srcdir/$subdir/$srcfile $binfile executable $exec_opts] != "" } {
470 untested "Failed to compile $srcfile"
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"