使用 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)的使用