* 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.

* testsuite/gdb.base/reread.exp: Check that GDB properly re-reads the
executable file when it changes while no inferior is running.
This commit is contained in:
Jim Blandy 2002-01-21 21:57:55 +00:00
parent 58255df39c
commit 39ad761d6d
4 changed files with 86 additions and 5 deletions

View 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> 2002-01-21 Fred Fish <fnf@redhat.com>
* arm-tdep.c (thumb_skip_prologue): Quit scanning prologue * arm-tdep.c (thumb_skip_prologue): Quit scanning prologue

View File

@ -389,17 +389,23 @@ Start it from the beginning? "))
clear_breakpoint_hit_counts (); clear_breakpoint_hit_counts ();
exec_file = (char *) get_exec_file (0);
/* Purge old solib objfiles. */ /* Purge old solib objfiles. */
objfile_purge_solibs (); objfile_purge_solibs ();
do_run_cleanups (NULL); do_run_cleanups (NULL);
/* The exec file is re-read every time we do a generic_mourn_inferior, so /* The comment here used to read, "The exec file is re-read every
we just have to worry about the symbol file. */ 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 (); reread_symbols ();
exec_file = (char *) get_exec_file (0);
/* We keep symbols from add-symbol-file, on the grounds that the /* We keep symbols from add-symbol-file, on the grounds that the
user might want to add some symbols before running the program user might want to add some symbols before running the program
(right?). But sometimes (dynamic loading where the user manually (right?). But sometimes (dynamic loading where the user manually

View 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> 2002-01-21 Fred Fish <fnf@redhat.com>
* gdb.base/maint.exp: Simplify the "maint info breakpoints" test to * gdb.base/maint.exp: Simplify the "maint info breakpoints" test to

View File

@ -87,7 +87,7 @@ gdb_expect {
# Restore first executable to its original name, and move # Restore first executable to its original name, and move
# second executable into its place. Ensure that the new # 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 ${binfile} ${binfile1}" "" ""
gdb_test "shell mv ${binfile2} ${binfile}" "" "" gdb_test "shell mv ${binfile2} ${binfile}" "" ""
@ -98,6 +98,8 @@ gdb_test "shell touch ${binfile}" "" ""
# and reset the breakpoints correctly. # and reset the breakpoints correctly.
# Should see "Breakpoint 1, foo () at reread2.c:9" # Should see "Breakpoint 1, foo () at reread2.c:9"
set prms_id 0
if ![isnative] { if ![isnative] {
unsupported "run to foo() second time "; unsupported "run to foo() second time ";
} else { } 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. # End of tests.
gdb_stop_suppressing_tests gdb_stop_suppressing_tests