* infcmd.c (run_command): Check that the `exec' target layer's BFD
authorJim Blandy <jimb@codesourcery.com>
Mon, 21 Jan 2002 21:57:55 +0000 (21:57 +0000)
committerJim Blandy <jimb@codesourcery.com>
Mon, 21 Jan 2002 21:57:55 +0000 (21:57 +0000)
is up-to-date before running the program, not just when a program
exits.

* testsuite/gdb.base/reread.exp: Check that GDB properly re-reads the
executable file when it changes while no inferior is running.

gdb/ChangeLog
gdb/infcmd.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/reread.exp

index 62cdb39dcb5e88a3cb503a3b03215bdaccd7d53f..ae67a79e381b79e74f95c9b3f3b94b811d500eef 100644 (file)
@@ -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
index ccf08064f4d3d4ef6b01b1b5c90b59082104b024..5b8d1f21fd83704868a7d6cf06bdc9b9ff672e5b 100644 (file)
@@ -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
index ddc088c9a4ed4d8b36210356d6727ed41601a77a..4d376583343d3113c6d924d5e229143bfa22a777 100644 (file)
@@ -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
index 13ea0666249809812b57c7f8ae676ec965db56ff..f0650c4c01420d2b2bfc8b8d7da972db9bd5a301 100644 (file)
@@ -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