searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

valgrind massif内存问题分析

2023-08-25 01:54:13
141
0

1. Massif简介

Massif是一个堆内存分析工具,用于测量程序使用的堆内存量。这包括有用空间和为了对齐补齐而分配的额外字节,它还可以测量程序的堆栈大小,默认是关闭的。Massif不仅告诉您程序使用的堆内存量,还提供非常详细的信息,指示哪些部分的程序负责分配堆内存。

2. 和Memcheck的差异和优势

使用--tool=memcheck --leak-check=full时,它可以检测到内存申请后已丢失的情况;但检测不到某些内存泄漏,这是因为内存实际上未丢失 - 仍然存在指针指向它 - 但它没有被使用,也没有释放。具有此类泄漏的程序可能会随时间不必要地增加其使用的内存量。Massif可以帮助识别这些泄漏

3. 常用命令选项

--heap=<yes|no> [默认值:yes] 指定是否进行堆分析。

--stacks=<yes|no> [默认值:no]
指定是否进行堆栈分析。此选项会大大降低Massif的速度,默认情况下关闭。

--pages-as-heap=<yes|no> [默认值:no]
告诉Massif以页面级别而不是malloc'd块级别对内存进行分析。

--depth= [默认值:30]
快照记录的分配树(调用栈)的最大深度。增加它将使Massif运行稍微慢一些,使用更多内存,并生成更大的输出文件。

--time-unit=<i|ms|B> [默认值:i]
用于分析的时间单位。有三种可能性:指令执行次数(i),适用于大多数情况;真实(挂钟)时间(ms,即毫秒),有时会有用;堆和/或栈上分配/释放的字节数(B),对于非常短暂的程序和测试目的很有用。

--detailed-freq= [默认值:10]
详细快照的频率。

--max-snapshots= [默认值:100]
记录的最大快照数。如果设置为N,除了非常短暂运行的程序外,最终的快照数量将在N/2和N之间。

--massif-out-file= [默认值:massif.out.%p]
将配置文件写入指定的文件中,而不是默认的输出文件massif.out.%p%q。

4. 使用

4.1 使用选项 -g, 编译要检测的程序,并安装valgrind

4.2  开始采样,程序执行会变慢,内存分析结果将写入文件,默认文件名为massif.out.pid

valgrind --tool=massif  ./a.out;

4.3 程序运行一段时间后,使用kill pid停止进程,不要使用kill -9会来不及生成分析文件

4.4 使用ms_print以易于阅读的形式查看 Massif 收集的信息,例如

ms_print massif.out.12345

5.  massif-visualizer图形化输出采样文件

需要具有桌面环境的 Linux,选用ubuntu作为分析环境

安装: 
apt install massif-visualizer
在终端中打开要分析的数据文件: 
# massif-visualizer massif.out.12345

6. 举个例子

#include <stdlib.h>

void func1(void){
    malloc(4000);
}
void func2(void){        
    malloc(2000);
    func1();
}
int main(void){  
    int i;
    int* a[10];
    for (i = 0; i < 10; i++) {
        a[i] = malloc(1000);
    }
    func2();
    func1();
    for (i = 0; i < 8; i++) {
        free(a[i]);
    }
    return 0;
}

编译: gcc -g testmassif.c -o prog

 

运行采样数据

valgrind --tool=massif ./prog

结果分析,看主要的一段数据,更多信息查看官网

  • 总共采样23次,在第9,14次后内存使用达到峰值
  • n 采样序号;time(i)默认指令执行次数;total 此时的总内存消耗; useful-heap此时分配的有用内存大小;extra-heap此时分配的额外堆字节数;stacks堆栈大小,默认关闭
  • 接下来是第9次快照的详细信息,分配内存大小,所占比例,以及调用栈

图形化输出结果

输出结果都比较直观,massif更适用内存申请之后,依然有指针指向,但也没释放的情景

0条评论
0 / 1000
Mr. 油
89文章数
0粉丝数
Mr. 油
89 文章 | 0 粉丝
原创

valgrind massif内存问题分析

2023-08-25 01:54:13
141
0

1. Massif简介

Massif是一个堆内存分析工具,用于测量程序使用的堆内存量。这包括有用空间和为了对齐补齐而分配的额外字节,它还可以测量程序的堆栈大小,默认是关闭的。Massif不仅告诉您程序使用的堆内存量,还提供非常详细的信息,指示哪些部分的程序负责分配堆内存。

2. 和Memcheck的差异和优势

使用--tool=memcheck --leak-check=full时,它可以检测到内存申请后已丢失的情况;但检测不到某些内存泄漏,这是因为内存实际上未丢失 - 仍然存在指针指向它 - 但它没有被使用,也没有释放。具有此类泄漏的程序可能会随时间不必要地增加其使用的内存量。Massif可以帮助识别这些泄漏

3. 常用命令选项

--heap=<yes|no> [默认值:yes] 指定是否进行堆分析。

--stacks=<yes|no> [默认值:no]
指定是否进行堆栈分析。此选项会大大降低Massif的速度,默认情况下关闭。

--pages-as-heap=<yes|no> [默认值:no]
告诉Massif以页面级别而不是malloc'd块级别对内存进行分析。

--depth= [默认值:30]
快照记录的分配树(调用栈)的最大深度。增加它将使Massif运行稍微慢一些,使用更多内存,并生成更大的输出文件。

--time-unit=<i|ms|B> [默认值:i]
用于分析的时间单位。有三种可能性:指令执行次数(i),适用于大多数情况;真实(挂钟)时间(ms,即毫秒),有时会有用;堆和/或栈上分配/释放的字节数(B),对于非常短暂的程序和测试目的很有用。

--detailed-freq= [默认值:10]
详细快照的频率。

--max-snapshots= [默认值:100]
记录的最大快照数。如果设置为N,除了非常短暂运行的程序外,最终的快照数量将在N/2和N之间。

--massif-out-file= [默认值:massif.out.%p]
将配置文件写入指定的文件中,而不是默认的输出文件massif.out.%p%q。

4. 使用

4.1 使用选项 -g, 编译要检测的程序,并安装valgrind

4.2  开始采样,程序执行会变慢,内存分析结果将写入文件,默认文件名为massif.out.pid

valgrind --tool=massif  ./a.out;

4.3 程序运行一段时间后,使用kill pid停止进程,不要使用kill -9会来不及生成分析文件

4.4 使用ms_print以易于阅读的形式查看 Massif 收集的信息,例如

ms_print massif.out.12345

5.  massif-visualizer图形化输出采样文件

需要具有桌面环境的 Linux,选用ubuntu作为分析环境

安装: 
apt install massif-visualizer
在终端中打开要分析的数据文件: 
# massif-visualizer massif.out.12345

6. 举个例子

#include <stdlib.h>

void func1(void){
    malloc(4000);
}
void func2(void){        
    malloc(2000);
    func1();
}
int main(void){  
    int i;
    int* a[10];
    for (i = 0; i < 10; i++) {
        a[i] = malloc(1000);
    }
    func2();
    func1();
    for (i = 0; i < 8; i++) {
        free(a[i]);
    }
    return 0;
}

编译: gcc -g testmassif.c -o prog

 

运行采样数据

valgrind --tool=massif ./prog

结果分析,看主要的一段数据,更多信息查看官网

  • 总共采样23次,在第9,14次后内存使用达到峰值
  • n 采样序号;time(i)默认指令执行次数;total 此时的总内存消耗; useful-heap此时分配的有用内存大小;extra-heap此时分配的额外堆字节数;stacks堆栈大小,默认关闭
  • 接下来是第9次快照的详细信息,分配内存大小,所占比例,以及调用栈

图形化输出结果

输出结果都比较直观,massif更适用内存申请之后,依然有指针指向,但也没释放的情景

文章来自个人专栏
存储专栏
89 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0