New test to check that GDB does not crash due to memory corruption
authorPaul N. Hilfinger <hilfinger@adacore.com>
Thu, 29 Jan 2004 11:15:44 +0000 (11:15 +0000)
committerPaul N. Hilfinger <hilfinger@adacore.com>
Thu, 29 Jan 2004 11:15:44 +0000 (11:15 +0000)
when a reload caused by a change in an executable invalidates
a breakpoint condition.

gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/Makefile.in
gdb/testsuite/gdb.base/chng-syms.c [new file with mode: 0644]
gdb/testsuite/gdb.base/chng-syms.exp [new file with mode: 0644]

index 506e79d7f4a41766b464255dc5bdd6f26e9463ae..c0e48a11654792498c86b47019810a955eea0b9b 100644 (file)
@@ -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".
index e59f57b6639a89cf56bab4594d337d7de4374ebe..9f382db8b5a9a92efdf0d060d70f1e4bc0a544d2 100644 (file)
@@ -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 (file)
index 0000000..3394f5c
--- /dev/null
@@ -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 (file)
index 0000000..a4dd246
--- /dev/null
@@ -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