使用 GDB 时出现“?? ()”内存故障

Ran*_*ser 2 c debugging gcc gdb segmentation-fault

我正在尝试使用跟踪我的分段错误gdb,但无法找到发生错误的确切行。

(gdb) backtrace
#0  0x00110402 in __kernel_vsyscall ()
#1  0x007a5690 in raise () from /lib/libc.so.6
#2  0x007a6f91 in abort () from /lib/libc.so.6
#3  0x007dd9eb in __libc_message () from /lib/libc.so.6
#4  0x007e59aa in _int_free () from /lib/libc.so.6
#5  0x007e90f0 in free () from /lib/libc.so.6
#6  0x080dc4e7 in CRYPTO_free ()
#7  0x08c36668 in ?? ()
#8  0x08c44bac in ?? ()
#9  0x08100168 in BN_free ()
#10 0x00000009 in ?? ()
#11 0x08c44ba8 in ?? ()
#12 0x08108c07 in BN_MONT_CTX_free ()
#13 0xffffffff in ?? ()
#14 0x08c36630 in ?? ()
#15 0x08112697 in RSA_eay_finish ()
#16 0x08c4c110 in ?? ()
#17 0x08c36630 in ?? ()
#18 0x081150af in RSA_free ()
#19 0xffffffff in ?? ()
#20 0x00000009 in ?? ()
#21 0x0821870d in ?? ()
#22 0x000000dd in ?? ()
#23 0x08c4c110 in ?? ()
#24 0x08c35e98 in ?? ()
#25 0x08136893 in EVP_PKEY_free ()
#26 0xffffffff in ?? ()
#27 0x0000000a in ?? ()
#28 0x08226017 in ?? ()
#29 0x00000189 in ?? ()
#30 0x007e90f0 in free () from /lib/libc.so.6
#31 0x00000000 in ?? ()
(gdb)
Run Code Online (Sandbox Code Playgroud)

我如何摆脱?? ()并获得更精确的解决方案?谢谢。

Emp*_*ian 5

首先,在这里获取完整的堆栈跟踪可能对您没有帮助:实现内部的任何崩溃free都是由于堆损坏造成的。这里我们有堆损坏,GLIBC 已经检测到并在控制台上告诉您。

知道损坏的块在哪里free通常无助于找到损坏的块的位置;为此,请使用 Valgrind 或 AddressSanitizer 等专用工具。

其次,您没有获取文件/行信息,因为崩溃发生在内部libc.so.6,并且您尚未为其安装 debuginfo 符号。如何安装 debuginfo 取决于您的 Linux 发行版,您没有告诉我们这一点。

最后,您有一个“明显损坏”的堆栈,其地址与任何符号都不对应的原因可能是调用来自手工编码的汇编代码(来自libopenssl.a),它不使用帧指针,也不使用帧指针。有正确的展开描述符。GDB 需要其中之一来生成正确的堆栈跟踪。