2012-09-19 47 views
3

我是valgrind的忠實粉絲,並且廣泛使用它來捕捉我的代碼中的錯誤。然而現在我被一個只在特定情況下顯示的錯誤所困擾,這個錯誤要求我的程序malloc /使用超過32Gb的RAM(實際上大約有37GB),而valgrind有一個硬編碼的限制,表示它不會讓你分配超過32Gb。我已經設法在網上找到幾個帖子,其中人們列出了對valgrind的各種代碼修改,它應該允許您擴展這個限制,但是它們似乎不工作,或者它們似乎在修改不同的(並且未指定的)版本的valgrind。無論如何,我不會熱衷於在valgrind內部進行攻擊,所以我開始尋找其他選項。替代valgrind沒有32GB內存限制?

Clang/AddressSanitizer似乎是一個不錯的選擇,但也有一個不幸的地方,因爲我使用了很多嵌套函數。所以,我的問題是 - 有沒有人知道valgrind的選擇(在64位linux上)沒有valgrind的32Gb內存分配限制?

思路V歡迎 最好 贊

+0

你提到的AddressSanitizer,但你有沒有試過鐺靜態分析儀?作爲一個靜態分析器,它不會替代像valgrind或AddressSanitizer這樣的內存錯誤檢測器,但我最近開始使用它,並且通過這種方式糾正了一些內存相關的錯誤。 –

+0

另一個地方看: https://code.google.com/p/address-sanitizer/wiki/ComparisonOfMemoryTools 這裏列出了五個競爭記憶檢查器,其中Valgrind和AddressSanitizer只有兩個。 –

+0

謝謝Doug!我還沒有嘗試過clang,因爲它指定它不支持嵌套函數。我會看看那個wiki,謝謝! – user1213546

回答

0

還爲Linux和Windows的開源內存調試。它被稱爲"Dr. Memory"。我不知道它是否有上限(如valgrind),但也許你應該嘗試。

1

AddressSanitizer的gcc變體現在在gcc主幹中可用(很快會變爲4.8)。 它尚不如叮噹聲版本成熟,但你可以嘗試。

% cat use-after-free.cc 
#include <stdlib.h> 
int main() { 
    char *x = (char*)malloc(10 * sizeof(char)); 
    free(x); 
    return x[5]; 
} 
% g++ --version | head -1 
g++ (GCC) 4.8.0 20130216 (experimental) 

% g++ -fsanitize=address -static-libasan use-after-free.cc && ./a.out 2>&1 | asan_symbolize.py 
================================================================= 
==9817== ERROR: AddressSanitizer: heap-use-after-free on address 0x60040000dff5 at pc 0x4179c3 bp 0x7fffe046af30 sp 0x7fffe046af28 
READ of size 1 at 0x60040000dff5 thread T0 
    #0 0x4179c2 in main ??:0 
    #1 0x7f469c8dc76c in __libc_start_main /build/buildd/eglibc-2.15/csu/libc-start.c:226 
    #2 0x402098 in _start ??:0 
0x60040000dff5 is located 5 bytes inside of 10-byte region [0x60040000dff0,0x60040000dffa) 
freed by thread T0 here: 
    #0 0x40f18a in free ??:0 
    #1 0x417980 in main ??:0 
    #2 0x7f469c8dc76c in __libc_start_main /build/buildd/eglibc-2.15/csu/libc-start.c:226 
previously allocated by thread T0 here: 
    #0 0x40f26a in malloc ??:0 
    #1 0x417970 in main ??:0 
    #2 0x7f469c8dc76c in __libc_start_main /build/buildd/eglibc-2.15/csu/libc-start.c:226 
+0

非常感謝! – user1213546