Как я могу заставить 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", чтобы увидеть рассматриваемый кадр стека.