There's a group of FAILs with -readnow: ... FAIL: gdb.ada/exec_changed.exp: start second FAIL: gdb.ada/exec_changed.exp: start just first FAIL: gdb.base/reread.exp: opts= "" "" : run to foo() second time FAIL: gdb.base/reread.exp: opts= "" "" : second pass: run to foo() second time FAIL: gdb.base/reread.exp: opts= "-fPIE" "ldflags=-pie" : run to foo() second time FAIL: gdb.base/reread.exp: opts= "-fPIE" "ldflags=-pie" : second pass: run to foo() second time ... This FAIL: ... FAIL: gdb.base/reread.exp: opts= "" "" : run to foo() second time ... can be reproduced a follows. First, run the test-case. Then rename the reread exec to the original name: ... $ mv outputs/gdb.base/reread/reread outputs/gdb.base/reread/reread2 ... such that we have: ... $ ls -1 outputs/gdb.base/reread/reread* outputs/gdb.base/reread/reread1 outputs/gdb.base/reread/reread2 ... Then, do a run without -readnow for contrast: ... $ gdb -batch \ -ex "shell cp outputs/gdb.base/reread/reread1 reread" \ -ex "file reread" \ -ex "b foo" \ -ex run \ -ex "shell rm reread" \ -ex "shell cp outputs/gdb.base/reread/reread2 reread" \ -ex "shell sleep 1" \ -ex run Breakpoint 1 at 0x654: file /home/vries/gdb_versions/devel/src/gdb/testsuite/gdb.base/reread1.c, line 14. Breakpoint 1, foo () at /home/vries/gdb_versions/devel/src/gdb/testsuite/gdb.base/reread1.c:14 14 x++; `/home/vries/gdb_versions/devel/reread' has changed; re-reading symbols. Breakpoint 1, foo () at /home/vries/gdb_versions/devel/src/gdb/testsuite/gdb.base/reread2.c:9 9 x++; ... Note that the second time we hit foo, it shows foo at reread2.c:9. With -readnow however, the second time we hit foo, no file/lineno is shown: ... Breakpoint 1 at 0x654: file /home/vries/gdb_versions/devel/src/gdb/testsuite/gdb.base/reread1.c, line 14. Breakpoint 1, foo () at /home/vries/gdb_versions/devel/src/gdb/testsuite/gdb.base/reread1.c:14 14 x++; `/home/vries/gdb_versions/devel/reread' has changed; re-reading symbols. Breakpoint 1, 0x000055555555468e in foo () ...
Tentative patch (code copied from symbol_file_add_with_addrs): ... diff --git a/gdb/symfile.c b/gdb/symfile.c index 3332e7f69f..2d00cab743 100644 --- a/gdb/symfile.c +++ b/gdb/symfile.c @@ -2586,6 +2586,12 @@ reread_symbols (void) read_symbols (objfile, 0); + if ((objfile->flags & OBJF_READNOW)) + { + if (objfile->sf) + objfile->sf->qf->expand_all_symtabs (objfile); + } + if (!objfile_has_symbols (objfile)) { wrap_here (""); ...
We've see a number of bugs come about because reread_symbols imperfectly duplicates the logic of symbol reading. It would be more robust to just drop the objfile and reread it.
Patch posted: https://sourceware.org/pipermail/gdb-patches/2021-October/182488.html
https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=9dec38d3b11c779e8f386050ed5046aaa4e759db