Próbuję walczyć z heisenbugiem w procesie, który wykorzystuje ponad 32 GB pamięci RAM i trafia w ograniczenie tego valgrind, czy jest to arbitralne, którego można uniknąć, rekompilując valgrind, czy jest to trudne?Dlaczego valgrind jest ograniczony do 32 Gb na architekturach 64-bitowych?
Odpowiedz
Limit jest arbitralny i można go zmienić ponownie rekompilując valgrind.
Valgrind śledzi pamięć za pomocą dwupoziomowej, rzadkiej macierzy. 16 bitów adresu służy do indeksowania do tabeli wpisu 65536 zawierającej wskaźnik do mapy drugiego poziomu, która śledzi zakres przestrzeni adresowej (zwykle 2 ± 4 bajty = 64 KB w przypadku procesów 32-bitowych, 2 ± 5 bajtów = 512 KB w przypadku Procesy 64-bitowe). Całkowita ilość pamięci, którą można śledzić w tej 2-poziomowej, rzadkiej macierzy, wynosi 65536 × ten rozmiar porcji. Modyfikując kod, rozmiar tych fragmentów można zwiększyć do 2 razy, kosztem większej ilości pamięci, aby śledzić większość fragmentów.
W this message na Valgrind użytkownikami listy, Julian Seward wyjaśnia, w jaki sposób zwiększyć limit od 32 GB do 128 GB:
w
memcheck/mc_main.c
zmianyN_PRIMARY_BITS
od19
do21
zmian twierdzenia na koniec
memcheck/mc_main.c
odpowiednio:
MAX_PRIMARY_ADDRESS
→ 4 * (istniejąca wartość +1) - 1- dla
MASK(1/2/4/8)
twierdzeń ustawiony na zero, skrajnie prawe dwóm „1”, bity w bloku prowadzących 1 bitów, npMASK(8)
→0xFFFFFFE000000007ULL
myślęw
coregrind/m_aspacemgr/aspacemgr-linux.c
zmianaaspacem_maxAddr
z(Addr)0x800000000 - 1
do(Addr)0x2000000000ULL - 1
.
Update: Maksymalna ilość pamięci Valgrind można używać wzrosła w ostatnich wersjach
- 32 PL przed Valgrind 3,9
- 64 GB Valgrind 3,9 do 3.12
- 128 GB w Valgrind 3.13
Świetna odpowiedź, dzięki – piotr