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

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

След похож на это:

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 ?? ()
40
задан nornagon 9 June 2010 в 06:08
поделиться

2 ответа

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

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

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

62
ответ дан 27 November 2019 в 01:45
поделиться

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

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

-1
ответ дан 27 November 2019 в 01:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: