使用Valgrind工具如何检测试图访问0x0地址的对象?

Dav*_*yan 1 c++ linux gdb valgrind g++

尝试调试时我有这个输出

编程接收信号SIGSEGV,分段错误0x43989029在
std :: string :: compare(这= 0x88fd430,__str = @ 0xbfff9060)
/home/devsw/tmp/objdir/i686-pc-linux-gnu/libstdc ++ - v3/include /比特/ char_traits.h:253

253 {return memcmp(__ s1,__s2,__n); }

当前语言:auto; 目前是c ++


使用valgrind我得到了这个输出

== 12485 ==使用信号11的默认操作终止进程(SIGSEGV)
== 12485 = =地址0x0
= 12485 ==在0x1 处的映射区域的错误权限:(在path_to_my_executable_file/executable_file中)

mct*_*ylr 8

你不需要使用Valgrind,实际上你想使用GNU DeBugger(GDB).

如果您通过gdb(gdb path_to_my_executable_file/executable_file)运行应用程序并且已经启用了调试(-g-ggdbGNU C/C++编译器),则可以启动应用程序(通过rungdb提示符下的命令),一旦到达SegFault,做一个backtrace(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) 
Run Code Online (Sandbox Code Playgroud)

所以我感兴趣的错误位于crash.c第5行.

祝好运.