Почему valgrind ограничен 32 Гб на 64-битных архитектурах? - PullRequest
9 голосов
/ 27 декабря 2011

Я пытаюсь выполнить valgrind heisenbug в процессе, который использует более 32 ГБ ОЗУ, и преодолев это ограничение valgrind. Это произвольный случай, которого можно избежать путем перекомпиляции valgrind, или это сложный процесс?

1 Ответ

12 голосов
/ 28 декабря 2011

Предел произвольный и может быть изменен путем перекомпиляции valgrind.

Valgrind отслеживает память, используя 2-уровневый разреженный массив.16 бит адреса используются для индексации в таблицу с 65536 записями, содержащую указатель на карту второго уровня, которая отслеживает диапазон адресного пространства (обычно 2 байта = 64 КБ для 32-битных процессов, 2 байта = 512 КБ для64-битные процессы).Таким образом, общий объем памяти, который можно отслеживать с помощью этого двухуровневого разреженного массива, составляет 65536 × этот размер куска.Изменяя код, можно увеличить размер этих чанков до степени 2, за счет использования большего объема памяти для отслеживания большинства частичных чанков.

В это сообщение вСписок рассылки valgrind-пользователей, Джулиан Сьюард, объясняет, как увеличить ограничение с 32 ГБ до 128 ГБ:

  • в 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, увеличился в последних версиях:

  • 32 ГБ до Valgrind 3.9
  • 64 ГБ в Valgrind 3.9–3.12
  • 128 ГБв Вальгринде 3,13
...