如何用Valgrind Massif追踪特定函数的内存分配
如何用Valgrind Massif仅查看特定函数的内存分配
有两种实用方法可以实现需求,具体如下:
方法一:运行Massif时直接指定跟踪目标函数
使用Massif的--alloc-fn选项,让工具只记录由指定函数发起的内存分配操作。命令格式如下:
valgrind --tool=massif --alloc-fn=目标函数名 ./你的程序
- 示例:如果要跟踪自定义函数
process_data的内存分配,命令就是valgrind --tool=massif --alloc-fn=process_data ./my_app - 注意:如果跟踪的是标准库函数(比如
malloc),直接写函数名即可;如果是C++类成员函数,需要注意名字修饰问题,可先用c++filt解析编译后的函数名再填入。
方法二:生成完整报告后过滤目标函数
如果已经生成了完整的Massif输出文件(默认名为massif.out.<PID>),可以用ms_print工具结合文本过滤命令提取目标函数的相关记录:
- 先生成可读报告并过滤:
ms_print massif.out.12345 | grep -A 10 -B 5 "目标函数名"
其中-A 10表示显示匹配行后10行,-B 5表示显示匹配行前5行,可根据需要调整行数。
2. 针对C++修饰后的函数名,先解析再过滤:
ms_print massif.out.12345 | c++filt | grep -A 10 -B 5 "MyClass::myFunction"
关键注意事项
- 编译程序时必须添加
-g调试选项,否则Massif无法识别函数名,只能显示内存地址,无法进行精准过滤。 - 如果目标函数是通过函数指针调用的,
--alloc-fn可能无法跟踪到,此时建议用方法二结合调用栈信息过滤。
内容的提问来源于stack exchange,提问作者Trams
相关产品推荐
相关产品推荐

