Sto provando a valgrind un heisenbug su un processo che usa più di 32 Gb di ram e colpendo questa limitazione di valgrind, si tratta di un arbitrario che potrebbe essere evitato ricompilando valgrind o è difficile?Perché valgrind è limitato a 32 Gb su architetture a 64 bit?
risposta
Il limite è arbitrario e può essere modificato mediante la ricompilazione di valgrind.
Valgrind tiene traccia della memoria utilizzando un array sparse a 2 livelli. 16 bit dell'indirizzo vengono utilizzati per indicizzare in una tabella 65536-entry contenente un puntatore a una mappa di secondo livello, che traccia un intervallo dello spazio di indirizzamento (normalmente 2¹⁶ byte = 64 KB per i processi a 32 bit, 2¹⁹ byte = 512 KB per Processi a 64 bit). Quindi la quantità totale di memoria che può essere tracciata da questo array sparse a 2 livelli è 65536 × questa dimensione del blocco. Modificando il codice, la dimensione di questi blocchi può essere aumentata a una potenza maggiore di 2, al costo di utilizzare più memoria per tenere traccia dei pezzi più parziali.
In this message sulle valgrind-users mailing list, Julian Seward spiega come aumentare il limite da 32 GB a 128 GB:
in
memcheck/mc_main.c
cambiamentoN_PRIMARY_BITS
19
-21
cambiamento le affermazioni alla fine del
memcheck/mc_main.c
di conseguenza:
MAX_PRIMARY_ADDRESS
→ 4 * (valore esistente + 1) - 1- per le
MASK(1/2/4/8)
asserzioni, azzerare più a destra due '1' bit nel blocco dei principali 1 bit, ad esempioMASK(8)
→0xFFFFFFE000000007ULL
Credoin
coregrind/m_aspacemgr/aspacemgr-linux.c
cambiamentoaspacem_maxAddr
da(Addr)0x800000000 - 1
a(Addr)0x2000000000ULL - 1
.
Aggiornamento: La quantità massima di memoria Valgrind può utilizzare è aumentata nelle versioni più recenti:
- 32 GB prima Valgrind 3,9
- 64 GB Valgrind 3.9 fino a 3.12
- 128 GB in Valgrind 3.13
Ottima risposta, grazie – piotr