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

标签 c++ memory-management gcc valgrind

我有一个长时间运行的 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++ - 有没有办法在 C++ 中调用 new 时获取堆栈跟踪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11057207/

相关文章:

c - 为什么我可以读取 3 个结构,但只分配 2 个?

memory-management - 一种具有垃圾收集和手动内存管理功能的编程语言

c++ - 如何在 Windows 上解析由 std::put_time ("%x") 创建的字符串?

c++ - 使用常量参数连接插槽

c++ - 如何从 text.doc 计算数字的总和和平均值

C Simple List add Elements in a for-loop 不会工作,手动工作

c - pragma omp for 没有性能

c++ - 从内存中加载动态库

c++ - x264项目编译

c++ - 同一模板的不同类类型相互交互