# Copyright 2004, 2007, 2008, 2009, 2010, 2011 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. if $tracelevel then { strace $tracelevel } # IDT/SIM apparently doesn't have enough file descriptors to allow the # problem checked by this test to occur. if [istarget "mips-idt-*"] { return 0; } set testfile "chng-syms" set srcfile ${testfile}.c set binfile ${objdir}/${subdir}/${testfile} if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-DVARIABLE=var1}] != "" } { untested chng-syms.exp return -1 } set oldtimeout $timeout set timeout 10 verbose "Timeout is now 10 seconds" 2 proc expect_to_stop_here { ident } { global gdb_prompt global decimal # the "at foo.c:36" output we get with -g. # the "in func" output we get without -g. gdb_expect { -re "Breakpoint \[0-9\]*, stop_here .*$gdb_prompt $" { return 1 } -re "$gdb_prompt $" { fail "running to stop_here $ident" return 0 } timeout { fail "running to stop_here $ident (timeout)" return 0 } } return 1 } gdb_exit gdb_start gdb_reinitialize_dir $srcdir/$subdir gdb_load ${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 gdb_expect { -re ".*Program exited normally.*$gdb_prompt $" { pass "running with invalidated bpt condition after executable changes" } -re ".*Breakpoint .*,( 0x.* in)? (\[^ \]*)exit .*$gdb_prompt $" { pass "running with invalidated bpt condition after executable changes" } -re "$gdb_prompt $" { fail "running with invalidated bpt condition after executable changes" } timeout { fail "(timeout) running with invalidated bpt condition after executable changes" } } } set timeout $oldtimeout verbose "Timeout is now $timeout seconds" 2 return 0