# Copyright 2004-2021 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 . # Author: Paul N. Hilfinger (Hilfinger@gnat.com) # Test that GDB cleans up properly after errors that result when a # breakpoint is reset. standard_testfile .c if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-DVARIABLE=var1}] != "" } { untested "failed to compile" return -1 } set oldtimeout $timeout set timeout 10 verbose "Timeout is now 10 seconds" 2 proc expect_to_stop_here { ident } { # the "at foo.c:36" output we get with -g. # the "in func" output we get without -g. gdb_test "" "Breakpoint \[0-9\]*, stop_here .*" "running to stop_here $ident" } clean_restart ${binfile} gdb_test "break stop_here if (var1 == 42)" \ "Breakpoint.*at.* file .*$srcfile, line.*" \ "setting conditional breakpoint on function" gdb_run_cmd expect_to_stop_here "first time" gdb_continue_to_end "breakpoint first time through" # Now we recompile the executable, but without a variable named "var1", first # waiting to insure that even on fast machines, the file modification times # are distinct. This will force GDB to reload the file on the # next "run" command, causing an error when GDB tries to tries to reset # the breakpoint. sleep 2 if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-DVARIABLE=var2}] != "" } { # Complication: Since GDB generally holds an open file descriptor on the # executable at this point, there are some systems in which the # re-compilation will fail. In such cases, we'll consider the test # (vacuously) passed providing that re-running it succeeds as before. gdb_run_cmd expect_to_stop_here "after re-compile fails" gdb_continue_to_end "after re-compile fails" } else { gdb_run_cmd set test "running with invalidated bpt condition after executable changes" gdb_test_multiple "" $test { -re ".*$inferior_exited_re normally.*$gdb_prompt $" { pass $test } -re ".*Breakpoint .*,( 0x.* in)? (\[^ \]*)exit .*$gdb_prompt $" { pass $test } } } set timeout $oldtimeout verbose "Timeout is now $timeout seconds" 2 return 0