如何使Valgrind记录所有分配

How to make Valgrind log all allocations?

本文关键字:分配 记录 何使 Valgrind      更新时间:2023-10-16

我想让Valgrind记录分配,即使没有发现内存错误。如何做到这一点?

您可以使用Massif(一个valgrind工具)。手册链接很容易理解,但为了将来参考,这里是如何使用它,直接从手册:

valgrind --tool=massif prog

这将生成一个您可以使用ms_print分析的文件。文件名为massif.out.<numbers>。只需使用ms_print即可获得良好的输出:

ms_print massif.out.12345

您要查找的内容可以在ms_print输出的末尾找到。对于这个示例程序(手册中显示的程序):

#include <stdlib.h>
void g(void)
{
    malloc(4000);
}
void f(void)
{
    malloc(2000);
        g();
}
int main(void)
{
    int i;
    int* a[10];
    for (i = 0; i < 10; i++) {
        a[i] = malloc(1000);
    }
    f();
    g();
    for (i = 0; i < 10; i++) {
        free(a[i]);
    }
    return 0;
}

我们可以看到谁分配了什么:

->79.81% (8,000B) 0x400589: g (in /home/filipe/dev/a.out)
| ->39.90% (4,000B) 0x40059E: f (in /home/filipe/dev/a.out)
| | ->39.90% (4,000B) 0x4005D7: main (in /home/filipe/dev/a.out)
| |   
| ->39.90% (4,000B) 0x4005DC: main (in /home/filipe/dev/a.out)
|   
->19.95% (2,000B) 0x400599: f (in /home/filipe/dev/a.out)
| ->19.95% (2,000B) 0x4005D7: main (in /home/filipe/dev/a.out)
|   
->00.00% (0B) in 1+ places, all below ms_print's threshold (01.00%)