Как я могу заставить GDB сказать мне, какой адрес вызвал ошибку? - PullRequest
38 голосов
/ 09 июня 2010

Я хотел бы знать, имеет ли моя программа доступ к указателям 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 ?? ()

Ответы [ 2 ]

59 голосов
/ 09 июня 2010

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

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

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

0 голосов
/ 09 июня 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...