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

Posted

技术标签:

【中文标题】使用 Valgrind 工具如何检测尝试访问 0x0 地址的对象?【英文标题】:Using Valgrind tool how can I detect which object trying to access 0x0 address? 【发布时间】:2010-04-08 16:58:24 【问题描述】:

我在尝试调试时有这个输出

程序收到信号SIGSEGV,分段错误0x43989029 in std::string::compare (this=0x88fd430, __str=@0xbfff9060) at /home/devsw/tmp/objdir/i686-pc-linux-gnu/libstdc++-v3/include/bits/char_traits.h:253

253 返回 memcmp(__s1, __s2, __n);

当前语言:自动;目前c++


使用 valgrind 我得到了这个输出

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

【问题讨论】:

看起来你在调用 string::compare() 时取消引用一个空字符串对象 【参考方案1】:

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

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

示例(C):

mctaylor@mpc:~/***$ gcc -ggdb crash.c -o crash
mctaylor@mpc:~/***$ gdb -q ./crash 
(gdb) run
Starting program: /home/mctaylor/***/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 行。

祝你好运。

【讨论】:

【参考方案2】:

只需在调试器中运行应用即可。在某一时刻,它会死掉,你会得到一个包含你想要的信息的堆栈跟踪。

【讨论】:

调试结果显示在上面。 std::string::compare 中的问题 调试器可以提供比您显示的更多的信息。它肯定可以显示堆栈跟踪,因此您不仅知道string::compare 杀死了该应用程序,而且还知道是谁进行了该调用以及使用了什么参数...在linux 中使用gdb:bt 将转储回溯,您可以使用up/down/frame # 移动到给定的帧,您可以使用print var 将 var 的内容转储到屏幕...

以上是关于使用 Valgrind 工具如何检测尝试访问 0x0 地址的对象?的主要内容,如果未能解决你的问题,请参考以下文章

内存泄露检测工具Valgrind

开发工具Valgrind内存问题检测工具(valgrind)的使用

开发工具Valgrind内存问题检测工具(valgrind)的使用

开发工具Valgrind内存问题检测工具(valgrind)的使用

Unix下C程序内存泄露检测工具:valgrind的安装使用

调试Linux下超强内存检测工具Valgrind