Подтвердить что ты не робот

Как я могу заставить GDB рассказать мне, какой адрес вызвал segfault?

Я хотел бы узнать, обращается ли моя программа к указателям NULL или к устаревшей памяти.

Возврат выглядит следующим образом:

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x2b0fa4c8 (LWP 1333)]
0x299a6ad4 in pthread_mutex_lock () from /lib/libpthread.so.0
(gdb) bt
#0  0x299a6ad4 in pthread_mutex_lock () from /lib/libpthread.so.0
#1  0x0058e900 in ?? ()
4b9b3361

Ответ 1

С GDB 7 и выше вы можете изучить структуру $_siginfo, которая заполняется при возникновении сигнала, и определить адрес сбоя:

(gdb) p $_siginfo._sifields._sigfault.si_addr

Если он показывает (void *) 0x0 (или небольшое число), то у вас есть разыменование указателя NULL.

Ответ 2

Запустите программу под GDB. Когда произойдет segfault, GDB сообщит вам строку и инструкцию вашей программы вместе с переменной и связанным с ней адресом.

Вы можете использовать команду "print" (p) в GDB для проверки переменных. Если авария произошла в вызове библиотеки, вы можете использовать команды "frame" для просмотра рассматриваемого фрейма стека.