summaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorPaul N. Hilfinger <hilfinger@adacore.com>2004-01-29 11:15:44 +0000
committerPaul N. Hilfinger <hilfinger@adacore.com>2004-01-29 11:15:44 +0000
commitd8679d841d339ff4a3cefb479d3fab1d35866bd7 (patch)
treeb59f02368c83835e2fde09a49d30518f8e858455 /gdb
parent481fedf372286d5752544d8d6828f552f77f5d70 (diff)
downloadbinutils-gdb-d8679d841d339ff4a3cefb479d3fab1d35866bd7.tar.gz
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.
Diffstat (limited to 'gdb')
-rw-r--r--gdb/testsuite/ChangeLog5
-rw-r--r--gdb/testsuite/gdb.base/Makefile.in2
-rw-r--r--gdb/testsuite/gdb.base/chng-syms.c22
-rw-r--r--gdb/testsuite/gdb.base/chng-syms.exp120
4 files changed, 148 insertions, 1 deletions
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 <Hilfinger@gnat.com>
+
+ * gdb.base/chng-syms.exp: New file.
+ * gdb.base/chng-syms.c: New file.
+
2004-01-24 Michael Chastain <mec.gnu@mindspring.com>
* 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 <stdlib.h>
+
+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