aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog6
-rw-r--r--gdb/infcmd.c14
-rw-r--r--gdb/testsuite/ChangeLog5
-rw-r--r--gdb/testsuite/gdb.base/reread.exp66
4 files changed, 86 insertions, 5 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 62cdb39..ae67a79 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,9 @@
+2002-01-21 Jim Blandy <jimb@redhat.com>
+
+ * infcmd.c (run_command): Check that the `exec' target layer's BFD
+ is up-to-date before running the program, not just when a program
+ exits.
+
2002-01-21 Fred Fish <fnf@redhat.com>
* arm-tdep.c (thumb_skip_prologue): Quit scanning prologue
diff --git a/gdb/infcmd.c b/gdb/infcmd.c
index ccf0806..5b8d1f2 100644
--- a/gdb/infcmd.c
+++ b/gdb/infcmd.c
@@ -389,17 +389,23 @@ Start it from the beginning? "))
clear_breakpoint_hit_counts ();
- exec_file = (char *) get_exec_file (0);
-
/* Purge old solib objfiles. */
objfile_purge_solibs ();
do_run_cleanups (NULL);
- /* The exec file is re-read every time we do a generic_mourn_inferior, so
- we just have to worry about the symbol file. */
+ /* The comment here used to read, "The exec file is re-read every
+ time we do a generic_mourn_inferior, so we just have to worry
+ about the symbol file." The `generic_mourn_inferior' function
+ gets called whenever the program exits. However, suppose the
+ program exits, and *then* the executable file changes? We need
+ to check again here. Since reopen_exec_file doesn't do anything
+ if the timestamp hasn't changed, I don't see the harm. */
+ reopen_exec_file ();
reread_symbols ();
+ exec_file = (char *) get_exec_file (0);
+
/* We keep symbols from add-symbol-file, on the grounds that the
user might want to add some symbols before running the program
(right?). But sometimes (dynamic loading where the user manually
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index ddc088c..4d37658 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2002-01-21 Jim Blandy <jimb@redhat.com>
+
+ * gdb.base/reread.exp: Check that GDB properly re-reads the
+ executable file when it changes while no inferior is running.
+
2002-01-21 Fred Fish <fnf@redhat.com>
* gdb.base/maint.exp: Simplify the "maint info breakpoints" test to
diff --git a/gdb/testsuite/gdb.base/reread.exp b/gdb/testsuite/gdb.base/reread.exp
index 13ea066..f0650c4 100644
--- a/gdb/testsuite/gdb.base/reread.exp
+++ b/gdb/testsuite/gdb.base/reread.exp
@@ -87,7 +87,7 @@ gdb_expect {
# Restore first executable to its original name, and move
# second executable into its place. Ensure that the new
-# executable is at least a second older than the old.
+# executable is at least a second newer than the old.
gdb_test "shell mv ${binfile} ${binfile1}" "" ""
gdb_test "shell mv ${binfile2} ${binfile}" "" ""
@@ -98,6 +98,8 @@ gdb_test "shell touch ${binfile}" "" ""
# and reset the breakpoints correctly.
# Should see "Breakpoint 1, foo () at reread2.c:9"
+set prms_id 0
+
if ![isnative] {
unsupported "run to foo() second time ";
} else {
@@ -118,6 +120,68 @@ if ![isnative] {
}
}
+
+### Second pass: verify that GDB checks the executable file's
+### timestamp when the program is *restarted*, not just when it exits.
+
+if ![isnative] {
+ unsupported "second pass: GDB should check for changes before running"
+} else {
+
+ # Put the older executable back in place.
+ gdb_test "shell mv ${binfile} ${binfile2}" "" ""
+ gdb_test "shell mv ${binfile1} ${binfile}" "" ""
+
+ # Restart GDB entirely.
+ gdb_start
+ gdb_reinitialize_dir $srcdir/$subdir
+ gdb_load ${binfile}
+
+ # Set a breakpoint on foo and run to it.
+ gdb_test "break foo" \
+ "Breakpoint.*at.* file .*$srcfile1, line 14.*" \
+ "second pass: breakpoint foo in first file"
+ gdb_run_cmd
+ gdb_expect {
+ -re ".*Breakpoint.* foo .* at .*$srcfile1:14.*$gdb_prompt $" {
+ pass "second pass: run to foo()";
+ }
+ -re ".*$gdb_prompt $" {
+ fail "second pass: run to foo()";
+ gdb_suppress_tests;
+ }
+ timeout {
+ fail "second pass: run to foo() (timeout)"
+ gdb_suppress_tests
+ }
+ }
+
+ # This time, let the program run to completion. If GDB checks the
+ # executable file's timestamp now, it won't notice any change.
+ gdb_test "continue" ".*Program exited.*" \
+ "second pass: continue to completion"
+
+ # Now move the newer executable into place, and re-run. GDB
+ # should still notice that the executable file has changed,
+ # and still re-set the breakpoint appropriately.
+ gdb_test "shell mv ${binfile} ${binfile1}" "" ""
+ gdb_test "shell mv ${binfile2} ${binfile}" "" ""
+ gdb_run_cmd
+ gdb_expect {
+ -re ".*Breakpoint.* foo .* at .*:9.*$gdb_prompt $" {
+ pass "second pass: run to foo() second time ";
+ }
+ -re ".*$gdb_prompt $" {
+ fail "second pass: run to foo() second time";
+ gdb_suppress_tests;
+ }
+ timeout {
+ fail "second pass: run to foo() second time (timeout)" ;
+ gdb_suppress_tests
+ }
+ }
+}
+
# End of tests.
gdb_stop_suppressing_tests