GDB BT дает только ??, как я могу отладить? - PullRequest
0 голосов
/ 24 ноября 2018

/ var / log / message:

segfault at 0 ip 00007fcd16e5853a sp 00007ffd98e37e58 error 4 in libc-2.24.so[7fcd16dc9000+195000]

addr2line -e a.out 00007fcd16e5853a

??:0

gdb bt

Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x00007fcd16e5853a in ?? ()
(gdb) bt
#0  0x00007fcd16e5853a in ?? ()
#1  0x000055f2f45fe95b in ?? ()
#2  0x000055f200000080 in ?? ()
#3  0x00007fcd068c2040 in ?? ()
#4  0x000055f2f6109c48 in ?? ()
#5  0x0000000000000000 in ?? ()

сборка с gcc -Wall -O0 -g

Как я могу это отладить, есть еще методы?

1 Ответ

0 голосов
/ 24 ноября 2018

gdb bt

Конечно, это не команда, которую вы фактически выполнили.

Скорее всего, вы сделали что-то вроде этого:

gdb /path/to/core
(gdb) bt

Не делайте , что .Сделайте это вместо этого:

gdb /path/to/a.out /path/to/core
(gdb) bt

Если вы уже правильно вызвали GDB, другие вероятные причины, по которым bt не сработал:

  1. Вы анализируете core наотличается машина от той, на которой она была изготовлена.См. этот ответ .
  2. Вы перестроили a.out с разными флагами.Используйте точный двоичный файл, который упал.
  3. Вы обновили 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.
...