diff options
author | Michael Snyder <msnyder@vmware.com> | 2006-01-04 19:29:26 +0000 |
---|---|---|
committer | Michael Snyder <msnyder@vmware.com> | 2006-01-04 19:29:26 +0000 |
commit | 099ac3dd7cea3b37198f9b8f86c17e7bd6078f13 (patch) | |
tree | f91fb31ff0fe90d7d6d6d97640470a09759d1e66 /gdb/testsuite/gdb.base/checkpoint.exp | |
parent | f4d85314470c1e74a91349ef869931eb9ce77c05 (diff) | |
download | gdb-099ac3dd7cea3b37198f9b8f86c17e7bd6078f13.zip gdb-099ac3dd7cea3b37198f9b8f86c17e7bd6078f13.tar.gz gdb-099ac3dd7cea3b37198f9b8f86c17e7bd6078f13.tar.bz2 |
2006-01-04 Michael Snyder <msnyder@redhat.com>
* gdb.base/checkpoint.c: New file.
* gdb.base/checkpoint.exp: New file.
* gdb.base/multi-fork.c: New file.
* gdb.base/multi-fork.exp: New file.
* gdb.base/pi.txt: New file (data for checkpoint.c test).
Diffstat (limited to 'gdb/testsuite/gdb.base/checkpoint.exp')
-rw-r--r-- | gdb/testsuite/gdb.base/checkpoint.exp | 375 |
1 files changed, 375 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.base/checkpoint.exp b/gdb/testsuite/gdb.base/checkpoint.exp new file mode 100644 index 0000000..2640b04 --- /dev/null +++ b/gdb/testsuite/gdb.base/checkpoint.exp @@ -0,0 +1,375 @@ +# Copyright 2005 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +# Please email any bugs, comments, and/or additions to this file to: +# bug-gdb@prep.ai.mit.edu + +if $tracelevel then { + strace $tracelevel + } + +if { ![isnative] } then { + continue +} + +# Until "set follow-fork-mode" and "catch fork" are implemented on +# other targets... +# +if {![istarget "*-*-linux*"]} then { + continue +} + +set prms_id 0 +set bug_id 0 + +set testfile "checkpoint" +set srcfile ${testfile}.c +set binfile ${objdir}/${subdir}/${testfile} + +if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +# Start with a fresh gdb + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +global gdb_prompt + +# +# This tests gdb checkpoint and restart. +# + +remote_download host ${srcdir}/${subdir}/pi.txt pi.txt + +runto_main +set break1_loc [gdb_get_line_number "breakpoint 1"] +set break2_loc [gdb_get_line_number "breakpoint 2"] +set break3_loc [gdb_get_line_number "breakpoint 3"] +set break4_loc [gdb_get_line_number "breakpoint 4"] + +gdb_breakpoint $break1_loc +gdb_test "continue" "breakpoint 1.*" "break1 start" + +gdb_test "checkpoint" "" "" +gdb_test "continue 10" "breakpoint 1.*" "break1 two" + +gdb_test "checkpoint" "" "" +gdb_test "continue 10" "breakpoint 1.*" "break1 three" + +gdb_test "checkpoint" "" "" +gdb_test "continue 10" "breakpoint 1.*" "break1 four" + +gdb_test "checkpoint" "" "" +gdb_test "continue 10" "breakpoint 1.*" "break1 five" + +gdb_test "checkpoint" "" "" +gdb_test "continue 10" "breakpoint 1.*" "break1 six" + +gdb_test "checkpoint" "" "" +gdb_test "continue 10" "breakpoint 1.*" "break1 seven" + +gdb_test "checkpoint" "" "" +gdb_test "continue 10" "breakpoint 1.*" "break1 eight" + +gdb_test "checkpoint" "" "" +gdb_test "continue 10" "breakpoint 1.*" "break1 nine" + +gdb_test "checkpoint" "" "" +gdb_test "continue 10" "breakpoint 1.*" "break1 ten" + +gdb_test "checkpoint" "" "" + +gdb_test "info checkpoints" \ + " 10 .* 9 .* 8 .* 7 .* 6 .* 5 .* 4 .* 3 .* 2 .* 1 .*" \ + "info checkpoints one" + +delete_breakpoints +gdb_breakpoint $break2_loc +gdb_test "continue" "breakpoint 2.*" "break2 one" + +gdb_test "restart 1" "Switching to .*breakpoint 1.*" "restart 1 one" +gdb_test "print i" " = 78" "verify i 1 one" +gdb_test "step" "if .c == EOF.*" "step in 1 one" +gdb_test "print lines" " = 1.*" "verify lines 1 one" + +gdb_test "restart 2" "Switching to .*breakpoint 1.*" "restart 2 one" +gdb_test "step" "if .c == EOF.*" "step in 2 one" +gdb_test "print i + 1 == lines * 79" " = 1" "verify i 2 one" +gdb_test "print lines" " = 11.*" "verify lines 2 one" + +gdb_test "restart 3" "Switching to .*breakpoint 1.*" "restart 3 one" +gdb_test "step" "if .c == EOF.*" "step in 3 one" +gdb_test "print i + 1 == lines * 79" " = 1" "verify i 3 one" +gdb_test "print lines" " = 21.*" "verify lines 3 one" + +gdb_test "restart 4" "Switching to .*breakpoint 1.*" "restart 4 one" +gdb_test "step" "if .c == EOF.*" "step in 4 one" +gdb_test "print i + 1 == lines * 79" " = 1" "verify i 4 one" +gdb_test "print lines" " = 31.*" "verify lines 4 one" + +gdb_test "restart 5" "Switching to .*breakpoint 1.*" "restart 5 one" +gdb_test "step" "if .c == EOF.*" "step in 5 one" +gdb_test "print i + 1 == lines * 79" " = 1" "verify i 5 one" +gdb_test "print lines" " = 41.*" "verify lines 5 one" + +gdb_test "restart 6" "Switching to .*breakpoint 1.*" "restart 6 one" +gdb_test "step" "if .c == EOF.*" "step in 6 one" +gdb_test "print i + 1 == lines * 79" " = 1" "verify i 6 one" +gdb_test "print lines" " = 51.*" "verify lines 6 one" + +gdb_test "restart 7" "Switching to .*breakpoint 1.*" "restart 7 one" +gdb_test "step" "if .c == EOF.*" "step in 7 one" +gdb_test "print i + 1 == lines * 79" " = 1" "verify i 7 one" +gdb_test "print lines" " = 61.*" "verify lines 7 one" + +gdb_test "restart 8" "Switching to .*breakpoint 1.*" "restart 8 one" +gdb_test "step" "if .c == EOF.*" "step in 8 one" +gdb_test "print i + 1 == lines * 79" " = 1" "verify i 8 one" +gdb_test "print lines" " = 71.*" "verify lines 8 one" + +gdb_test "restart 9" "Switching to .*breakpoint 1.*" "restart 9 one" +gdb_test "step" "if .c == EOF.*" "step in 9 one" +gdb_test "print i + 1 == lines * 79" " = 1" "verify i 9 one" +gdb_test "print lines" " = 81.*" "verify lines 9 one" + +gdb_test "restart 10" "Switching to .*breakpoint 1.*" "restart 10 one" +gdb_test "step" "if .c == EOF.*" "step in 10 one" +gdb_test "print i + 1 == lines * 79" " = 1" "verify i 10 one" +gdb_test "print lines" " = 91.*" "verify lines 10 one" + +# +# Now let the files be closed by the original process, +# and diff them. + +gdb_test "restart 0" "Switching to .*breakpoint 2.*" "restart 0 one" +gdb_breakpoint $break3_loc +gdb_test "continue" "breakpoint 3.*" "break3 one" + +gdb_test "shell diff -s pi.txt copy1.txt" \ + "Files pi.txt and copy1.txt are identical.*" \ + "Diff input and output one" + +# +# And now run from various checkpoints, allowing +# various amounts of input and output. +# + +gdb_breakpoint $break1_loc + +gdb_test "restart 1" "Switching to .*c == EOF.*" "restart 1 two" +gdb_test "continue" "" "" +gdb_test "continue 100" "breakpoint 1.*" "breakpoint 1 1 one" +gdb_test "step" "if .c == EOF.*" "step in 1 two" +gdb_test "print lines" " = 102.*" "verify lines 1 two" + +gdb_test "restart 2" "Switching to .*c == EOF.*" "restart 2 two" +gdb_test "continue" "" "" +gdb_test "continue 100" "breakpoint 1.*" "breakpoint 1 2 one" +gdb_test "step" "if .c == EOF.*" "step in 2 two" +gdb_test "print lines" " = 112.*" "verify lines 2 two" + +gdb_test "restart 3" "Switching to .*c == EOF.*" "restart 3 two" +gdb_test "continue" "" "" +gdb_test "continue 500" "breakpoint 1.*" "breakpoint 1 3 one" +gdb_test "step" "if .c == EOF.*" "step in 3 two" +gdb_test "print lines" " = 522.*" "verify lines 3 two" + +gdb_test "restart 4" "Switching to .*c == EOF.*" "restart 4 two" +gdb_test "continue" "" "" +gdb_test "continue 500" "breakpoint 1.*" "breakpoint 1 4 one" +gdb_test "step" "if .c == EOF.*" "step in 4 two" +gdb_test "print lines" " = 532.*" "verify lines 4 two" + +gdb_test "restart 5" "Switching to .*c == EOF.*" "restart 5 two" +gdb_test "continue" "" "" +gdb_test "continue 1000" "breakpoint 1.*" "breakpoint 1 5 one" +gdb_test "step" "if .c == EOF.*" "step in 5 two" +gdb_test "print lines" " = 1042.*" "verify lines 5 two" + +gdb_test "restart 6" "Switching to .*c == EOF.*" "restart 6 two" +gdb_test "continue" "" "" +gdb_test "continue 1000" "breakpoint 1.*" "breakpoint 1 6 one" +gdb_test "step" "if .c == EOF.*" "step in 6 two" +gdb_test "print lines" " = 1052.*" "verify lines 5 two" + +gdb_test "restart 7" "Switching to .*c == EOF.*" "restart 7 two" +gdb_test "continue" "" "" +gdb_test "continue 1100" "breakpoint 1.*" "breakpoint 1 7 one" +gdb_test "step" "if .c == EOF.*" "step in 7 two" +gdb_test "print lines" " = 1162.*" "verify lines 7 two" + +gdb_test "shell diff -s pi.txt copy1.txt" \ + "Files pi.txt and copy1.txt are identical.*" \ + "Diff input and output two" + +# +# OK, now allow the original program to delete the output file, +# and verify that the checkpoints can still write to it. +# + +gdb_test "restart 0" "Switching to .*breakpoint 3.*" "restart 0 one" +gdb_breakpoint $break4_loc +gdb_test "continue" "breakpoint 4.*" "break4 one" + +gdb_test "shell diff pi.txt copy1.txt" \ + "diff: copy1.txt: No such file or directory" \ + "delete copy1" + +delete_breakpoints +gdb_breakpoint $break2_loc + +gdb_test "restart 1" "if .c == EOF.*" "restart 1 three" +gdb_test "continue" "breakpoint 2.*" "break2 1 one" +gdb_test "print ftell (out) > 100000" " = 1.*" "outfile still open 1" + +gdb_test "restart 2" "if .c == EOF.*" "restart 1 three" +gdb_test "continue" "breakpoint 2.*" "break2 2 one" +gdb_test "print ftell (out) > 100000" " = 1.*" "outfile still open 2" + +gdb_test "restart 3" "if .c == EOF.*" "restart 1 three" +gdb_test "continue" "breakpoint 2.*" "break2 3 one" +gdb_test "print ftell (out) > 100000" " = 1.*" "outfile still open 3" + +gdb_test "restart 4" "if .c == EOF.*" "restart 1 three" +gdb_test "continue" "breakpoint 2.*" "break2 4 one" +gdb_test "print ftell (out) > 100000" " = 1.*" "outfile still open 4" + +gdb_test "restart 5" "if .c == EOF.*" "restart 1 three" +gdb_test "continue" "breakpoint 2.*" "break2 5 one" +gdb_test "print ftell (out) > 100000" " = 1.*" "outfile still open 5" + +gdb_test "restart 6" "if .c == EOF.*" "restart 1 three" +gdb_test "continue" "breakpoint 2.*" "break2 6 one" +gdb_test "print ftell (out) > 100000" " = 1.*" "outfile still open 6" + +gdb_test "restart 7" "if .c == EOF.*" "restart 1 three" +gdb_test "continue" "breakpoint 2.*" "break2 7 one" +gdb_test "print ftell (out) > 100000" " = 1.*" "outfile still open 7" + +gdb_test "restart 8" "if .c == EOF.*" "restart 1 three" +gdb_test "continue" "breakpoint 2.*" "break2 8 one" +gdb_test "print ftell (out) > 100000" " = 1.*" "outfile still open 8" + +gdb_test "restart 9" "if .c == EOF.*" "restart 1 three" +gdb_test "continue" "breakpoint 2.*" "break2 9 one" +gdb_test "print ftell (out) > 100000" " = 1.*" "outfile still open 9" + +gdb_test "restart 10" "if .c == EOF.*" "restart 1 three" +gdb_test "continue" "breakpoint 2.*" "break2 10 one" +gdb_test "print ftell (out) > 100000" " = 1.*" "outfile still open 10" + +# +# Now confirm that if one fork exits, we automatically switch to another one. +# + +delete_breakpoints +gdb_test "continue" \ + "Deleting copy.*Program exited normally.*Switching to.*" \ + "Exit, dropped into next fork one" + +gdb_test "continue" \ + "Deleting copy.*Program exited normally.*Switching to.*" \ + "Exit, dropped into next fork two" + +gdb_test "continue" \ + "Deleting copy.*Program exited normally.*Switching to.*" \ + "Exit, dropped into next fork three" + +gdb_test "continue" \ + "Deleting copy.*Program exited normally.*Switching to.*" \ + "Exit, dropped into next fork four" + +gdb_test "continue" \ + "Deleting copy.*Program exited normally.*Switching to.*" \ + "Exit, dropped into next fork five" + +# +# There should be still at least five forks left +# + +gdb_test "info checkpoints" " 5 .* 4 .* 3 .* 2 .* 1 .*" \ + "info checkpoints two" + +# +# Kill should now terminate all of them. +# + +gdb_test "kill" "" "kill all one" \ + "Kill the program being debugged.*y or n. $" "y" + +# +# and confirm that all are gone +# + +gdb_test "restart 0" "Not found.*" "no more checkpoint 0" +gdb_test "restart 1" "Not found.*" "no more checkpoint 1" +gdb_test "restart 2" "Not found.*" "no more checkpoint 2" +gdb_test "restart 3" "Not found.*" "no more checkpoint 3" +gdb_test "restart 4" "Not found.*" "no more checkpoint 4" +gdb_test "restart 5" "Not found.*" "no more checkpoint 5" +gdb_test "restart 6" "Not found.*" "no more checkpoint 6" +gdb_test "restart 7" "Not found.*" "no more checkpoint 7" +gdb_test "restart 8" "Not found.*" "no more checkpoint 8" +gdb_test "restart 9" "Not found.*" "no more checkpoint 9" +gdb_test "restart 10" "Not found.*" "no more checkpoint 10" + +# +# Now let's try setting a large number of checkpoints (>1000) +# + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +runto_main +gdb_breakpoint $break1_loc + +send_gdb "commands\n" +send_gdb " silent\n" +send_gdb " if (lines % 2)\n" +send_gdb " checkpoint\n" +send_gdb " end\n" +send_gdb " continue\n" +send_gdb "end\n" + +gdb_expect { + -re ".*$gdb_prompt $" { pass "set checkpoint breakpoint" } + timeout { fail "(timeout) set checkpoint breakpoint" } +} + +gdb_breakpoint $break2_loc +gdb_test "continue" "breakpoint 2.*" "break2 with many checkpoints" + +gdb_test "info checkpoints" " 600 .* 0 .*" \ + "info checkpoints with at least 600 checkpoints" + +# +# OK, kill 'em all... +# + +gdb_test "kill" "" "kill all one" \ + "Kill the program being debugged.*y or n. $" "y" + +# +# Finished: cleanup +# + +remote_exec build "rm -f pi.txt" |