使用 Massif 监控内存使用情况
-
运行程序并生成 Massif 输出文件:
运行你的程序并使用 Massif 工具记录内存使用情况:
shCopy code
valgrind --tool=massif ./your_program
-
查看 Massif 输出文件:
默认情况下,Massif 会将输出文件保存为
massif.out.<pid>
。确保在查看输出之前,程序已经成功运行并生成了该文件。使用
shls
命令查看生成的文件:Copy code
ls massif.out.*
确认文件存在后,使用
shms_print
查看输出:Copy code
ms_print massif.out.<pid>
如果
massif.out.<pid>
文件不存在,可能是因为:- 程序运行中断,未生成文件
- 文件路径不正确
示例流程
以下是一个完整的示例流程:
-
编译并运行程序:
确保你的程序已经编译并可以运行。例如,假设你的程序名为
shyour_program
:Copy code
g++ -g -o your_program your_program.cpp
-
使用 Massif 运行程序:
shCopy code
valgrind --tool=massif ./your_program
-
查看生成的 Massif 文件:
确认生成了
shmassif.out.<pid>
文件:Copy code
ls massif.out.*
假设生成的文件为
shmassif.out.12345
,查看输出:Copy code
ms_print massif.out.12345
处理错误
如果 ms_print
提示无法打开文件,请确保以下几点:
- 文件路径正确: 确认当前目录下有正确的 Massif 输出文件。
- 文件权限: 确保你有权限读取该文件。
- 正确生成文件: 确认程序运行期间没有错误中断,成功生成 Massif 文件。
示例程序和 Massif 输出
假设我们有一个简单的 C++ 程序:
cpp
Copy code
#include <iostream> #include <vector> #include <thread> #include <chrono> void memory_consuming_function() { std::vector<int> v(1000000, 42); std::this_thread::sleep_for(std::chrono::seconds(2)); } int main() { std::thread t1(memory_consuming_function); std::thread t2(memory_consuming_function); t1.join(); t2.join(); return 0; }
编译并运行程序,并使用 Massif:
sh
Copy code
g++ -g -o memory_test memory_test.cpp -pthread valgrind --tool=massif ./memory_test
查看生成的 Massif 输出文件:
sh
Copy code
ls massif.out.* ms_print massif.out.<pid>
输出报告含义
Massif 输出报告的典型部分如下:
bash
Copy code
-------------------------------------------------------------------------------- Command: ./memory_test Massif arguments: --tool=massif ms_print arguments: massif.out.12345 -------------------------------------------------------------------------------- MB 5.725^# | @### | @ @# | @ @ #@ @ @ @ @ @ | @ @ @##@ @ @@@ @@@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ | @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ | @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ | @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ | @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ | @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ 0 +----------------------------------------------------------------------->Gi 0 time Number of snapshots: 34 Detailed snapshots: [0, 1, 2, 3, 6, 10, 12, 13, 14, 15, 17, 18, 20, 22, 23, 26, 27, 28, 29, 31, 32, 33]
输出报告说明
- Snapshots: 不同时间点的内存快照。
- MB: 使用内存的大小,以 MB 为单位。
- 时间轴: 程序运行时的时间轴。
Massif 详细的快照部分:
markdown
Copy code
-------------------------------------------------------------------------------- Snapshot 0: at 0.0 MiB ... -------------------------------------------------------------------------------- Snapshot 1: at 1.0 MiB ... -------------------------------------------------------------------------------- Snapshot 2: at 2.0 MiB ...
- 每个快照: 显示程序在不同时间点的内存使用情况。
总结
通过 Massif 工具,能够详细地分析程序的内存使用情况。确保正确生成和查看 Massif 输出文件,可以帮助你深入了解程序的内存分配和使用模式。如果有任何问题,可以通过上述步骤进行排查。