* 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>
* arm-tdep.c (thumb_skip_prologue): Quit scanning prologue

View 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

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