acbdb7f355
Nowadays, if we do in-tree build and run tests sequentially, some source files are removed, due to the following pattern: set pi_txt [gdb_remote_download host ${srcdir}/${subdir}/pi.txt] remote_exec host "rm -f $pi_txt" If testing is run sequentially, file ${srcdir}/${subdir}/pi.txt is copied to ${objdir}/${subdir}/pi.txt. However, ${objdir} is ${srcdir} in the in-tree build/test, so the file is coped to itself, as a nop. As a result, the file in source is removed at the end of test. This patch fixes this problem by not removing files copied to host in each test. This patch also addresses the question we've had that why don't we keep files copied to host because they are needed to reproduce certain fails. gdb/testsuite: 2014-10-20 Yao Qi <yao@codesourcery.com> * gdb.base/checkpoint.exp: Don't remove file copied on host. * gdb.base/step-line.exp: Likewise. * gdb.dwarf2/dw2-anonymous-func.exp: Likewise. * gdb.dwarf2/dw2-basic.exp: Likewise. * gdb.dwarf2/dw2-compressed.exp: Likewise. * gdb.dwarf2/dw2-filename.exp: Likewise. * gdb.dwarf2/dw2-intercu.exp: Likewise. * gdb.dwarf2/dw2-intermix.exp: Likewise. * gdb.dwarf2/dw2-producer.exp: Likewise. * gdb.dwarf2/mac-fileno.exp: Likewise. * gdb.python/py-frame-args.exp: Likewise. * gdb.python/py-framefilter.exp: Likewise. * gdb.python/py-mi.exp: Likewise. * gdb.python/py-objfile-script.exp: Likewise * gdb.python/py-pp-integral.exp: Likewise. * gdb.python/py-pp-re-notag.exp: Likewise. * gdb.python/py-prettyprint.exp: Likewise. * gdb.python/py-section-script.exp: Likewise. * gdb.python/py-typeprint.exp: Likewise. * gdb.python/py-xmethods.exp: Likewise. * gdb.stabs/weird.exp: Likewise. * gdb.xml/tdesc-regs.exp: Likewise.
373 lines
12 KiB
Text
373 lines
12 KiB
Text
# Copyright 2005-2014 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 3 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, see <http://www.gnu.org/licenses/>. */
|
|
|
|
if { [is_remote target] || ![isnative] } then {
|
|
continue
|
|
}
|
|
|
|
# Until "set follow-fork-mode" and "catch fork" are implemented on
|
|
# other targets...
|
|
#
|
|
if {![istarget "*-*-linux*"]} then {
|
|
continue
|
|
}
|
|
|
|
|
|
standard_testfile .c
|
|
|
|
set pi_txt [gdb_remote_download host ${srcdir}/${subdir}/pi.txt]
|
|
if {[is_remote host]} {
|
|
set copy1_txt copy1.txt
|
|
} else {
|
|
set copy1_txt [standard_output_file copy1.txt]
|
|
}
|
|
|
|
if {[prepare_for_testing ${testfile}.exp $testfile $srcfile \
|
|
[list debug "additional_flags=-DPI_TXT=\"$pi_txt\" -DCOPY1_TXT=\"$copy1_txt\""]]} {
|
|
untested checkpoint.exp
|
|
return -1
|
|
}
|
|
|
|
global gdb_prompt
|
|
|
|
#
|
|
# This tests gdb checkpoint and restart.
|
|
#
|
|
|
|
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 2 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 3 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 4 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 5 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 6 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 7 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 8 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 9 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 10 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.*$inferior_exited_re normally.*Switching to.*" \
|
|
"Exit, dropped into next fork one"
|
|
|
|
gdb_test "continue" \
|
|
"Deleting copy.*$inferior_exited_re normally.*Switching to.*" \
|
|
"Exit, dropped into next fork two"
|
|
|
|
gdb_test "continue" \
|
|
"Deleting copy.*$inferior_exited_re normally.*Switching to.*" \
|
|
"Exit, dropped into next fork three"
|
|
|
|
gdb_test "continue" \
|
|
"Deleting copy.*$inferior_exited_re normally.*Switching to.*" \
|
|
"Exit, dropped into next fork four"
|
|
|
|
gdb_test "continue" \
|
|
"Deleting copy.*$inferior_exited_re 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 (>600)
|
|
#
|
|
|
|
gdb_exit
|
|
gdb_start
|
|
gdb_reinitialize_dir $srcdir/$subdir
|
|
gdb_load ${binfile}
|
|
|
|
runto_main
|
|
gdb_breakpoint $break1_loc
|
|
|
|
gdb_test "commands\nsilent\nif (lines % 2)\ncheckpoint\nend\n continue\nend" \
|
|
"" \
|
|
"set checkpoint breakpoint"
|
|
|
|
set prev_timeout $timeout
|
|
set timeout [expr $timeout + 120]
|
|
verbose "Timeout now $timeout sec."
|
|
|
|
gdb_breakpoint $break2_loc
|
|
gdb_test "continue" "breakpoint 2.*" "break2 with many checkpoints"
|
|
|
|
set count 0
|
|
set msg "info checkpoints with at least 600 checkpoints"
|
|
gdb_test_multiple "info checkpoints" $msg {
|
|
-re " $decimal process \[^\r\]*\r\n" {
|
|
incr count
|
|
exp_continue
|
|
}
|
|
-re "$gdb_prompt $" {
|
|
if { $count >= 600 } {
|
|
pass $msg
|
|
} else {
|
|
fail $msg
|
|
}
|
|
}
|
|
}
|
|
|
|
#
|
|
# OK, kill 'em all...
|
|
#
|
|
|
|
gdb_test "kill" "" "kill all one with many checkpoints" \
|
|
"Kill the program being debugged.*y or n. $" "y"
|
|
|
|
# Restore old timeout
|
|
set timeout $prev_timeout
|
|
verbose "Timeout now $timeout sec."
|
|
|
|
#
|
|
# Finished: cleanup
|
|
#
|