没有32GB内存限制的valgrind替代品?

3

我非常喜欢Valgrind,并且已经广泛使用它来捕获我的代码中的错误。然而,现在我遇到了一个只在特定情况下出现的bug,需要我的程序malloc/use超过32Gb的RAM(实际上是约37Gb),而Valgrind有一个硬编码限制,说它不会让你分配超过32Gb的内存。我在网上找到了一些帖子,其中人们列出了各种修改Valgrind的代码的方法,可以扩展这个限制,但要么它们似乎不起作用,要么它们似乎修改了不同版本的Valgrind(未指定版本)。我也不太喜欢在Valgrind内部进行操作,所以我开始寻找其他选择。

Clang/AddressSanitizer看起来是一个不错的选择,但不幸的是,在我的代码中我大量使用嵌套函数。因此,我的问题是 - 有没有人知道一个替代Valgrind的方法(在64位Linux上),它没有Valgrind的32Gb内存分配限制?

欢迎提出想法 最好的祝福 Zam


你提到了AddressSanitizer,但是你尝试过clang静态分析器吗?作为一个静态分析器,它不能替代像valgrind或AddressSanitizer这样的内存错误检测器,但我最近开始使用它,并通过这种方式纠正了一些与内存相关的错误。 - Douglas B. Staple
另一个参考网址: https://code.google.com/p/address-sanitizer/wiki/ComparisonOfMemoryTools 该网址列出了五个竞争性的内存检查工具,其中 Valgrind 和 AddressSanitizer 仅是其中两个。 - Douglas B. Staple
谢谢Doug!我还没有尝试过clang,因为它指定不支持嵌套函数。不过,我会看一下那个维基页面的,谢谢! - user1213546
2个回答

1

现在,在gcc主干版本(即将发布的4.8版本)中提供了AddressSanitizer的变种。它还没有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

0

此外,Linux和Windows也有一个开源的内存调试器。它被称为"Dr. Memory"。我不知道它是否有上限(像valgrind一样),但或许你可以试试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接