【问题标题】:Why is valgrind limited to 32 Gb on 64 bit architectures?为什么 valgrind 在 64 位架构上限制为 32 Gb?
【发布时间】:2012-01-28 11:26:41
【问题描述】:

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

【问题讨论】:

    标签: memory memory-leaks 64-bit valgrind


    【解决方案1】:

    限制是任意的,可以通过重新编译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_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
    • 64 GB 在 Valgrind 3.9 到 3.12 中
    • 128 GB 在 Valgrind 3.13 中

    【讨论】:

      猜你喜欢
      • 2017-06-05
      • 2021-07-16
      • 2013-11-07
      • 2011-04-05
      • 2017-04-07
      • 2021-02-12
      • 2011-02-13
      • 1970-01-01
      相关资源
      最近更新 更多