我有一个代码库,在linux上运行的进程在免费崩溃,有时在malloc:
#0 0xffffe430 in __kernel_vsyscall ()
#1 0xf7424e30 in raise () from /lib/libc.so.6
#2 0xf7426765 in abort () from /lib/libc.so.6
#3 0xf7469d33 in malloc_printerr () from /lib/libc.so.6
#4 0xf746e7bc in free () from /lib/libc.so.6
#5 0xf6047e25 in myFree (mem_ptr=0x82165d8) at ../my_code/mylib.c:78
#6 0xf6014a10 in FreeBuffer (buffer=0x82042f8)
在代码中,我没有在发生内存释放的地方看到任何可疑的东西。 函数myFree()只有一个free()函数调用。
void FreeBuffer(struct MY_BUFFER *buffer)
{
if (buffer)
{
myFree(buffer);
}
}
void myFree(void *mem_ptr)
{
free(mem_ptr);
}
我尝试使用MALLOC_CHECK_,但它没有任何帮助。
我怀疑某些堆已经损坏并希望找到它。 在这种情况下是否有任何提示继续调试过程?
答案 0 :(得分:2)
很难100%肯定,但最有可能的是你试图释放记忆两次。在尝试释放指针之前检查指针是否为NULL非常棒
if (buffer)
{
myFree(buffer);
}
但你可能 NOT 在做完确的免费工作后设置指针NULL - 这是我的猜测。
检查您是否有类似这样的内容
struct MY_BUFFER *buffer;
//do something with buffer
FreeBuffer(buffer)
buffer = NULL;
你可以在FreeBuffer()
函数中执行此操作但是为了这样做,你必须将指针AKA指针的地址传递给指针,这样定义就像这样FreeBuffer(struct MY_BUFFER **buffer)