堆分配的回溯统计信息——从哪里调用以及调用了多少次?
Backtrace statistics for heap allocations - where is it called from and how many times?
我需要知道在我的程序中的哪些地方调用了 malloc
/new
,并且对于每个这样不同的地方,调用了多少次.关于内存分配的 自上而下 函数调用分析。
有没有收集此类统计数据的工具? (malloc
/new
主要通过 std::vector
成员函数调用。)
大多数 C++ 运行时的调试版本提供某种级别的调试挂钩来协助分配等。
一种更可定制的替代方法是编写您自己的 operator new
和 operator delete
等以提供您想要的功能(例如,接受文件、行和函数名称作为参数以及计数和日志记录内部完成)。将它们与预处理器 __FILE__
、__LINE__
等连接起来,并且为了方便起见,用一个宏来替代 new
和 delete
(ATL/MFC 使用此技术)。
如果重点放在单个容器上,最好是简单地编写自己的分配器并用它创建 vector
。
std::vector<int, MyAllocator> my_vector;
// or...
using MyVector = std::vector<int, MyAllocator>;
MyVector my_vector;
替换 new
和 delete
的示例想法;
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 工具和可视化,它向我显示了调用图以及每条边的调用次数。希望这也会对其他人有所帮助。
我需要知道在我的程序中的哪些地方调用了 malloc
/new
,并且对于每个这样不同的地方,调用了多少次.关于内存分配的 自上而下 函数调用分析。
有没有收集此类统计数据的工具? (malloc
/new
主要通过 std::vector
成员函数调用。)
大多数 C++ 运行时的调试版本提供某种级别的调试挂钩来协助分配等。
一种更可定制的替代方法是编写您自己的 operator new
和 operator delete
等以提供您想要的功能(例如,接受文件、行和函数名称作为参数以及计数和日志记录内部完成)。将它们与预处理器 __FILE__
、__LINE__
等连接起来,并且为了方便起见,用一个宏来替代 new
和 delete
(ATL/MFC 使用此技术)。
如果重点放在单个容器上,最好是简单地编写自己的分配器并用它创建 vector
。
std::vector<int, MyAllocator> my_vector;
// or...
using MyVector = std::vector<int, MyAllocator>;
MyVector my_vector;
替换 new
和 delete
的示例想法;
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 工具和可视化,它向我显示了调用图以及每条边的调用次数。希望这也会对其他人有所帮助。