负数

2012-12-17 15 views
0

虽然经历在Valgrind的示例代码显示memeory泄漏情况下,我不明白两两件事:负数

  1. 如何到达或丢失字节的任何内存泄漏的数量是 in negative?字节数是否为 减号是什么意思?
  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; 
} 

回答

0

的泄漏搜索可以做,以显示泄漏的内存的“绝对数字”。 通常,这样的检漏在您 程序运行结束时进行。 如果您在运行过程中做一些泄漏的搜索,然后检漏 可以(如果你要求的话)显示与以往检漏相比 泄漏的内存的“增量”。 通常,这些几个泄漏搜索经由Valgrind的 嵌入gdbserver的完成(用GDB连接到它发送一个监视命令), 或经由客户端请求,诸如VALGRIND_DO_ADDED_LEAK_CHECK 或在一个壳(使用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脚本测试/ vg_regtest.in是 试验驾驶员,在开始Valgrind的和任选的第二处理 (这是GDB在测试Valgrind的gdbserver的测试)。 有关此更多详细信息(以及如何使用breakme函数) 阅读tests/vg_regtest.in注释和gdbserver_tests/mcleak。*

+0

ok谢谢。我得到了第一个问题的答案,即负字节数实际上意味着从先前泄漏或可访问的字节数中减少字节数。你能解释更多关于第二个问题吗?它不太清楚GDB是如何自动启动的,以及空函数如何使回归测试更容易? Regards –

+0

编辑答案,提供有关Valgrind注册信息的更多详细信息 – phd