什么是“ar_ptr = arena_for_chunk(p);”意思?

时间:2013-03-10 20:18:42

标签: c

我正在通过gdb运行程序。它运行“free(buffer);”然后我收到这条消息:      程序接收信号SIGSEGV,分段故障。

 0xb7e97103 in __GI___libc_free (mem=0xbffff11e) at malloc.c:2987
 2987     ar_ptr = arena_for_chunk(p);

该计划的下一行是“fclose(inptr);”我该如何开始解决这个问题?

2 个答案:

答案 0 :(得分:1)

您的变量buffer为null或指向无法释放(或已被释放)的内存。

答案 1 :(得分:1)

您问题的实际答案是ar_ptr = arena_for_chunk(p);是一个内部数据结构,用于确定应释放内存的位置。但是,你可以继续挖掘,如果你愿意,直到你找到为什么p几乎肯定是你传入的buffer或者与它密切相关的某些值是“不正确” - 但这将是一个有点像在街灯下找你丢失的钥匙,因为你可以在那里看得更清楚,而不是试图找到你丢弃它们的地方。

当标准库中的代码崩溃时,特别是每次运行任何普通程序时调用的代码,那么99.9%的时间是由“输入错误”引起的 - 去查看调用函数的代码,而不是在功能(虽然值得回顾一下出错导致问题导致哪个输入参数出错)。

实际问题是您的代码使用错误的参数调用free(),这会导致arena_for_chunk做错了 - 假设上面一行中的值mem = 0xbffff11e,我期望buffer实际上是堆栈上的值,不应该被释放。