通过valgrind中的示例代码,显示了记忆泄漏情况,我不明白两件事:
breakme()
的需要是什么,没有
声明?当什么都不做的时候,它的目的是什么?#include <stdio.h>
#include <stdlib.h>
#include "../memcheck.h"
#include "leak.h"
char *b10;
char *b21;
char *b32_33[2];
static void breakme() {};
void f(void)
{
int i;
b10 = malloc (10);
fprintf(stderr, "expecting details 10 bytes reachable\n"); fflush(stderr); breakme();
VALGRIND_DO_LEAK_CHECK;
fprintf(stderr, "expecting to have NO details\n"); fflush(stderr); breakme();
VALGRIND_DO_ADDED_LEAK_CHECK;
b10--; // lose b10
b21 = malloc (21);
fprintf(stderr, "expecting details +10 bytes lost, +21 bytes reachable\n"); fflush(stderr); breakme();
VALGRIND_DO_ADDED_LEAK_CHECK;
for (i = 0; i < 2; i ++)
b32_33[i] = malloc (32+i);
fprintf(stderr, "expecting details +65 bytes reachable\n"); fflush(stderr); breakme();
VALGRIND_DO_ADDED_LEAK_CHECK;
fprintf(stderr, "expecting to have NO details\n"); fflush(stderr); breakme();
VALGRIND_DO_ADDED_LEAK_CHECK;
b10++;
fprintf(stderr, "expecting details +10 bytes reachable\n"); fflush(stderr); breakme();
VALGRIND_DO_ADDED_LEAK_CHECK;
b10--;
fprintf(stderr, "expecting details -10 bytes reachable, +10 bytes lost\n"); fflush(stderr); breakme();
VALGRIND_DO_CHANGED_LEAK_CHECK;
b10++;
fprintf(stderr, "expecting details -10 bytes lost, +10 bytes reachable\n"); fflush(stderr); breakme();
VALGRIND_DO_CHANGED_LEAK_CHECK;
b32_33[0]--;
fprintf(stderr, "expecting details 32 (+32) bytes lost, 33 (-32) bytes reachable\n"); fflush(stderr); breakme();
VALGRIND_DO_CHANGED_LEAK_CHECK;
fprintf(stderr, "finished\n");
}
int main(void)
{
DECLARE_LEAK_COUNTERS;
GET_INITIAL_LEAK_COUNTS;
f(); // see leak-cases.c
GET_FINAL_LEAK_COUNTS;
PRINT_LEAK_COUNTS(stderr);
return 0;
}
答案 0 :(得分:0)
可以进行泄漏搜索以显示泄漏内存的“绝对数量”。 通常,这种泄漏搜索是在您的运行结束时完成的 程序。 如果您在运行期间进行了多次泄漏搜索,则进行泄漏搜索 可以(如果你要求的话)显示泄漏记忆的“增量” 与之前的泄漏搜索。 通常,这些几次泄漏搜索都是通过Valgrind完成的 嵌入式gdbserver(GDB连接到它发送监视器命令), 或通过客户请求,如VALGRIND_DO_ADDED_LEAK_CHECK 或者在shell中(使用vgdb发送监视器命令)。
对于此类delta泄漏搜索,您只能显示堆栈跟踪 其中泄漏的内存增加,或显示堆栈跟踪 有变化(增加或减少)。
有关详细信息,请参阅 http://www.valgrind.org/docs/manual/mc-manual.html#mc-manual.monitor-commands 和 http://www.valgrind.org/docs/manual/mc-manual.html#mc-manual.clientreqs
函数breakme用于进行自动Valgrind回归 测试更容易:启动GDB并在函数内部放置 breakme。 在Valgrind发行版中,perl脚本test / vg_regtest.in是 测试驱动程序,启动Valgrind和可选的第二个进程 (在测试Valgrind gdbserver的测试中是GDB)。 有关此内容的更多详细信息(以及如何使用breakme函数) 阅读tests / vg_regtest.in comments和gdbserver_tests / mcleak。*