From d8679d841d339ff4a3cefb479d3fab1d35866bd7 Mon Sep 17 00:00:00 2001 From: "Paul N. Hilfinger" Date: Thu, 29 Jan 2004 11:15:44 +0000 Subject: [PATCH] New test to check that GDB does not crash due to memory corruption when a reload caused by a change in an executable invalidates a breakpoint condition. --- gdb/testsuite/ChangeLog | 5 ++ gdb/testsuite/gdb.base/Makefile.in | 2 +- gdb/testsuite/gdb.base/chng-syms.c | 22 +++++ gdb/testsuite/gdb.base/chng-syms.exp | 120 +++++++++++++++++++++++++++ 4 files changed, 148 insertions(+), 1 deletion(-) create mode 100644 gdb/testsuite/gdb.base/chng-syms.c create mode 100644 gdb/testsuite/gdb.base/chng-syms.exp diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 506e79d7f4a..c0e48a11654 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2004-01-29 Paul N. Hilfinger + + * gdb.base/chng-syms.exp: New file. + * gdb.base/chng-syms.c: New file. + 2004-01-24 Michael Chastain * gdb.cp/local.exp: Rewrite "ptype Local". Add "ptype l". diff --git a/gdb/testsuite/gdb.base/Makefile.in b/gdb/testsuite/gdb.base/Makefile.in index e59f57b6639..9f382db8b5a 100644 --- a/gdb/testsuite/gdb.base/Makefile.in +++ b/gdb/testsuite/gdb.base/Makefile.in @@ -3,7 +3,7 @@ srcdir = @srcdir@ EXECUTABLES = all-types annota1 bitfields break \ call-ar-st call-rt-st call-strs callfuncs callfwmall \ - commands compiler condbreak constvars coremaker \ + chng-syms commands compiler condbreak constvars coremaker \ dbx-test display ending-run execd-prog exprs \ foll-exec foll-fork foll-vfork funcargs int-type interrupt jump \ langs list long_long mips_pro miscexprs nodebug opaque overlays \ diff --git a/gdb/testsuite/gdb.base/chng-syms.c b/gdb/testsuite/gdb.base/chng-syms.c new file mode 100644 index 00000000000..3394f5c3897 --- /dev/null +++ b/gdb/testsuite/gdb.base/chng-syms.c @@ -0,0 +1,22 @@ +/* + * Test that GDB cleans up properly after errors that result when a + * breakpoint is reset. + */ + +/* VARIABLE is a macro defined on the compiler command line. */ + +#include + +int VARIABLE = 42; + +void stop_here () +{ + VARIABLE *= 2; +} + +int main () +{ + stop_here (); + exit (0); +} + diff --git a/gdb/testsuite/gdb.base/chng-syms.exp b/gdb/testsuite/gdb.base/chng-syms.exp new file mode 100644 index 00000000000..a4dd246cee4 --- /dev/null +++ b/gdb/testsuite/gdb.base/chng-syms.exp @@ -0,0 +1,120 @@ +# Copyright 2004 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 + +# 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 +} + +set prms_id 0 +set bug_id 0 + +# 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}] != "" } { + gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." +} + +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)\n" \ + "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 "Error in re-setting .*No symbol .var1..*Program exited normally.*" { + pass "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 -- 2.30.2