我是valgrind的忠实粉丝,并广泛使用它来捕获我的代码中的错误。但是现在我遇到了一个只在特定情况下出现的错误,这个错误要求我的程序使用malloc /使用超过32Gb的RAM(实际上大约为37),而valgrind有一个硬编码限制,表示它不会让你分配超过32Gb。我已经设法在网上找到几个帖子,其中人们列出了对valgrind的各种代码修改,这应该允许你扩展这个限制,但要么它们似乎不起作用,要么它们似乎修改了一个不同的(和未指定的)版本valgrind。无论如何,我不想热衷于讨论valgrind,所以我开始寻找其他选择。
Clang / AddressSanitizer似乎是一个不错的选择,但遗憾的是,因为我大量使用嵌套函数。所以,我的问题是 - 有没有人知道valgrind的替代品(在64位linux上)没有valgrind的32Gb内存分配限制?
想法欢迎 最好 ZAM
答案 0 :(得分:1)
现在gcc trunk中有一个gcc变量的AddressSanitizer(很快就会是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
答案 1 :(得分:0)
还有一个适用于Linux和Windows的开源内存调试器。它被称为"Dr. Memory"。我不知道它是否有上限(如valgrind),但也许你应该尝试。