【问题标题】:Very strange Segmentation fault analysis in GDBGDB中非常奇怪的Segmentation fault分析
【发布时间】:2012-08-12 03:10:08
【问题描述】:

我用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

我不知道发生了什么,为什么堆栈上的地址不包括__kernel_vsyscall 如此连线而不是映射到符号。

我需要做什么才能找到问题,调试该问题的内存转储。

感谢您的帮助!

【问题讨论】:

  • 编译时是否启用了 GDB 符号导出? gcc -g &lt;files&gt;g++ -g &lt;files&gt; Helpful Link

标签: c++ gdb stack segmentation-fault


【解决方案1】:

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

如果您想查看所有函数是什么,甚至是库函数中的函数(例如标准库函数),您还需要获取带有调试符号的库版本。

【讨论】:

  • 符号应用于 selectserver 可执行文件,但是当 gdb 使用其他格式的参数启动时 --symbols 参数不读取此数据,一切正常。
  • @DirkHolsopple -- 你错了,用-g 编译是不需要获得有意义的堆栈跟踪符号名称。
【解决方案2】:

启动gdb --core=core.668 selectserver 已修复问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多