堆分配的回溯统计信息——从哪里调用以及调用了多少次?

Backtrace statistics for heap allocations - where is it called from and how many times?

我需要知道在我的程序中的哪些地方调用了 malloc/new,并且对于每个这样不同的地方,调用了多少次.关于内存分配的 自上而下 函数调用分析。

有没有收集此类统计数据的工具? (malloc/new 主要通过 std::vector 成员函数调用。)

大多数 C++ 运行时的调试版本提供某种级别的调试挂钩来协助分配等。

一种更可定制的替代方法是编写您自己的 operator newoperator delete 等以提供您想要的功能(例如,接受文件、行和函数名称作为参数以及计数和日志记录内部完成)。将它们与预处理器 __FILE____LINE__ 等连接起来,并且为了方便起见,用一个宏来替代 newdelete(ATL/MFC 使用此技术)。

如果重点放在单个容器上,最好是简单地编写自己的分配器并用它创建 vector

std::vector<int, MyAllocator> my_vector;
// or...
using MyVector = std::vector<int, MyAllocator>;
MyVector my_vector;

替换 newdelete 的示例想法;

void* operator new(std::size_t count, int line, char const* file)
{
    auto p = ::malloc(count);
    std::printf("Allocate new @ %s:%d (%p)\n", file, line, p);
    return p;
}

void operator delete(void* pointer) noexcept
{
    std::printf("Deallocate pointer (%p)\n", pointer);
    ::free(pointer);
}

#define NEWIT new (__LINE__, __FILE__)
#define new NEWIT

int main()
{
    //auto p = new (__LINE__, __FILE__) int{};
    auto p = new int{};
    delete p;
}

Open|SpeedShop tool can make a memory trace analysis. The data it provides is described in User Manual,第96页。好像提供了调用路径和调用次数。
请注意,Open|SpeedShop 可能很难构建。 Here's 构建指南,注意您的 OS 的附加条件包列表。您需要构建 "CBTF" 版本才能启用内存跟踪分析。

我刚刚发现 Valgrind 完全可以满足我的需求。即,通过 Kcachegrind 或 Qcachegrind 中的 Callgrind 工具和可视化,它向我显示了调用图以及每条边的调用次数。希望这也会对其他人有所帮助。