1 # Copyright
1988, 1990, 1991, 1992, 1994, 1995, 1997, 1998, 1999, 2000,
2 #
2001, 2002, 2003, 2005, 2006 Free Software Foundation
, Inc.
4 # This
program is free software
; you can redistribute it and
/or modify
5 # it under the terms of the GNU General Public License as published by
6 # the Free Software Foundation
; either version
2 of the License
, or
7 #
(at your option
) any later version.
9 # This
program is distributed in the hope that it will be useful
,
10 # but WITHOUT
ANY WARRANTY
; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License
for more details.
14 # You should have received a copy of the GNU General Public License
15 # along with this
program; if not
, write to the Free Software
16 # Foundation
, Inc.
, 59 Temple Place
- Suite
330, Boston
, MA
02111-1307, USA.
18 # Please email
any bugs
, comments
, and
/or additions to this file to
:
19 # bug
-gdb@prep.ai.mit.edu
26 # test special commands
(if, while, etc
)
32 set srcfile $
{testfile
}.c
33 set binfile $
{objdir
}/$
{subdir
}/commands
34 if { [gdb_compile
"${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-DFAKEARGV}] != "" } {
35 gdb_suppress_entire_file
"Testcase compile failed, so all tests in this file will automatically fail."
41 gdb_reinitialize_dir $srcdir
/$subdir
44 proc gdbvar_simple_if_test
{} {
47 gdb_test
"set \$foo = 0" "" "set foo in gdbvar_simple_if_test"
48 # All this test should
do is print
0xdeadbeef once.
49 gdb_test
"if \$foo == 1\np/x 0xfeedface\nelse\np/x 0xdeadbeef\nend" \
50 "\\\$\[0-9\]* = 0xdeadbeef" "gdbvar_simple_if_test #1"
51 # All this test should
do is print
0xfeedface once.
52 gdb_test
"if \$foo == 0\np/x 0xfeedface\nelse\np/x 0xdeadbeef\nend" \
53 "\\\$\[0-9\]* = 0xfeedface" "gdbvar_simple_if_test #2"
56 proc gdbvar_simple_while_test
{} {
59 gdb_test
"set \$foo = 5" "" "set foo in gdbvar_simple_while_test"
60 # This test should print
0xfeedface five times.
61 gdb_test
"while \$foo > 0\np/x 0xfeedface\nset \$foo -= 1\nend" \
62 "\\\$\[0-9\]* = 0xfeedface\[^\n\]*\n\\\$\[0-9\]* = 0xfeedface\[^\n\]*\n\\\$\[0-9\]* = 0xfeedface\[^\n\]*\n\\\$\[0-9\]* = 0xfeedface\[^\n\]*\n\\\$\[0-9\]* = 0xfeedface" \
63 "gdbvar_simple_while_test #1"
66 proc gdbvar_complex_if_while_test
{} {
69 gdb_test
"set \$foo = 4" "" "set foo in gdbvar complex_if_while_test"
70 # This test should alternate between
0xdeadbeef and
0xfeedface two times.
71 gdb_test
"while \$foo > 0\nset \$foo -= 1\nif \(\$foo % 2\) == 1\np/x 0xdeadbeef\nelse\np/x 0xfeedface\nend\nend" \
72 "\\\$\[0-9\]* = 0xdeadbeef\[^\n\]*\n\\\$\[0-9\]* = 0xfeedface\[^\n\]*\n\\\$\[0-9\]* = 0xdeadbeef\[^\n\]*\n\\\$\[0-9\]* = 0xfeedface" \
73 "gdbvar_complex_if_while_test #1"
76 proc progvar_simple_if_test
{} {
79 if [target_info
exists noargs
] {
80 verbose
"Skipping progvar_simple_if_test because of noargs."
84 if { ![runto factorial
] } then { gdb_suppress_tests
; }
85 # Don
't depend upon argument passing, since most simulators don't
86 # currently support it. Bash value
variable to be what we want.
87 gdb_test
"p value=5" "" "set value to 5 in progvar_simple_if_test #1"
88 # All this test should
do is print
0xdeadbeef once.
89 gdb_test
"if value == 1\np/x 0xfeedface\nelse\np/x 0xdeadbeef\nend" \
90 "\\\$\[0-9\]* = 0xdeadbeef" \
91 "progvar_simple_if_test #1"
92 # All this test should
do is print
0xfeedface once.
93 gdb_test
"if value == 5\np/x 0xfeedface\nelse\np/x 0xdeadbeef\nend" \
94 "\\\$\[0-9\]* = 0xfeedface" \
95 "progvar_simple_if_test #2"
96 gdb_stop_suppressing_tests
;
99 proc progvar_simple_while_test
{} {
102 if [target_info
exists noargs
] {
103 verbose
"Skipping progvar_simple_while_test because of noargs."
107 gdb_test
"set args 5" "" "set args in progvar_simple_while_test"
108 if { ![runto factorial
] } then { gdb_suppress_tests
}
109 # Don
't depend upon argument passing, since most simulators don't
110 # currently support it. Bash value
variable to be what we want.
111 gdb_test
"p value=5" "" "set value to 5 in progvar_simple_if_test #2"
112 # This test should print
0xfeedface five times.
113 gdb_test
"while value > 0\np/x 0xfeedface\nset value -= 1\nend" \
114 "\\\$\[0-9\]* = 0xfeedface\[^\n\]*\n\\\$\[0-9\]* = 0xfeedface\[^\n\]*\n\\\$\[0-9\]* = 0xfeedface\[^\n\]*\n\\\$\[0-9\]* = 0xfeedface\[^\n\]*\n\\\$\[0-9\]* = 0xfeedface" \
115 "progvar_simple_while_test #1"
116 gdb_stop_suppressing_tests
;
119 proc progvar_complex_if_while_test
{} {
122 if [target_info
exists noargs
] {
123 verbose
"Skipping progvar_simple_if_while_test because of noargs."
127 gdb_test
"set args 4" "" "set args in progvar_complex_if_while_test"
128 if { ![runto factorial
] } then { gdb_suppress_tests
}
129 # Don
't depend upon argument passing, since most simulators don't
130 # currently support it. Bash value
variable to be what we want.
131 gdb_test
"p value=4" "" "set value to 4 in progvar_simple_if_test"
132 # This test should alternate between
0xdeadbeef and
0xfeedface two times.
133 gdb_test
"while value > 0\nset value -= 1\nif \(value % 2\) == 1\np/x 0xdeadbeef\nelse\np/x 0xfeedface\nend\nend" \
134 "\\\$\[0-9\]* = 0xdeadbeef\[^\n\]*\n\\\$\[0-9\]* = 0xfeedface\[^\n\]*\n\\\$\[0-9\]* = 0xdeadbeef\[^\n\]*\n\\\$\[0-9\]* = 0xfeedface" \
135 "progvar_complex_if_while_test #1"
136 gdb_stop_suppressing_tests
;
139 proc if_while_breakpoint_command_test
{} {
140 if [target_info
exists noargs
] {
141 verbose
"Skipping if_while_breakpoint_command_test because of noargs."
145 gdb_test
"set args 5" "" "set args in if_while_breakpoint_command_test"
146 if { ![runto factorial
] } then { gdb_suppress_tests
}
147 # Don
't depend upon argument passing, since most simulators don't
148 # currently support it. Bash value
variable to be what we want.
149 gdb_test
"p value=5" "" "set value to 5 in progvar_simple_if_test"
151 gdb_test
"break factorial" "Breakpoint.*at.*" "break factorial #1"
153 send_gdb
"commands\n"
156 pass
"commands in if_while_breakpoint_command_test"
159 fail
"(timeout or eof) commands in if_while_breakpoint_command_test"
162 # This test should alternate between
0xdeadbeef and
0xfeedface two times.
163 gdb_test
"while value > 0\nset value -= 1\nif \(value % 2\) == 1\np/x 0xdeadbeef\nelse\np/x 0xfeedface\nend\nend\nend" \
165 "commands part 2 in if_while_breakpoint_command_test"
166 gdb_test
"continue" \
167 "\\\$\[0-9\]* = 0xdeadbeef\[^\n\]*\n\\\$\[0-9\]* = 0xfeedface\[^\n\]*\n\\\$\[0-9\]* = 0xdeadbeef\[^\n\]*\n\\\$\[0-9\]* = 0xfeedface" \
168 "if_while_breakpoint_command_test #1"
169 gdb_test
"info break" \
170 "while.*set.*if.*p/x.*else.*p/x.*end.*" \
171 "info break in if_while_breakpoint_command_test"
172 gdb_stop_suppressing_tests
;
175 # Test that we can run the inferior from breakpoint commands.
177 # The expected behavior is that all commands after the first
"step"
178 # shall be ignored. See the gdb manual
, "Break Commands",
179 # subsection
"Breakpoint command lists".
181 proc infrun_breakpoint_command_test
{} {
182 if [target_info
exists noargs
] {
183 verbose
"Skipping infrun_breakpoint_command_test because of noargs."
187 gdb_test
"set args 6" "" "set args in infrun_breakpoint_command_test"
188 if { ![runto factorial
] } then { gdb_suppress_tests
}
189 # Don
't depend upon argument passing, since most simulators don't
190 # currently support it. Bash value
variable to be what we want.
191 gdb_test
"p value=6" "" "set value to 6 in progvar_simple_if_test #1"
193 gdb_test
"break factorial if value == 5" "Breakpoint.*at.*"
195 # infrun_breakpoint_command_test
- This test was broken into two parts
196 # to
get around a synchronization problem in expect.
197 # part1
: issue the gdb command
"commands"
198 # part2
: send the list of commands
199 send_gdb
"commands\n"
202 pass
"commands in infrun_breakpoint_command_test #1"
205 fail
"(timeout or eof) commands in infrun_breakpoint_command_test"
208 gdb_test
"step\nstep\nstep\nstep\nend" "" \
209 "commands in infrun_breakpoint_command_test #2"
211 gdb_test
"continue" \
212 "Continuing.*.*.*Breakpoint \[0-9\]*, factorial \\(value=5\\).*at.*\[0-9\]*\[ \]*if \\(value > 1\\) \{.*\[0-9\]*\[ \]*value \\*= factorial \\(value - 1\\);.*" \
213 "continue in infrun_breakpoint_command_test"
215 gdb_stop_suppressing_tests
;
218 proc breakpoint_command_test
{} {
219 if [target_info
exists noargs
] {
220 verbose
"Skipping breakpoint_command_test because of noargs."
224 gdb_test
"set args 6" "" "set args in breakpoint_command_test"
225 if { ![runto factorial
] } then { gdb_suppress_tests
; }
226 # Don
't depend upon argument passing, since most simulators don't
227 # currently support it. Bash value
variable to be what we want.
228 gdb_test
"p value=6" "" "set value to 6 in progvar_simple_if_test #2"
230 gdb_test
"break factorial" "Breakpoint.*at.*" "break factorial #2"
231 gdb_test
"commands\nprintf \"Now the value is %d\\n\", value\nend" \
232 "End with.*" "commands in breakpoint_command_test"
233 gdb_test
"continue" \
234 "Breakpoint \[0-9\]*, factorial.*Now the value is 5" \
235 "continue in breakpoint_command_test"
236 gdb_test
"print value" " = 5" "print value in breakpoint_command_test"
237 gdb_stop_suppressing_tests
;
240 # Test a simple user defined command
(with arguments
)
241 proc user_defined_command_test
{} {
244 gdb_test
"set \$foo = 4" "" "set foo in user_defined_command_test"
246 send_gdb
"define mycommand\n"
249 pass
"define mycommand in user_defined_command_test"
252 fail
"(timeout or eof) define mycommand in user_defined_command_test"
255 # This test should alternate between
0xdeadbeef and
0xfeedface two times.
256 gdb_test
"while \$arg0 > 0\nset \$arg0 -= 1\nif \(\$arg0 % 2\) == 1\np/x 0xdeadbeef\nelse\np/x 0xfeedface\nend\nend\nend" \
258 "enter commands in user_defined_command_test"
260 gdb_test
"mycommand \$foo" \
261 "\\\$\[0-9\]* = 0xdeadbeef\[^\n\]*\n\\\$\[0-9\]* = 0xfeedface\[^\n\]*\n\\\$\[0-9\]* = 0xdeadbeef\[^\n\]*\n\\\$\[0-9\]* = 0xfeedface" \
262 "execute user defined command in user_defined_command_test"
263 gdb_test
"show user mycommand" \
264 " while \\\$arg0.*set.* if \\\(\\\$arg0.*p/x.* else\[^\n\].*p/x.* end\[^\n\].* end\[^\n\].*" \
265 "display user command in user_defined_command_test"
268 proc watchpoint_command_test
{} {
272 if [target_info
exists noargs
] {
273 verbose
"Skipping watchpoint_command_test because of noargs."
277 gdb_test
"set args 6" "" "set args in watchpoint_command_test"
278 if { ![runto factorial
] } then { return }
281 # Verify that we can create a watchpoint
, and give it a commands
282 # list that continues the inferior. We
set the watchpoint
on a
283 # local
variable, too
, so that it self
-deletes when the watched
284 # data goes out of scope.
286 # What should happen is
: Each time the watchpoint triggers
, it
287 # continues the inferior. Eventually
, the watchpoint will self
-
288 #
delete, when the watched
variable is out of scope. But by that
289 # time
, the inferior should have exited. GDB shouldn
't crash or
290 # anything untoward as a result of this.
294 send_gdb "watch local_var\n"
296 -re ".*\[Ww\]atchpoint (\[0-9\]*): local_var.*$gdb_prompt $" {
297 set wp_id $expect_out(1,string)
298 pass "watch local_var"
301 {fail "watch local_var"}
302 timeout {fail "(timeout) watch local_var"}
305 if {$wp_id == -1} {return}
307 send_gdb "commands $wp_id\n"
309 -re "Type commands for when breakpoint $wp_id is hit, one per line.*>" {
310 pass "begin commands on watch"
312 -re "$gdb_prompt $" {fail "begin commands on watch"}
313 timeout {fail "(timeout) begin commands on watch"}
315 send_gdb "print value\n"
317 -re ">" {pass "add print command to watch"}
318 -re "$gdb_prompt $" {fail "add print command to watch"}
319 timeout {fail "(timeout) add print command to watch"}
321 send_gdb "continue\n"
323 -re ">" {pass "add continue command to watch"}
324 -re "$gdb_prompt $" {fail "add continue command to watch"}
325 timeout {fail "(timeout) add continue command to watch"}
329 -re "$gdb_prompt $" {pass "end commands on watch"}
330 timeout {fail "(timeout) end commands on watch"}
332 send_gdb "continue\n"
334 -re "Continuing.*\[Ww\]atchpoint $wp_id deleted because the program has left the block in.*which its expression is valid.*run.c:(57|82).*$gdb_prompt $" {
335 pass "continue with watch"
337 -re "$gdb_prompt $" {fail "continue with watch"}
338 timeout {fail "(timeout) continue with watch"}
342 proc test_command_prompt_position {} {
345 if [target_info exists noargs] {
346 verbose "Skipping test_command_prompt_position because of noargs."
350 if { ![runto factorial] } then { gdb_suppress_tests; }
351 # Don't depend upon
argument passing
, since most simulators don
't
352 # currently support it. Bash value variable to be what we want.
354 gdb_test "break factorial" "Breakpoint.*at.*" "break factorial #3"
355 gdb_test "p value=5" "" "set value to 5 in test_command_prompt_position"
356 # All this test should do is print 0xdeadbeef once.
357 gdb_test "if value == 1\np/x 0xfeedface\nelse\np/x 0xdeadbeef\nend" \
358 "\\\$\[0-9\]* = 0xdeadbeef" \
359 "if test in test_command_prompt_position"
361 # Now let's test
for the correct position of the
'>' in gdb
's
362 # prompt for commands. It should be at the beginning of the line,
363 # and not after one space.
365 send_gdb "commands\n"
367 -re "Type commands.*End with.*\[\r\n\]>$" {
368 send_gdb "printf \"Now the value is %d\\n\", value\n"
370 -re "^printf.*value\r\n>$" {
373 -re "^end\r\n$gdb_prompt $" {
374 pass "> OK in test_command_prompt_position"
376 -re ".*$gdb_prompt $" {
377 fail "some other message in test_command_prompt_position"
380 fail "(timeout) 1 in test_command_prompt_position"
384 -re "^ >$" { fail "> not OK in test_command_prompt_position" }
385 -re ".*$gdb_prompt $" {
386 fail "wrong message in test_command_prompt_position"
389 fail "(timeout) 2 in test_command_prompt_position "
393 -re "Type commands.*End with.*\[\r\n\] >$" {
394 fail "prompt not OK in test_command_prompt_position"
396 -re ".*$gdb_prompt $" {
397 fail "commands in test_command_prompt_position"
399 timeout { fail "(timeout) 3 commands in test_command_prompt_position" }
402 gdb_stop_suppressing_tests;
407 proc deprecated_command_test {} {
408 gdb_test "maintenance deprecate blah" "Can't find command.
*" \
409 "tried to deprecate non-existing command"
411 gdb_test
"maintenance deprecate p \"new_p\"" "" "maintenance deprecate p \"new_p\" /1/"
413 "Warning: 'p', an alias for the command 'print' is deprecated.*Use 'new_p'.*" \
414 "p deprecated warning, with replacement"
415 gdb_test
"p 5" ".\[0-9\]* = 5.*" "Deprecated warning goes away /1/"
417 gdb_test
"maintenance deprecate p \"new_p\"" "" "maintenance deprecate p \"new_p\" /2/"
418 gdb_test
"maintenance deprecate print \"new_print\"" ""
420 "Warning: command 'print' \\(p\\) is deprecated.*Use 'new_print'.*" \
421 "both alias and command are deprecated"
422 gdb_test
"p 5" ".\[0-9\]* = 5.*" "Deprecated warning goes away /2/"
424 gdb_test
"maintenance deprecate set remote memory-read-packet-size \"srm\" " \
426 "deprecate long command /1/"
427 gdb_test
"set remote memory-read-packet-size" \
428 "Warning: command 'set remote memory-read-packet-size' is deprecated.*Use 'srm'.*" \
429 "long command deprecated /1/"
431 gdb_test
"maintenance deprecate set remote memory-read-packet-size" \
433 "deprecate long command /2/"
434 gdb_test
"set remote memory-read-packet-size" \
435 "Warning: command 'set remote memory-read-packet-size' is deprecated.*No alternative known.*" \
436 "long command deprecated with no alternative /2/"
438 gdb_test
"maintenance deprecate" \
439 "\"maintenance deprecate\".*" \
440 "deprecate with no arguments"
443 proc bp_deleted_in_command_test
{} {
446 if [target_info
exists noargs
] {
447 verbose
"Skipping bp_deleted_in_command_test because of noargs."
451 gdb_test
"set args 1" "" "set args in bp_deleted_in_command_test"
454 # Create a breakpoint
, and associate a command
-list to it
, with
455 # one command that deletes this breakpoint.
456 gdb_test
"break factorial" \
457 "Breakpoint \[0-9\]+ at .*: file .*/run.c, line \[0-9\]+\." \
458 "breakpoint in bp_deleted_in_command_test"
460 send_gdb
"commands\n"
462 -re
"Type commands for when breakpoint .* is hit, one per line.*>" {
463 pass
"begin commands in bp_deleted_in_command_test"
465 -re
"$gdb_prompt $" {fail "begin commands in bp_deleted_in_command_test"}
466 timeout
{fail
"(timeout) begin commands bp_deleted_in_command_test"}
470 -re
">" {pass "add silent command"}
471 -re
"$gdb_prompt $" {fail "add silent command"}
472 timeout
{fail
"(timeout) add silent command"}
474 send_gdb
"clear factorial\n"
476 -re
">" {pass "add clear command"}
477 -re
"$gdb_prompt $" {fail "add clear command"}
478 timeout
{fail
"(timeout) add clear command"} }
479 send_gdb
"printf \"factorial command-list executed\\n\"\n"
481 -re
">" {pass "add printf command"}
482 -re
"$gdb_prompt $" {fail "add printf command"}
483 timeout
{fail
"(timeout) add printf command"}
487 -re
">" {pass "add cont command"}
488 -re
"$gdb_prompt $" {fail "add cont command"}
489 timeout
{fail
"(timeout) add cont command"} }
492 -re
"$gdb_prompt $" {pass "end commands"}
493 timeout
{fail
"(timeout) end commands"}
498 -re
".*factorial command-list executed.*1.*$gdb_prompt $" {
499 pass
"run factorial until breakpoint"
501 -re
".*$gdb_prompt $" {
502 fail
"run factorial until breakpoint"
504 default
{ fail
"(timeout) run factorial until breakpoint" }
505 timeout
{ fail
"(timeout) run factorial until breakpoint" }
509 proc temporary_breakpoint_commands
{} {
512 if [target_info
exists noargs
] {
513 verbose
"Skipping temporary_breakpoint_commands because of noargs."
517 gdb_test
"set args 1" "" "set args in temporary_breakpoint_commands"
520 # Create a temporary breakpoint
, and associate a commands list to it.
521 # This test will verify that this commands list is executed when the
523 gdb_test
"tbreak factorial" \
524 "Breakpoint \[0-9\]+ at .*: file .*/run.c, line \[0-9\]+\." \
525 "breakpoint in temporary_breakpoint_commands"
527 send_gdb
"commands\n"
529 -re
"Type commands for when breakpoint .* is hit, one per line.*>" {
530 pass
"begin commands in bp_deleted_in_command_test"
532 -re
"$gdb_prompt $" {fail "begin commands in bp_deleted_in_command_test"}
533 timeout
{fail
"(timeout) begin commands bp_deleted_in_command_test"}
537 -re
">" {pass "add silent tbreak command"}
538 -re
"$gdb_prompt $" {fail "add silent tbreak command"}
539 timeout
{fail
"(timeout) add silent tbreak command"}
541 send_gdb
"printf \"factorial tbreak commands executed\\n\"\n"
543 -re
">" {pass "add printf tbreak command"}
544 -re
"$gdb_prompt $" {fail "add printf tbreak command"}
545 timeout
{fail
"(timeout) add printf tbreak command"}
549 -re
">" {pass "add cont tbreak command"}
550 -re
"$gdb_prompt $" {fail "add cont tbreak command"}
551 timeout
{fail
"(timeout) add cont tbreak command"} }
554 -re
"$gdb_prompt $" {pass "end tbreak commands"}
555 timeout
{fail
"(timeout) end tbreak commands"}
560 -re
".*factorial tbreak commands executed.*1.*$gdb_prompt $" {
561 pass
"run factorial until temporary breakpoint"
563 timeout
{ fail
"(timeout) run factorial until temporary breakpoint" }
567 # Test that GDB can handle $arg0 outside of user functions without
569 proc stray_arg0_test
{ } {
570 gdb_test
"print \$arg0" \
571 "\\\$\[0-9\]* = void" \
574 gdb_test
"if 1 == 1\nprint \$arg0\nend" \
575 "\\\$\[0-9\]* = void" \
578 gdb_test
"print \$arg0 = 1" \
582 gdb_test
"print \$arg0" \
587 # Test that GDB can handle arguments when sourcing files recursively.
588 #
If the arguments are overwritten with #######
then the test has failed.
589 proc recursive_source_test
{} {
590 set fd
[open
"file1" w]
596 set fd
[open
"file2" w]
599 echo
1: <<<$arg0
>>>\n
601 echo
2: <<<$arg0
>>>\n
605 set fd
[open
"file3" w]
608 #################################################################
"
611 gdb_test
"source file1" \
612 "1: <<<qwerty>>>\[\r\n]+in file3\[\r\n]+2: <<<qwerty>>>" \
613 "recursive source test"
620 gdbvar_simple_if_test
621 gdbvar_simple_while_test
622 gdbvar_complex_if_while_test
623 progvar_simple_if_test
624 progvar_simple_while_test
625 progvar_complex_if_while_test
626 if_while_breakpoint_command_test
627 infrun_breakpoint_command_test
628 breakpoint_command_test
629 user_defined_command_test
630 watchpoint_command_test
631 test_command_prompt_position
632 deprecated_command_test
633 bp_deleted_in_command_test
634 temporary_breakpoint_commands
636 recursive_source_test