我正在尝试使用 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)
如何去掉 ? ()
并得到更精确的解?谢谢。
最佳答案
首先,在此处获取完整的堆栈跟踪可能对您没有帮助:任何 free
实现中的崩溃都是由于堆损坏造成的。这里我们有 GLIBC 已经检测到并在控制台上告诉您的堆损坏。
了解损坏 block 的位置 free
d 通常无助于找到 block 损坏的位置;为此使用专门的工具,如 Valgrind 或 AddressSanitizer。
其次,您没有获得文件/行信息,因为崩溃发生在 libc.so.6
中,并且您没有为它安装 debuginfo 符号。如何安装 debuginfo 取决于您没有告诉我们的 Linux 发行版。
最后,您的地址与任何符号都不对应的“明显损坏”堆栈的原因很可能是调用来自手工编码的汇编代码(来自 libopenssl.a
),它不使用帧指针并且没有正确的展开描述符。 GDB 需要其中之一来生成正确的堆栈跟踪。
关于c - 使用 GDB 在 "?? ()"中出现内存故障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30187264/