我正在通过 gdb 运行一个程序。它运行“free(buffer);”行 然后我收到此消息:程序收到信号 SIGSEGV,分段错误。
0xb7e97103 in __GI___libc_free (mem=0xbffff11e) at malloc.c:2987
2987 ar_ptr = arena_for_chunk(p);
程序中的下一行是“fclose(inptr);” 我该如何开始解决这个问题?
我正在通过 gdb 运行一个程序。它运行“free(buffer);”行 然后我收到此消息:程序收到信号 SIGSEGV,分段错误。
0xb7e97103 in __GI___libc_free (mem=0xbffff11e) at malloc.c:2987
2987 ar_ptr = arena_for_chunk(p);
程序中的下一行是“fclose(inptr);” 我该如何开始解决这个问题?
您的变量buffer
为 null 或指向无法释放(或已被释放)的内存。
您的问题的实际答案是,它ar_ptr = arena_for_chunk(p);
是一个内部数据结构,它确定应该将内存释放到哪里。但是,如果你愿意,你可以继续在那里挖掘,直到你找到为什么p
几乎可以肯定是buffer
你传入的或者与它密切相关的某个值是“不正确的”——但这有点像在路灯下寻找你掉下来的钥匙因为你可以在那里看得更清楚,而不是试图在你丢弃它们的地方找到它们。
当标准库中的代码崩溃时,尤其是每次运行任何琐碎程序时都会调用的代码,那么 99.9% 的时间是由“错误输入”引起的——去查看调用函数的代码,而不是函数内部(尽管值得回顾一下出了什么问题,以确定是哪个输入参数导致了问题)。
实际的问题是您的代码free()
使用错误的参数进行调用,这使得arena_for_chunk
做错事 - 鉴于mem = 0xbffff11e
上面一行中的值,我希望这buffer
实际上是堆栈上的一个值,不应该被释放。