Estoy tratando de valgrind un heisenbug en un proceso que utiliza más de 32 Gb de memoria RAM y tocando esta limitación valgrind, ¿es esto una arbitraria que podría evitarse compilando valgrind o es difícil?¿Por qué Valgrind está limitado a 32 Gb en arquitecturas de 64 bits?
Respuesta
El límite es arbitrario y se puede cambiar compilando valgrind.
Valgrind realiza un seguimiento de la memoria utilizando una matriz dispersa de 2 niveles. 16 bits de la dirección se usan para indexar en una tabla de entrada 65536 que contiene un puntero a un mapa de segundo nivel, que rastrea un rango del espacio de direcciones (normalmente 2¹⁶ bytes = 64KB para procesos de 32 bits, 2¹⁹ bytes = 512KB para Procesos de 64 bits). Por lo tanto, la cantidad total de memoria que puede rastrearse mediante esta matriz dispersa de 2 niveles es 65536 × este tamaño de fragmento. Al modificar el código, el tamaño de estos trozos se puede aumentar a una potencia mayor de 2, a costa de usar más memoria para rastrear la mayoría de los trozos parciales.
En this message en los valgrind lista de distribución, Julian Seward explica cómo aumentar el límite de 32 GB a 128 GB:
en
memcheck/mc_main.c
cambioN_PRIMARY_BITS
de19
a21
cambio las aserciones al final de
memcheck/mc_main.c
en consecuencia:
MAX_PRIMARY_ADDRESS
→ 4 * (valor existente + 1) - 1- para los
MASK(1/2/4/8)
afirmaciones, puesta a cero de los dos más a la derecha '1' bits en el bloque de los principales 1 bits, por ejemploMASK(8)
→0xFFFFFFE000000007ULL
Creoen
coregrind/m_aspacemgr/aspacemgr-linux.c
cambioaspacem_maxAddr
de(Addr)0x800000000 - 1
a(Addr)0x2000000000ULL - 1
.
Actualización: La cantidad máxima de memoria que Valgrind puede uso ha aumentado en las últimas versiones:
- 32 GB antes de Valgrind 3,9
- 64 GB en Valgrind 3.9 a 3.12
- 128 GB en Valgrind 3.13
- 1. 64 bits por división de 32 bits
- 2. Operaciones en operandos de 64 bits en arquitecturas de 32 bits?
- 3. ¿Cómo debería funcionar la aplicación en las arquitecturas intel de 64 bits frente a las de 32 bits?
- 4. conversión de aplicación .NET 32 bits a 64 bits
- 5. Puerto 32 bits Controlador de Windows a 64 bits Windows
- 6. ¿Por qué 2 GB de límite de memoria cuando se ejecuta en Windows de 64 bits?
- 7. Determinación de Windows de 64 bits frente a 32 bits
- 8. QtCreator en Linux: 32 bits frente a 64 bits
- 9. ¿Aplicación de 32 bits o de 64 bits en el sistema operativo de 64 bits?
- 10. ¿Por qué __sync_add_and_fetch funciona para una variable de 64 bits en un sistema de 32 bits?
- 11. Compatibilidad con Java de 32 bits frente a 64 bits
- 12. Wendy ASP.NET AJAX Error/32 bits a 64 bits
- 13. ¿Por qué debería usar el JDK de 64 bits en la versión de 32 bits?
- 14. Descripción del tamaño máximo de almacenamiento dinámico de JVM: 32 bits frente a 64 bits
- 15. Registros de 64 bits en ventanas de 32 bits
- 16. Java JDK 32 bits frente a 64 bits
- 17. ¿Por qué los desarrolladores .NET ofrecen versiones de 32 bits/64 bits de ensamblados .NET?
- 18. ¿Por qué la MSBuild de 64 bits carga extensiones de 32 bits?
- 19. ¿Puede un programa de 32 bits usar más de 4 GB de memoria en un sistema operativo de 64 bits?
- 20. Ejecute AnyCPU como 32 bits en sistemas de 64 bits
- 21. Objeto compartido/bibliotecas mixtas de 32 bits y 64 bits
- 22. Eclipse 32 bits ejecutándose en 64 bits JVM
- 23. ¿Cómo fuerzo Python para ser de 32 bits en Snow Leopard y otras preguntas de 32 bits/64 bits
- 24. ¿Utiliza la versión de 32 bits de ODBC en Windows 7 de 64 bits?
- 25. MapViewOfFile compartido entre procesos de 32 bits y 64 bits
- 26. Mezcla de 32 bits y 64 bits P/Invoca
- 27. Cómo comprobar si IIS está en el modo de 32 bits o de 64 bits
- 28. ¿Por qué es fPIC absolutamente necesario en 64 y no en plataformas de 32 bits?
- 29. Interoperabilidad de 32 y 64 bits en Windows de 64 bits
- 30. Compilación de 32 bits con llvm-gcc de 64 bits
Gran respuesta, gracias – piotr