3

我是 valgrind 的忠实粉丝,并且广泛使用它来捕获代码中的错误。但是现在我遇到了一个只在特定情况下出现的错误,这需要我的程序 malloc/使用超过 32Gb 的 RAM(实际上大约 37),并且 valgrind 有一个硬编码的限制,它说它不会让你分配超过 32Gb。我设法在网上找到了一些帖子,其中人们列出了对 valgrind 的各种代码修改,这应该允许您扩展此限制,但是它们似乎不起作用,或者它们似乎正在修改不同的(和未指定的)版本瓦尔格林。无论如何,我并不热衷于在 valgrind 内部进行黑客攻击,所以我开始寻找其他选择。

Clang/AddressSanitizer 似乎是一个不错的选择,但不幸的是,这里也有一个问题,因为我大量使用了嵌套函数。所以,我的问题是 - 有谁知道 valgrind 的替代品(在 64 位 linux 上)没有 valgrind 的 32Gb 内存分配限制?

Ideas v 欢迎最好的 Zam

4

2 回答 2

1

现在 gcc 主干中提供了 AddressSanitizer 的 gcc 变体(很快将是 4.8)。它还没有clang版本那么成熟,但你可以试试。

% 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
于 2013-02-21T11:54:56.860 回答
0

还有一个适用于 Linux 和 Windows 的开源内存调试器。它被称为“记忆博士”。我不知道它是否有上限(如 valgrind),但也许你应该尝试一下。

于 2012-12-22T09:01:37.923 回答