如何让 Valgrind 记录所有分配?
How to make Valgrind log all allocations?
即使没有发现内存错误,我也想让 Valgrind 记录分配。如何才能做到这一点?
您将为此使用 Massif(一个 valgrind 工具)。手册 link 很容易理解,但为了将来参考,下面是直接从手册中取出的使用方法:
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%)
即使没有发现内存错误,我也想让 Valgrind 记录分配。如何才能做到这一点?
您将为此使用 Massif(一个 valgrind 工具)。手册 link 很容易理解,但为了将来参考,下面是直接从手册中取出的使用方法:
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%)