gdb bt
Конечно, это не команда, которую вы фактически выполнили.
Скорее всего, вы сделали что-то вроде этого:
gdb /path/to/core
(gdb) bt
Не делайте , что .Сделайте это вместо этого:
gdb /path/to/a.out /path/to/core
(gdb) bt
Если вы уже правильно вызвали GDB, другие вероятные причины, по которым bt
не сработал:
- Вы анализируете
core
наотличается машина от той, на которой она была изготовлена.См. этот ответ . - Вы перестроили
a.out
с разными флагами.Используйте точный двоичный файл, который упал. - Вы обновили
libc
после того, как ядро было произведено.Восстановите его до версии, которая была текущей на момент создания ядра.
PS Эта команда
addr2line -e a.out 00007fcd16e5853a
делаетнет смысла: сообщение об ошибке говорит вам, что адрес 00007fcd16e5853a
находится в libc-2.24.so
.a.out
не имеет отношения к этому адресу ничего .
Команда, которую вы хотите использовать:
addr2line -fe /path/to/libc-2.24.so 195000
PPS
segfault at 0 ip 00007fcd16e5853a ...
Это означает: NULL
разыменование указателя внутри libc
.Наиболее вероятная причина: не проверка возврата ошибки, например что-то вроде:
FILE *fp = fopen("/some/file", "r");
fscanf(fp, buffer, sizeof(buffer)); // Oops: didn't check for NULL.