1

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

程序收到信号 SIGSEGV,分段错误 0x43989029 在
std::string::compare (this=0x88fd430, __str=@0xbfff9060) at
/home/devsw/tmp/objdir/i686-pc-linux-gnu/libstdc++-v3/include/位/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 内)

4

2 回答 2

8

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

如果您通过 gdb ( gdb path_to_my_executable_file/executable_file) 运行应用程序并且您已在启用调试的情况下编译了应用程序(-g-ggdb对于 GNU C/C++ 编译器),您可以启动应用程序(通过rungdb 提示符下的命令),一旦您到达 SegFault,做一个回溯(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) 

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

祝你好运。

于 2010-04-08T17:32:58.163 回答
4

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

于 2010-04-08T17:01:29.553 回答