1# Copyright 2005-2020 Free Software Foundation, Inc. 2 3# This program is free software; you can redistribute it and/or modify 4# it under the terms of the GNU General Public License as published by 5# the Free Software Foundation; either version 3 of the License, or 6# (at your option) any later version. 7# 8# This program is distributed in the hope that it will be useful, 9# but WITHOUT ANY WARRANTY; without even the implied warranty of 10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11# GNU General Public License for more details. 12# 13# You should have received a copy of the GNU General Public License 14# along with this program. If not, see <http://www.gnu.org/licenses/>. */ 15 16# Until "set follow-fork-mode" and "catch fork" are implemented on 17# other targets... 18# 19if {![istarget "*-*-linux*"]} then { 20 continue 21} 22 23# Checkpoint support is currently implemented in the Linux native 24# target, so only works with "target native". 25if { [target_info gdb_protocol] != "" } { 26 continue 27} 28 29# Must name the source file explicitly, otherwise when driven by 30# checkpoints-ns.exp, we'd try compiling checkpoints-ns.c, which 31# doesn't exist. 32standard_testfile checkpoint.c 33 34set pi_txt [gdb_remote_download host ${srcdir}/${subdir}/pi.txt] 35if {[is_remote host]} { 36 set copy1_txt copy1.txt 37} else { 38 set copy1_txt [standard_output_file copy1.txt] 39} 40 41if {[prepare_for_testing "failed to prepare" $testfile $srcfile \ 42 [list debug "additional_flags=-DPI_TXT=\"$pi_txt\" -DCOPY1_TXT=\"$copy1_txt\""]]} { 43 return -1 44} 45 46global gdb_prompt 47 48# 49# This tests gdb checkpoint and restart. 50# 51 52runto_main 53set break1_loc [gdb_get_line_number "breakpoint 1"] 54set break2_loc [gdb_get_line_number "breakpoint 2"] 55set break3_loc [gdb_get_line_number "breakpoint 3"] 56set break4_loc [gdb_get_line_number "breakpoint 4"] 57 58gdb_breakpoint $break1_loc 59gdb_test "continue" "breakpoint 1.*" "break1 start" 60 61gdb_test "checkpoint" ".*" "" 62gdb_test "continue 10" "breakpoint 1.*" "break1 two" 63 64gdb_test "checkpoint" ".*" "" 65gdb_test "continue 10" "breakpoint 1.*" "break1 three" 66 67gdb_test "checkpoint" ".*" "" 68gdb_test "continue 10" "breakpoint 1.*" "break1 four" 69 70gdb_test "checkpoint" ".*" "" 71gdb_test "continue 10" "breakpoint 1.*" "break1 five" 72 73gdb_test "checkpoint" ".*" "" 74gdb_test "continue 10" "breakpoint 1.*" "break1 six" 75 76gdb_test "checkpoint" ".*" "" 77gdb_test "continue 10" "breakpoint 1.*" "break1 seven" 78 79gdb_test "checkpoint" ".*" "" 80gdb_test "continue 10" "breakpoint 1.*" "break1 eight" 81 82gdb_test "checkpoint" ".*" "" 83gdb_test "continue 10" "breakpoint 1.*" "break1 nine" 84 85gdb_test "checkpoint" ".*" "" 86gdb_test "continue 10" "breakpoint 1.*" "break1 ten" 87 88gdb_test "checkpoint" ".*" "" 89 90gdb_test "info checkpoints" \ 91 " 1 .* 2 .* 3 .* 4 .* 5 .* 6 .* 7 .* 8 .* 9 .* 10 .*" \ 92 "info checkpoints one" 93 94delete_breakpoints 95gdb_breakpoint $break2_loc 96gdb_test "continue" "breakpoint 2.*" "break2 one" 97 98gdb_test "restart 1" "Switching to .*breakpoint 1.*" "restart 1 one" 99gdb_test "print i" " = 78" "verify i 1 one" 100gdb_test "step" "if .c == EOF.*" "step in 1 one" 101gdb_test "print lines" " = 1.*" "verify lines 1 one" 102 103gdb_test "restart 2" "Switching to .*breakpoint 1.*" "restart 2 one" 104gdb_test "step" "if .c == EOF.*" "step in 2 one" 105gdb_test "print i + 1 == lines * 79" " = 1" "verify i 2 one" 106gdb_test "print lines" " = 11.*" "verify lines 2 one" 107 108gdb_test "restart 3" "Switching to .*breakpoint 1.*" "restart 3 one" 109gdb_test "step" "if .c == EOF.*" "step in 3 one" 110gdb_test "print i + 1 == lines * 79" " = 1" "verify i 3 one" 111gdb_test "print lines" " = 21.*" "verify lines 3 one" 112 113gdb_test "restart 4" "Switching to .*breakpoint 1.*" "restart 4 one" 114gdb_test "step" "if .c == EOF.*" "step in 4 one" 115gdb_test "print i + 1 == lines * 79" " = 1" "verify i 4 one" 116gdb_test "print lines" " = 31.*" "verify lines 4 one" 117 118gdb_test "restart 5" "Switching to .*breakpoint 1.*" "restart 5 one" 119gdb_test "step" "if .c == EOF.*" "step in 5 one" 120gdb_test "print i + 1 == lines * 79" " = 1" "verify i 5 one" 121gdb_test "print lines" " = 41.*" "verify lines 5 one" 122 123gdb_test "restart 6" "Switching to .*breakpoint 1.*" "restart 6 one" 124gdb_test "step" "if .c == EOF.*" "step in 6 one" 125gdb_test "print i + 1 == lines * 79" " = 1" "verify i 6 one" 126gdb_test "print lines" " = 51.*" "verify lines 6 one" 127 128gdb_test "restart 7" "Switching to .*breakpoint 1.*" "restart 7 one" 129gdb_test "step" "if .c == EOF.*" "step in 7 one" 130gdb_test "print i + 1 == lines * 79" " = 1" "verify i 7 one" 131gdb_test "print lines" " = 61.*" "verify lines 7 one" 132 133gdb_test "restart 8" "Switching to .*breakpoint 1.*" "restart 8 one" 134gdb_test "step" "if .c == EOF.*" "step in 8 one" 135gdb_test "print i + 1 == lines * 79" " = 1" "verify i 8 one" 136gdb_test "print lines" " = 71.*" "verify lines 8 one" 137 138gdb_test "restart 9" "Switching to .*breakpoint 1.*" "restart 9 one" 139gdb_test "step" "if .c == EOF.*" "step in 9 one" 140gdb_test "print i + 1 == lines * 79" " = 1" "verify i 9 one" 141gdb_test "print lines" " = 81.*" "verify lines 9 one" 142 143gdb_test "restart 10" "Switching to .*breakpoint 1.*" "restart 10 one" 144gdb_test "step" "if .c == EOF.*" "step in 10 one" 145gdb_test "print i + 1 == lines * 79" " = 1" "verify i 10 one" 146gdb_test "print lines" " = 91.*" "verify lines 10 one" 147 148# 149# Now let the files be closed by the original process, 150# and diff them. 151 152gdb_test "restart 0" "Switching to .*breakpoint 2.*" "restart 0 one" 153gdb_breakpoint $break3_loc 154gdb_test "continue" "breakpoint 3.*" "break3 one" 155 156gdb_test "shell diff -s $pi_txt $copy1_txt" \ 157 "Files .*pi.txt and .*copy1.txt are identical.*" \ 158 "diff input and output one" 159 160# 161# And now run from various checkpoints, allowing 162# various amounts of input and output. 163# 164 165gdb_breakpoint $break1_loc 166 167gdb_test "restart 1" "Switching to .*c == EOF.*" "restart 1 two" 168gdb_test "continue" ".*" "" 169gdb_test "continue 100" "breakpoint 1.*" "breakpoint 1 1 one" 170gdb_test "step" "if .c == EOF.*" "step in 1 two" 171gdb_test "print lines" " = 102.*" "verify lines 1 two" 172 173gdb_test "restart 2" "Switching to .*c == EOF.*" "restart 2 two" 174gdb_test "continue" ".*" "" 175gdb_test "continue 100" "breakpoint 1.*" "breakpoint 1 2 one" 176gdb_test "step" "if .c == EOF.*" "step in 2 two" 177gdb_test "print lines" " = 112.*" "verify lines 2 two" 178 179gdb_test "restart 3" "Switching to .*c == EOF.*" "restart 3 two" 180gdb_test "continue" ".*" "" 181gdb_test "continue 500" "breakpoint 1.*" "breakpoint 1 3 one" 182gdb_test "step" "if .c == EOF.*" "step in 3 two" 183gdb_test "print lines" " = 522.*" "verify lines 3 two" 184 185gdb_test "restart 4" "Switching to .*c == EOF.*" "restart 4 two" 186gdb_test "continue" ".*" "" 187gdb_test "continue 500" "breakpoint 1.*" "breakpoint 1 4 one" 188gdb_test "step" "if .c == EOF.*" "step in 4 two" 189gdb_test "print lines" " = 532.*" "verify lines 4 two" 190 191gdb_test "restart 5" "Switching to .*c == EOF.*" "restart 5 two" 192gdb_test "continue" ".*" "" 193gdb_test "continue 1000" "breakpoint 1.*" "breakpoint 1 5 one" 194gdb_test "step" "if .c == EOF.*" "step in 5 two" 195gdb_test "print lines" " = 1042.*" "verify lines 5 two" 196 197gdb_test "restart 6" "Switching to .*c == EOF.*" "restart 6 two" 198gdb_test "continue" ".*" "" 199gdb_test "continue 1000" "breakpoint 1.*" "breakpoint 1 6 one" 200gdb_test "step" "if .c == EOF.*" "step in 6 two" 201gdb_test "print lines" " = 1052.*" "verify lines 5 two" 202 203gdb_test "restart 7" "Switching to .*c == EOF.*" "restart 7 two" 204gdb_test "continue" ".*" "" 205gdb_test "continue 1100" "breakpoint 1.*" "breakpoint 1 7 one" 206gdb_test "step" "if .c == EOF.*" "step in 7 two" 207gdb_test "print lines" " = 1162.*" "verify lines 7 two" 208 209gdb_test "shell diff -s $pi_txt $copy1_txt" \ 210 "Files .*pi.txt and .*copy1.txt are identical.*" \ 211 "diff input and output two" 212 213# 214# OK, now allow the original program to delete the output file, 215# and verify that the checkpoints can still write to it. 216# 217 218gdb_test "restart 0" "Switching to .*breakpoint 3.*" "restart 0 one" 219gdb_breakpoint $break4_loc 220gdb_test "continue" "breakpoint 4.*" "break4 one" 221 222gdb_test "shell diff $pi_txt $copy1_txt" \ 223 "diff: .*copy1.txt: No such file or directory" \ 224 "delete copy1" 225 226delete_breakpoints 227gdb_breakpoint $break2_loc 228 229for {set num 1} {$num <= 10} {incr num} { 230 gdb_test "restart $num" "if .c == EOF.*" "restart $num three" 231 gdb_test "continue" "breakpoint 2.*" "break2 $num one" 232 gdb_test "print (long) ftell (out) > 100000" " = 1.*" "outfile still open $num" 233} 234 235# 236# Now confirm that if one fork exits, we automatically switch to another one. 237# 238 239delete_breakpoints 240gdb_test "continue" \ 241 "Deleting copy.*$inferior_exited_re normally.*Switching to.*" \ 242 "exit, dropped into next fork one" 243 244gdb_test "continue" \ 245 "Deleting copy.*$inferior_exited_re normally.*Switching to.*" \ 246 "exit, dropped into next fork two" 247 248gdb_test "continue" \ 249 "Deleting copy.*$inferior_exited_re normally.*Switching to.*" \ 250 "exit, dropped into next fork three" 251 252gdb_test "continue" \ 253 "Deleting copy.*$inferior_exited_re normally.*Switching to.*" \ 254 "exit, dropped into next fork four" 255 256gdb_test "continue" \ 257 "Deleting copy.*$inferior_exited_re normally.*Switching to.*" \ 258 "exit, dropped into next fork five" 259 260# 261# There should be still at least five forks left 262# 263 264gdb_test "info checkpoints" " 1 .* 2 .* 3 .* 4 .* 5 .*" \ 265 "info checkpoints two" 266 267# 268# Kill should now terminate all of them. 269# 270 271gdb_test "kill" "" "kill all one" \ 272 "Kill the program being debugged.*y or n. $" "y" 273 274# 275# and confirm that all are gone 276# 277 278gdb_test "restart 0" "Not found.*" "no more checkpoint 0" 279gdb_test "restart 1" "Not found.*" "no more checkpoint 1" 280gdb_test "restart 2" "Not found.*" "no more checkpoint 2" 281gdb_test "restart 3" "Not found.*" "no more checkpoint 3" 282gdb_test "restart 4" "Not found.*" "no more checkpoint 4" 283gdb_test "restart 5" "Not found.*" "no more checkpoint 5" 284gdb_test "restart 6" "Not found.*" "no more checkpoint 6" 285gdb_test "restart 7" "Not found.*" "no more checkpoint 7" 286gdb_test "restart 8" "Not found.*" "no more checkpoint 8" 287gdb_test "restart 9" "Not found.*" "no more checkpoint 9" 288gdb_test "restart 10" "Not found.*" "no more checkpoint 10" 289 290# 291# Now let's try setting a large number of checkpoints (>600) 292# 293 294gdb_exit 295gdb_start 296gdb_reinitialize_dir $srcdir/$subdir 297gdb_load ${binfile} 298 299runto_main 300gdb_breakpoint $break1_loc 301 302gdb_test "commands\nsilent\nif (lines % 2)\ncheckpoint\nend\n continue\nend" \ 303 "" \ 304 "set checkpoint breakpoint" 305 306set prev_timeout $timeout 307set timeout [expr $timeout + 120] 308verbose "Timeout now $timeout sec." 309 310gdb_breakpoint $break2_loc 311gdb_test "continue" "breakpoint 2.*" "break2 with many checkpoints" 312 313set count 0 314set msg "info checkpoints with at least 600 checkpoints" 315gdb_test_multiple "info checkpoints" $msg { 316 -re " $decimal process \[^\r\]*\r\n" { 317 incr count 318 exp_continue 319 } 320 -re "$gdb_prompt $" { 321 if { $count >= 600 } { 322 pass $msg 323 } else { 324 fail $msg 325 } 326 } 327} 328 329# 330# OK, kill 'em all... 331# 332 333gdb_test "kill" "" "kill all one with many checkpoints" \ 334 "Kill the program being debugged.*y or n. $" "y" 335 336# Restore old timeout 337set timeout $prev_timeout 338verbose "Timeout now $timeout sec." 339 340# 341# Finished: cleanup 342# 343