0

在浏览 valgrind 中显示内存泄漏案例的示例代码时,我不明白两件事:

  1. 任何内存泄漏中可到达或丢失的字节数如何为负数?当字节数带有减号时是什么意思?
  2. 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;
}
4

1 回答 1

0

可以进行泄漏搜索以显示泄漏内存的“绝对数字”。通常,此类泄漏搜索是在程序运行结束时完成的。如果您在运行期间进行了多次泄漏搜索,那么与之前的泄漏搜索相比,泄漏搜索可以(如果您要求)显示泄漏内存的“增量”。通常,这几个泄漏搜索是通过 Valgrind 嵌入式 gdbserver(连接到它的 GDB 发送监控命令)或通过客户端请求(如 VALGRIND_DO_ADDED_LEAK_CHECK)或在 shell 中完成(使用 vgdb 发送监控命令)。

对于这样的增量泄漏搜索,您可以仅显示泄漏内存增加的堆栈跟踪,或显示发生变化(增加或减少)的堆栈跟踪。

有关详细信息,请参阅 http://www.valgrind.org/docs/manual/mc-manual.html#mc-manual.monitor-commandshttp://www.valgrind.org/docs/manual/mc-manual .html#mc-manual.clientreqs

函数 breakme 使自动 Valgrind 回归测试更容易执行:启动 GDB 并在函数 breakme 中放置一个中断。在 Valgrind 发行版中,perl 脚本 tests/vg_regtest.in 是测试驱动程序,启动 Valgrind 和可选的第二个进程(在测试 Valgrind gdbserver 的测试中是 GDB)。有关此(以及如何使用 breakme 函数)的更多详细信息,请阅读 tests/vg_regtest.in 注释和 gdbserver_tests/mcleak。*

于 2012-12-17T23:38:55.023 回答