Похоже, что GDB не может найти позицию кода ошибки утверждения после того, как я перекомпилирую свой код. Точнее, я ожидаю, что позиция сигнального повышения относительно неудачного утверждения будет
0x00007ffff7a5ff00 in raise () from /lib64/libc.so.`6
а вместо этого я получаю
0x00007ffff7a5ff00 in ?? ()
Например, рассмотрим следующий код
#include <assert.h>
int main()
{
assert(0);
return 0;
}
скомпилирован с отладочными символами и отлажен с помощью gdb.
> gcc -g main.c
> gdb a.out
При первом запуске gdb позиция найдена, и обратная трассировка сообщается правильно:
GNU gdb (Gentoo 8.0.1 p1) 8.0.1
...
(gdb) r
Starting program: /home/myself/a.out
a.out: main.c:5: main: Assertion `0' failed.
Program received signal SIGABRT, Aborted.
0x00007ffff7a5ff00 in raise () from /lib64/libc.so.6
(gdb) bt
#0 0x00007ffff7a5ff00 in raise () from /lib64/libc.so.6
#1 0x00007ffff7a61baa in abort () from /lib64/libc.so.6
#2 0x00007ffff7a57cb7 in ?? () from /lib64/libc.so.6
#3 0x00007ffff7a57d72 in __assert_fail () from /lib64/libc.so.6
#4 0x00005555555546b3 in main () at main.c:5
(gdb)
Проблема возникает, когда я перекомпилирую код. После перекомпиляции я запускаю команду запуска в том же экземпляре gdb. Gdb перечитывает символы, запускает программу с начала, но не находит нужной позиции:
(gdb) r
The program being debugged has been started already.
Start it from the beginning? (y or n) y
`/home/myself/a.out' has changed; re-reading symbols.
Starting program: /home/myself/a.out
a.out: main.c:5: main: Assertion `0' failed.
Program received signal SIGABRT, Aborted.
0x00007ffff7a5ff00 in ?? ()
(gdb) bt
#0 0x00007ffff7a5ff00 in ?? ()
#1 0x0000000000000000 in ?? ()
(gdb) up
Initial frame selected; you cannot go up.
(gdb) n
Cannot find bounds of current function
На данный момент отладчик не работает. Нельзя подняться, сделай шаг вперед. В качестве обходного пути я могу вручную перезагрузить файл, и позиции будут снова найдены.
(gdb) file a.out
Load new symbol table from "a.out"? (y or n) y
Reading symbols from a.out...done.
(gdb) r
Starting program: /home/myself/a.out
a.out: main.c:5: main: Assertion `0' failed.
Program received signal SIGABRT, Aborted.
0x00007ffff7a5ff00 in raise () from /lib64/libc.so.6
(gdb)
К сожалению, после перезагрузки файла таким образом gdb не может сбросить точки останова.
ИСПРАВЛЕНИЕ ОШИБКИ: У меня возникла ошибка при сбросе точек останова с помощью gdb 7.12.1. После обновления до 8.0.1 проблема исчезла. Предположительно, это было связано с исправлением ошибки https://sourceware.org/bugzilla/show_bug.cgi?id=21555. Однако позиции кода, в которых утверждения не выполняются, по-прежнему не могут быть правильно найдены.
Кто-нибудь знает, что здесь происходит?
Это началось после обновления системы. При обновлении системы все системные библиотеки, включая glibc, были перекомпилированы как позиционно-независимый код, т. Е. Скомпилированный с помощью -fPIC.
Кроме того, я использую версию gcc 6.4.0.
file a.out
не перезапускает gdb. Он загружает правильный двоичный файл. И, возможно, размещение всех ваших точек останова в неправильном месте из-за того, что вы добавили или удалили строку, звучит бесполезно. - person nwp   schedule 02.02.2018