为什么valgrind在64位架构上限制为32 Gb?

pio*_*otr 9 memory 64-bit valgrind memory-leaks

我试图在一个使用超过32 Gb的ram并且达到这个valgrind限制的进程上对一个heisenbug进行valgrind,这是一个任意的,可以通过重新编译valgrind来避免它还是一个很难的?

mar*_*k4o 12

限制是任意的,可以通过重新编译valgrind来更改.

Valgrind使用2级稀疏阵列跟踪内存.16位地址用于索引65536条目表,该表包含指向第二级映射的指针,该映射跟踪地址空间的范围(对于32位进程通常为2 15字节= 64KB,对于32位进程为2 15字节= 512 KB 64位进程).因此,这个2级稀疏阵列可以跟踪的内存总量是65536×这个块大小.通过修改代码,这些组块的大小可以增加到2的更大功率,代价是使用更多内存来跟踪大多数部分组块.

在valgrind-users邮件列表的这条消息中,Julian Seward解释了如何将限制从32GB增加到128GB:

  • memcheck/mc_main.c变化N_PRIMARY_BITS,从1921

  • 相应地更改断言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可以使用的最大内存量在最近的版本中有所增加:

  • Valgrind 3.9之前的32 GB
  • Valgrind 3.9到3.12中的64 GB
  • Valgrind 3.13中的128 GB