c - 使用 GDB 在 "?? ()"中出现内存故障

标签 c debugging gcc segmentation-fault gdb

我正在尝试使用 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 的位置 freed 通常无助于找到 block 损坏的位置;为此使用专门的工具,如 Valgrind 或 AddressSanitizer。

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

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

关于c - 使用 GDB 在 "?? ()"中出现内存故障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30187264/

相关文章:

c - 在 C 中创建良好的 IF 语句时遇到问题

c - 为什么与 bool 的比较在 C11 中不转换为 bool?

C编程递归

c++ - 将OpenCV图像格式改为matlab格式,调试断言__acrt_first_block == header

c++ - 解释 valgrind 错误

c++ - 自动跳过/忽略 gdb 中的外部代码

c - 较高的波特率在 STM32F0Discovery 板上不起作用

debugging - "!heap -flt -s xxxx"windbg命令中的不同列代表什么

Linux X-Loader 起始地址位于 config.mk 中而不是链接描述文件中

c - 来自 .a 的目标文件不包含在 .so 中