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

时间:2011-12-27 11:40:13

标签: memory memory-leaks 64-bit valgrind

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

1 个答案:

答案 0 :(得分:12)

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

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

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

  
      {li>

    memcheck/mc_main.cN_PRIMARY_BITS19更改为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可以使用的最大内存量有所增加:

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