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

时间:2010-04-08 16:58:24

标签: c++ linux gdb g++ valgrind

尝试调试时我有这个输出

  

编程接收信号SIGSEGV,分段故障0x43989029在
  std :: string :: compare(this = 0x88fd430,__str = @ 0xbfff9060)在
  /家庭/ devsw / TMP / objdir / i686的-PC-Linux的GNU /的libstdc ++ - V3 /包含/比特/ 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中)

2 个答案:

答案 0 :(得分:8)

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

如果您通过gdb(gdb path_to_my_executable_file/executable_file)运行应用程序,并且已经为启用了调试(-g-ggdb用于GNU C / C ++编译器)编译了应用程序,则可以启动应用程序(在gdb提示符下通过run命令),一旦到达SegFault,请执行回溯(bt)以查看程序中名为std::string::compare的程序的哪个部分已死亡。< / p>

示例(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行。

祝你好运。

答案 1 :(得分:4)

只需在调试器中运行应用程序即可。有一次它会死掉,你将拥有一个包含所需信息的堆栈跟踪。