有没有办法在C中调用new时获取堆栈跟踪?

我有一个长期运行的C程序,通常用gcc(g)编译.我使用valgrind来验证没有内存泄漏,所以我不是在寻找泄漏检测器.

但是,我关注的是临时缓冲区/对象上的内存碎片和不必要的新/删除对.

有没有办法记录所有对new的调用(即使它们发生在STL容器内),提供堆栈跟踪以便我可以在代码中查找它们?我尝试了mtrace,但这只适用于C – 它最终说当我查找负责的代码行时,所有分配都发生在全局新的分配器中.不知怎的,valgrind的memcheck几乎可以做我想要的,因为它显示了内存分配的堆栈跟踪.不幸的是,它们似乎只为分配而不匹配解除分配.

最佳答案
如果要跟踪有关分配的其他统计信息,您始终可以覆盖全局新/删除功能:

void* operator new (size_t size)
{
    void *pPtr = alloc_memory(size); /* perform the allocation here but don't use new! */

    if(pPtr == 0)
        throw std::bad_alloc();

    /* additional code here to do whatever sort of tracking you want */
    return pPtr;
}

void operator delete (void *pPtr)
{
    if(pPtr == 0)
        return; // legal to call delete on NULL pointers - don't pass NULL to free()

    /* additional code to do whatever tracking you want here */
    free(pPtr); 
}

至于获得回溯,那就是编译器和O / S依赖,并且没有标准的方法来实现它.由于您提到GCC,以下内容可能对您有用:

http://tombarta.wordpress.com/2008/08/01/c-stack-traces-with-gcc/

转载注明原文:有没有办法在C中调用new时获取堆栈跟踪? - 代码日志