gdb程序核心:没有得到具体的bug

时间:2016-04-18 16:02:58

标签: gdb

我使用gdb命令如下本地化分段错误,但它显示??所以我很困惑。这是什么意思?如何避免呢?

$ gdb program core
...
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x0000048d0000048c in ?? ()
(gdb) bt
#0  0x0000046a00000469 in ?? ()
#1  0x0000046c0000046b in ?? ()
#2  0x0000046e0000046d in ?? ()
#3  0x000004700000046f in ?? ()
#4  0x0000047300000472 in ?? ()
#5  0x0000047600000475 in ?? ()
#6  0x0000047800000477 in ?? ()
#7  0x0000047a00000479 in ?? ()
#8  0x0000047d0000047b in ?? ()
...

我发现数组超出界限我解决了。但我仍然对上述现象感到困惑。

2 个答案:

答案 0 :(得分:1)

  

0x0000048d0000048c

这看起来像是通过函数指针调用了一个函数,但是该指针已被两个整数覆盖:0x48d == 11650x48c == 1164(这些值看起来像你的程序正在使用的东西?)。

您应该使用bt告诉您如何到达那里。

您应该使用Valgrind或Address Sanitizer来检查未初始化或悬空的内存和缓冲区溢出(这是最终使用无效函数指针的一些常用方法)。

<强>更新

现在您显示了堆栈跟踪,几乎100%保证您有一些本地的整数数组,它们已经溢出(用1129,1130,1111等值填充它),从而破坏堆栈

地址Sanitizer(可在最新版本的GCC中找到)应该直接指出错误的位置。

答案 1 :(得分:0)

这意味着您的程序在gdb未知的函数中崩溃(函数不是由符号表提供) 按给定的顺序尝试这两个选项:

  1. 如果您正在调试目标,请确保使用gcc时使用选项-g编译所有代码层。
  2. 您可以使用命令file "binary_with_symbol_table"手动将符号表提供给gdb,它将为您提供错误的功能和地址。
  3. 请注意,分段错误背后可能隐藏了许多异常。