diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 62cdb39dcb5..ae67a79e381 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2002-01-21 Jim Blandy + + * 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 * arm-tdep.c (thumb_skip_prologue): Quit scanning prologue diff --git a/gdb/infcmd.c b/gdb/infcmd.c index ccf08064f4d..5b8d1f21fd8 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 ddc088c9a4e..4d376583343 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2002-01-21 Jim Blandy + + * 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 * 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 13ea0666249..f0650c4c014 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