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

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

Обратный след выглядит так:

Программа получила сигнал SIGSEGV, Ошибка сегментации.
[Переключение на тему 0x2b0fa4c8 (LWP 1333)]
0x299a6ad4 в pthread_mutex_lock () из /lib/libpthread.so.0
(GDB) Bt
#0  0x299a6ad4 в pthread_mutex_lock () из /lib/libpthread.so.0
#1  0x0058e900 in?? ()

2 ответа

Решение

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

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

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

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

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

Другие вопросы по тегам