我使用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 ?? ()
...
我发现数组超出界限我解决了。但我仍然对上述现象感到困惑。
答案 0 :(得分:1)
0x0000048d0000048c
这看起来像是通过函数指针调用了一个函数,但是该指针已被两个整数覆盖:0x48d == 1165
和0x48c == 1164
(这些值看起来像你的程序正在使用的东西?)。
您应该使用bt
告诉您如何到达那里。
您应该使用Valgrind或Address Sanitizer来检查未初始化或悬空的内存和缓冲区溢出(这是最终使用无效函数指针的一些常用方法)。
<强>更新强>
现在您显示了堆栈跟踪,几乎100%保证您有一些本地的整数数组,它们已经溢出(用1129,1130,1111等值填充它),从而破坏堆栈
地址Sanitizer(可在最新版本的GCC中找到)应该直接指出错误的位置。
答案 1 :(得分:0)
这意味着您的程序在gdb未知的函数中崩溃(函数不是由符号表提供) 按给定的顺序尝试这两个选项:
file "binary_with_symbol_table"
手动将符号表提供给gdb,它将为您提供错误的功能和地址。请注意,分段错误背后可能隐藏了许多异常。