使用 valgrind 的 Massif 工具监控线程的内存使用情况

使用 Massif 监控内存使用情况

  1. 运行程序并生成 Massif 输出文件:

    运行你的程序并使用 Massif 工具记录内存使用情况:

     sh 

    Copy code

    valgrind --tool=massif ./your_program

  2. 查看 Massif 输出文件:

    默认情况下,Massif 会将输出文件保存为 massif.out.<pid>。确保在查看输出之前,程序已经成功运行并生成了该文件。

    使用 ls 命令查看生成的文件:

     sh 

    Copy code

    ls massif.out.*

    确认文件存在后,使用 ms_print 查看输出:

     sh 

    Copy code

    ms_print massif.out.<pid>

    如果 massif.out.<pid> 文件不存在,可能是因为:

    • 程序运行中断,未生成文件
    • 文件路径不正确

示例流程

以下是一个完整的示例流程:

  1. 编译并运行程序:

    确保你的程序已经编译并可以运行。例如,假设你的程序名为 your_program

     sh 

    Copy code

    g++ -g -o your_program your_program.cpp

  2. 使用 Massif 运行程序:

     sh 

    Copy code

    valgrind --tool=massif ./your_program

  3. 查看生成的 Massif 文件:

    确认生成了 massif.out.<pid> 文件:

     sh 

    Copy code

    ls massif.out.*

    假设生成的文件为 massif.out.12345,查看输出:

     sh 

    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 输出文件,可以帮助你深入了解程序的内存分配和使用模式。如果有任何问题,可以通过上述步骤进行排查。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值