如何为Valgrind Massif设置检查点,仅监控main函数内的堆分配?
如何用Valgrind Massif设置检查点仅监控特定区域的堆内存分配
我刚接触Valgrind的massif工具,想设置检查点来开始监控堆内存分配。编译运行以下示例代码后,用valgrind --tool=massif --time-unit=B ./program分析,通过ms_print查看结果时发现标准库有72704字节的初始堆内存分配,但我只关心main函数内的内存分配,想知道有没有类似检查点的方式仅监控特定区域的分配?
示例代码:
#include <iostream> #include <cstdint> int main() { int nrOfElements= 10; uint32_t *a[nrOfElements]; for(int i=0; i<nrOfElements; i++) { a[i] = new uint32_t(i); } return 0; }
解决方案
Massif本身没有直接的"检查点"命令,但可以通过两种可靠方式实现只监控特定代码段的内存分配:
代码插桩手动控制监控开关
利用Massif提供的宏精准控制监控启停,跳过标准库初始化阶段的分配:- 包含Massif的头文件
valgrind/massif.h - 在代码中用
VALGRIND_MASSIF_STOP先关闭监控,跳过初始化;在需要监控的代码段前调用VALGRIND_MASSIF_START开启监控,结束后可再次关闭
修改后的代码:
#include <iostream> #include <cstdint> #include <valgrind/massif.h> int main() { // 关闭监控,跳过标准库初始化的内存分配 VALGRIND_MASSIF_STOP; int nrOfElements = 10; uint32_t *a[nrOfElements]; // 开启监控,仅记录后续代码的内存分配 VALGRIND_MASSIF_START; for(int i=0; i<nrOfElements; i++) { a[i] = new uint32_t(i); } // 可选:结束监控 VALGRIND_MASSIF_STOP; return 0; }运行命令保持不变:
valgrind --tool=massif --time-unit=B ./program,此时ms_print输出的结果只会包含VALGRIND_MASSIF_START与VALGRIND_MASSIF_STOP之间的内存分配。- 包含Massif的头文件
通过命令行选项过滤分配函数
如果你只想监控特定分配函数(比如自己代码里的operator new),可以用--alloc-fn指定要追踪的函数,用--ignore-fn忽略不需要的函数:valgrind --tool=massif --time-unit=B --alloc-fn=operator new ./program这种方式的局限性是可能会误包含标准库中调用同一分配函数的情况,不如代码插桩精准可控。
内容的提问来源于stack exchange,提问作者Chief
相关产品推荐
相关产品推荐

