堆分配的Backtrace统计信息 - 从哪里调用和多少次?

时间:2016-05-13 09:03:50

标签: c++ c statistics malloc new-operator

我需要知道我的计划中的哪个地方是malloc / new,并且对于每个这样一个不同的地方,多少次。作为关于内存分配的自上而下函数调用分析。

是否有任何工具可以收集此类统计信息? (malloc / new主要通过std::vector成员函数调用。)

3 个答案:

答案 0 :(得分:2)

大多数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;
}

答案 1 :(得分:2)

我刚刚发现Valgrind完全符合我的需要。也就是说,使用Kcachegrind或Qcachegrind中的Callgrind工具和可视化,它向我显示了每个边缘调用次数的调用图。希望这对其他人也有帮助。

答案 2 :(得分:0)

Open|SpeedShop工具可以进行内存跟踪分析。它提供的数据在User Manual,第96页中描述。它似乎提供了呼叫路径和呼叫数。
请注意,Open | SpeedShop可能很难构建。 Here's构建指南,请注意您的操作系统的必备软件包列表。你需要建立&#34; CBTF&#34;版本以启用内存跟踪分析。