我正试图在一个使用超过32 Gb的ram并达到这个valgrind限制的进程上对一个heisenbug进行valgrind,这是一个可以通过重新编译valgrind来避免的任意一个,还是一个很难的?
答案 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.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可以使用的最大内存量有所增加: