Используя инструмент Valgrind, как я могу определить, какой объект пытается получить доступ к адресу 0x0? - PullRequest
1 голос
/ 08 апреля 2010

У меня вывод при попытке отладки

Программа получила сигнал SIGSEGV, ошибка сегментации 0x43989029 in
std :: string :: compare (this = 0x88fd430, __str = @ 0xbfff9060) в
/home/devsw/tmp/objdir/i686-pc-linux-gnu/libstdc++-v3/include/bits/char_traits.h:253

253 {return memcmp (__s1, __s2, __n); }

Текущий язык: авто; в настоящее время с ++


Используя valgrind, я получаю этот вывод

== 12485 == Процесс завершается с действием по умолчанию для сигнала 11 (SIGSEGV)
== 12485 == Неверные разрешения для сопоставленного региона по адресу 0x0
== 12485 == в 0x1: (в пределах path_to_my_executable_file / executetable_file)

Ответы [ 2 ]

8 голосов
/ 08 апреля 2010

Вам не нужно использовать Valgrind, фактически вы хотите использовать GNU DeBugger (GDB).

Если вы запускаете приложение через gdb (gdb path_to_my_executable_file/executable_file) и скомпилировали приложение с включенной отладкой (-g или -ggdb для компиляторов GNU C / C ++), вы можете запустить приложение (через run введите команду в приглашении gdb) и, как только вы прибудете в SegFault, сделайте обратную трассировку (bt), чтобы увидеть, какая часть вашей программы называется std::string::compare, которая умерла.

Пример (C):

mctaylor@mpc:~/stackoverflow$ gcc -ggdb crash.c -o crash
mctaylor@mpc:~/stackoverflow$ gdb -q ./crash 
(gdb) run
Starting program: /home/mctaylor/stackoverflow/crash 

Program received signal SIGSEGV, Segmentation fault.
0x00007f78521bdeb1 in memcpy () from /lib/libc.so.6
(gdb) bt
#0  0x00007f78521bdeb1 in memcpy () from /lib/libc.so.6
#1  0x00000000004004ef in main (argc=1, argv=0x7fff3ef4d848) at crash.c:5
(gdb) 

Итак, интересующая меня ошибка находится в файле crash.c, строка 5.

Удачи.

4 голосов
/ 08 апреля 2010

Просто запустите приложение в отладчике. В какой-то момент он умрет, и вы получите трассировку стека с нужной вам информацией.

...