2012-05-11 23 views
1

考虑这个小程序:的valgrind/MEMCHECK无法释放“大”的内存块

#include <stdio.h> 
#include <stdlib.h> 

// Change 60000 to 70000 and valgrind (memcheck) eats my memory 
#define L (60000) 
#define M (100*(1<<20)) 

int main(void) { 
    int i; 
    for (i = 0; i < M; ++i) { 
    unsigned char *a = malloc(L); 
    a[i % L] = i % 128; // Touch something; a[0] is not enough 
    free(a); 
    if (i % (1<<16) == 0) 
     fprintf(stderr, "i = %d\n", i); 
    } 
    return 0; 
} 

编译与gcc -o vg和运行valgrind --leak-check=full ./vg做工精细,用我的记忆中大约1.5%MEMCHECK。然而,将L改为70000(我想这个魔法限制是1 < < 16),memcheck会使用不断增加的内存量,直到内核最终杀死它为止。

对此有什么可以做的吗?显然没有泄漏,但在valgrind本身(!?)中似乎有一个漏洞,使得很难用于检查有大量短暂分配的程序。

的一些背景知识,不知道这是相关的:

$ valgrind --version 
valgrind-3.7.0 
$ gcc --version 
gcc (GCC) 4.4.6 20110731 (Red Hat 4.4.6-3) 
$ /lib/libc.so.6 
GNU C Library stable release version 2.12, by Roland McGrath et al. 
$ uname -rms 
Linux 2.6.32-220.2.1.el6.x86_64 x86_64 

回答

1

这很可能是由GCC 4.4的bug, 这是在Valgrind的3.8.0旁路(尚未发布)引起的

从Valgrind的提取3.8.0 NEWS文件:

NI-BZ旁路gcc4.4/4.5错误代码生成导致内存不足或断言

+0

现在,我得到了3.8.1下载和测试,这似乎是真实的。至少我没有看到与小测试程序相同的奇怪行为。 – Villemoes

0

把你的进程的资源限制,以无限使用setrlimit所以,如果你超过男性限制内核不会杀死你的进程。因此,内核认为你可以延伸到虚拟地址空间。

希望这会有所帮助。