在C程序中找到崩溃的来源

时间:2013-12-09 12:00:39

标签: c malloc free

我有一个代码库,在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_,但它没有任何帮助。

我怀疑某些堆已经损坏并希望找到它。 在这种情况下是否有任何提示继续调试过程?

1 个答案:

答案 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)