[英]Memory failure in “?? ()” using 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已在控制台上检测到并告知您有关堆损坏的信息。
知道损坏的块在哪里被free
d通常无助于找到该块在哪里被破坏; 为此使用诸如Valgrind或AddressSanitizer之类的专用工具。
其次,由于崩溃发生在libc.so.6
内部,并且没有为其安装debuginfo符号,因此您没有获得文件/行信息。 如何安装debuginfo取决于您尚未告知我们的Linux发行版。
最后,您的地址“明显损坏”的堆栈与任何符号都不对应的原因很可能是调用来自手工编码的汇编代码(来自libopenssl.a
),该代码不使用框架指针和没有正确的展开描述符。 GDB需要一个或另一个来生成正确的堆栈跟踪。
使用-g -O0
标志编译您的项目。 如果没有-g标志,则gcc编译器会删除所有符号,这就是为什么您看不到任何符号的原因。 如果要调试第三方库,则应使用--with-debug
或其他调试选项对其进行配置。
是的,看来您的堆栈已损坏。 我要解决的方法是在类似valgrind的内存分析器下运行程序。 注意双重释放,越界写入数组和条件跳转。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.