Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C “?”中的内存故障;??()";使用GDB_C_Debugging_Gcc_Segmentation Fault_Gdb - Fatal编程技术网

C “?”中的内存故障;??()";使用GDB

C “?”中的内存故障;??()";使用GDB,c,debugging,gcc,segmentation-fault,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 0x007e5

我正试图使用
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)

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

使用
-g-O0
标志编译您的项目。如果没有-g标志,gcc编译器将去掉所有符号,这就是您无法看到任何符号的原因。如果您想要调试第三方库,那么您应该使用
--debug
或其他调试选项对其进行配置

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

知道损坏的块在哪里被
释放
d通常无助于发现块在哪里被损坏;为此,请使用Valgrind或AddressSanitizer等专用工具

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


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

是的,看起来您的堆栈已损坏。我的方法是在valgrind这样的内存分析器下运行程序。注意双重空闲、写入数组越界和条件跳转。

这看起来像是堆栈损坏。(0x0000009之类的地址不应该在您的调用堆栈上。)我正在使用
-g-O0
编译它。它仍然给了我
??()
这不是符号问题;看看堆栈跟踪中的地址值!(稍后)使用gdb的最佳参数是“-ggdb”,那么max info将保存在可执行文件中。此参数必须在编译步骤和链接步骤上