2012-05-11 27 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所以,如果你超過男性限制內核不會殺死你的進程。因此,內核認爲你可以延伸到虛擬地址空間。

希望這會有所幫助。