C++ GDB中非常奇怪的分段故障分析

C++ GDB中非常奇怪的分段故障分析,c++,gdb,stack,segmentation-fault,C++,Gdb,Stack,Segmentation Fault,我有一个用C++编写的应用程序(服务器),它在几个小时内就崩溃了,看起来可能是随机的 最糟糕的是,我试图使用gdb调试任何core文件,结果如下: gdb --core=core.668 --symbols=selectserver GNU gdb 6.8 Copyright (C) 2008 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/

我有一个用
C++
编写的应用程序(服务器),它在几个小时内就崩溃了,看起来可能是随机的

最糟糕的是,我试图使用
gdb
调试任何
core
文件,结果如下:

gdb --core=core.668 --symbols=selectserver
GNU gdb 6.8
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-pc-linux-gnu"...
Core was generated by `./selectserver'.
Program terminated with signal 11, Segmentation fault.
[New process 672]
[New process 671]
[New process 670]
[New process 669]
[New process 668]
#0  0xb7866896 in ?? ()
(gdb) info threads
  5 process 668  0xffffe410 in __kernel_vsyscall ()
  4 process 669  0xffffe410 in __kernel_vsyscall ()
  3 process 670  0xffffe410 in __kernel_vsyscall ()
  2 process 671  0xffffe410 in __kernel_vsyscall ()
* 1 process 672  0xb7866896 in ?? ()
(gdb) bt
#0  0xb7866896 in ?? ()
#1  0x082da4b0 in ?? ()
#2  0xb79e4252 in ?? ()
#3  0xa2ba9014 in ?? ()
#4  0x0825e14c in ?? ()
#5  0x082da4b0 in ?? ()
#6  0xb56175e8 in ?? ()
#7  0x00000080 in ?? ()
#8  0xb5fe723f in ?? ()
#9  0xa2ba9014 in ?? ()
#10 0xa2ba9008 in ?? ()
#11 0xb7a32ff4 in ?? ()
#12 0x00000000 in ?? ()
(gdb) thread 2
[Switching to thread 2 (process 671)]#0  0xffffe410 in __kernel_vsyscall ()
(gdb) bt
#0  0xffffe410 in __kernel_vsyscall ()
#1  0xb7889486 in ?? ()
#2  0x00000000 in ?? ()
(gdb) thread 3
[Switching to thread 3 (process 670)]#0  0xffffe410 in __kernel_vsyscall ()
(gdb) bt
#0  0xffffe410 in __kernel_vsyscall ()
#1  0xb7889486 in ?? ()
#2  0x00000000 in ?? ()
(gdb) thread 4
[Switching to thread 4 (process 669)]#0  0xffffe410 in __kernel_vsyscall ()
(gdb) bt
#0  0xffffe410 in __kernel_vsyscall ()
#1  0xb7889486 in ?? ()
#2  0x00000000 in ?? ()
(gdb) thread 5
[Switching to thread 5 (process 668)]#0  0xffffe410 in __kernel_vsyscall ()
(gdb) bt
#0  0xffffe410 in __kernel_vsyscall ()
#1  0xb78b7de1 in ?? ()
#2  0x00000032 in ?? ()
#3  0xbf849ae8 in ?? ()
#4  0xbf8499e8 in ?? ()
#5  0x00000000 in ?? ()
(gdb) quit
gdb--core=core.668--symbols=selectserver
GNU gdb 6.8
版权所有(C)2008免费软件基金会。
许可证GPLv3+:GNU GPL版本3或更高版本
这是自由软件:您可以自由更改和重新发布它。
在法律允许的范围内,不存在任何担保。键入“显示复制”
和“显示保修”了解详细信息。
此GDB配置为“i686 pc linux gnu”。。。
核心由“./selectserver”生成。
程序以信号11终止,分段故障。
[新流程672]
[新流程671]
[新流程670]
[新流程669]
[新工艺668]
#0 0xb7866896英寸??()
(gdb)信息线程
5在内核vsyscall()中处理668 0xFFFFFF410
4在内核vsyscall()中处理669 0xFFFFFF410
3在内核vsyscall()中处理670 0xFFFFFF410
2在内核vsyscall()中处理671 0xFFFFFF410
*1工艺672 0xb7866896英寸??()
(gdb)英国电信
#0 0xb7866896英寸??()
#1 0x082da4b0英寸??()
#2 0xb79e4252英寸??()
#3 0xa2ba9014英寸??()
#4 0x0825e14c英寸??()
#5 0x082da4b0英寸??()
#6 0xb56175e8英寸??()
#7 0x00000080英寸??()
#8 0xb5fe723f英寸??()
#9 0xa2ba9014英寸??()
#10 0xa2ba9008英寸??()
#11 0xB7A32F4英寸??()
#12 0x00000000英寸??()
(gdb)螺纹2
[切换到线程2(进程671)]0 0xFFFFFFFE410在uu内核_vsyscall()中
(gdb)英国电信
#内核vsyscall()中的0 0xFFFFFF410
#1 0xb7889486英寸??()
#2 0x00000000英寸??()
(gdb)螺纹3
[切换到线程3(进程670)]#0 0xFFFFFFE410在_内核_vsyscall()中
(gdb)英国电信
#内核vsyscall()中的0 0xFFFFFF410
#1 0xb7889486英寸??()
#2 0x00000000英寸??()
(gdb)螺纹4
[切换到线程4(进程669)]uuu kernel_vsyscall()中的0 0xfffffe410
(gdb)英国电信
#内核vsyscall()中的0 0xFFFFFF410
#1 0xb7889486英寸??()
#2 0x00000000英寸??()
(gdb)螺纹5
[切换到线程5(进程668)]#0 0xFFFFFFE410在_内核_vsyscall()中
(gdb)英国电信
#内核vsyscall()中的0 0xFFFFFF410
#1 0xb78b7de1英寸??()
#2 0x00000032英寸??()
#3 0xbf849ae8英寸??()
#4 0xbf8499e8英寸??()
#5 0x00000000英寸??()
(gdb)退出
我不知道发生了什么,为什么堆栈上的地址(不包括
\uuu kernel\u vsyscall
的地址)是如此连接而不是映射到符号

我需要做什么来发现问题,调试该问题的内存转储


谢谢你的帮助

您需要使用调试符号编译程序,或者使用调试符号获取单独的文件。将-g标志传递给gcc以启用这些功能


如果您想查看所有函数都是什么,即使是库函数(例如,标准库函数)中的函数,也需要获得一个带有调试符号的库版本。

启动
gdb--core=core.668选择server
修复问题。

编译时是否启用了gdb符号导出
gcc-g
g++-g
符号应用于selectserver可执行文件,但--symbols参数不读取此数据当gdb使用其他格式的参数启动时,一切正常。@DirkHolsopple--您完全错了,无需使用
-g
编译即可获得有意义的堆栈跟踪符号名称。