【发布时间】:2012-01-28 11:26:41
【问题描述】:
我正在尝试在使用超过 32 Gb 内存的进程上对 heisenbug 进行 valgrind,并达到此 valgrind 限制,这是可以通过重新编译 valgrind 来避免的任意问题还是很难?
【问题讨论】:
标签: memory memory-leaks 64-bit valgrind
我正在尝试在使用超过 32 Gb 内存的进程上对 heisenbug 进行 valgrind,并达到此 valgrind 限制,这是可以通过重新编译 valgrind 来避免的任意问题还是很难?
【问题讨论】:
标签: memory memory-leaks 64-bit valgrind
限制是任意的,可以通过重新编译valgrind来改变。
Valgrind 使用 2 级稀疏数组跟踪内存。地址的 16 位用于索引包含指向二级映射的指针的 65536 条目表,该映射跟踪地址空间的范围(对于 32 位进程,通常 2¹⁶ 字节 = 64KB,对于 32 位进程,2¹⁹ 字节 = 512KB 64 位进程)。所以这个 2 级稀疏数组可以跟踪的内存总量是 65536 × 这个块大小。通过修改代码,这些块的大小可以增加到更大的 2 次方,代价是使用更多内存来跟踪大部分部分块。
在 valgrind-users 邮件列表的 this message 中,Julian Seward 解释了如何将限制从 32GB 增加到 128GB:
在
memcheck/mc_main.c中将N_PRIMARY_BITS从19更改为21相应地更改
memcheck/mc_main.c末尾的断言:
MAX_PRIMARY_ADDRESS→ 4 * (现有值 + 1) - 1- 对于
MASK(1/2/4/8)断言,将最右边的两个设置为零 前导 1 位块中的“1”位,例如MASK(8)→0xFFFFFFE000000007ULL我想
在
coregrind/m_aspacemgr/aspacemgr-linux.c中将aspacem_maxAddr从(Addr)0x800000000 - 1到(Addr)0x2000000000ULL - 1。
更新: Valgrind 可以使用的最大内存量在最近的版本中有所增加:
【讨论】: