2010-04-08 30 views
1

我有这样的输出试图调试使用Valgrind工具如何检测试图访问0x0地址的对象?

计划接收信号SIGSEGV时,在

的std :: string段错误0x43989029 ::比较(此= 0x88fd430,__str = @ 0xbfff9060) /家/ devsw/tmp/objdir/i686-pc-linux-gnu/libstdC++ -v3/include/bits/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内)

+0

它看起来像是在调用string :: compare() – Stephen 2010-04-08 17:00:02

回答

8

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

如果您通过GDB(gdb path_to_my_executable_file/executable_file)的应用程序,你编译调试(用于GNU C/C++编译器-g-ggdb)应用程序启用,你可以(在gdb提示通过run命令),启动应用程序一旦你到达SegFault,做一个回溯(bt),看看你的程序叫做std::string::compare哪部分死亡。

例(C):

[email protected]:~/stackoverflow$ gcc -ggdb crash.c -o crash 
[email protected]:~/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

只要运行在调试器中的应用程序。有一点它会死亡,你将有一个堆栈跟踪你想要的信息。

+0

时解引用空字符串对象。调试结果在上面显示。 std :: string :: compare – 2010-04-08 17:21:04

+2

中的问题调试器可以提供比您显示的信息更多的信息。它可以肯定地显示堆栈跟踪,所以你不仅知道'string :: compare'杀死了应用程序,还知道谁做了这个调用以及什么参数......在linux中使用gdb:'bt'会转储一个backtrace ,你可以使用'up/down/frame#'移动到给定的帧,并且你可以使用'print var'将var的内容转储到屏幕上。 – 2010-04-08 17:33:39

相关问题