负数字节可达valgrind

时间:2012-12-17 12:03:15

标签: function memory-leaks valgrind

通过valgrind中的示例代码,显示了记忆泄漏情况,我不明白两件事:

  1. 如何在任何内存泄漏中可达或丢失的字节数 否定?当字节数为a时,它是什么意思 减号?
  2. 空函数breakme()的需要是什么,没有 声明?当什么都不做的时候,它的目的是什么?

  3. #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;
    }
    

1 个答案:

答案 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-commandshttp://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。*