Valgrind ( / ˈ v æ l ɡ r ɪ n d / ) [ 6 ] es una herramienta de programación para la depuración de memoria , la detección de fugas de memoria y la creación de perfiles .
Valgrind fue diseñado originalmente como una herramienta de depuración de memoria con licencia gratuita para Linux en x86 , pero desde entonces ha evolucionado hasta convertirse en un marco genérico para crear herramientas de análisis dinámico, como verificadores y analizadores de rendimiento.
Descripción general
Valgrind es, en esencia, una máquina virtual que utiliza técnicas de compilación justo a tiempo , incluyendo la recompilación dinámica . Ninguna parte del programa original se ejecuta directamente en el procesador anfitrión . En su lugar, Valgrind primero traduce el programa a una forma temporal y más simple llamada representación intermedia (IR), que es una forma estática e independiente del procesador basada en una única asignación . Tras la conversión, una herramienta (véase más abajo) puede realizar las transformaciones que desee en la IR, antes de que Valgrind la vuelva a traducir a código máquina y permita que el procesador anfitrión la ejecute. Valgrind recompila el código binario para que se ejecute en CPU anfitrionas y de destino (o simuladas) de la misma arquitectura. También incluye un stub de GDB para permitir la depuración del programa de destino mientras se ejecuta en Valgrind, con "comandos de monitorización" que permiten consultar la herramienta Valgrind para obtener diversa información.
Se pierde una cantidad considerable de rendimiento en estas transformaciones (y, por lo general, en el código que inserta la herramienta); normalmente, el código ejecutado con Valgrind y la herramienta "none" (que no modifica el IR) se ejecuta a un 20 % o 25 % de la velocidad del programa normal. [ 7 ] [ 8 ]
Herramientas
Comprobación de memoria
Valgrind incluye varias herramientas (además de algunas externas). La herramienta predeterminada (y más utilizada) es Memcheck . Memcheck inserta código de instrumentación adicional alrededor de casi todas las instrucciones, que controla la validez (toda la memoria no asignada comienza como inválida o "indefinida" hasta que se inicializa en un estado determinista, posiblemente desde otra memoria) y la direccionabilidad (si la dirección de memoria en cuestión apunta a un bloque de memoria asignado y no liberado), almacenadas en los llamados bits V y bits A , respectivamente. A medida que se mueven o manipulan los datos, el código de instrumentación realiza un seguimiento de los bits A y V, por lo que siempre son correctos a nivel de bit individual.
Además, Memcheck reemplaza los asignadores de memoria estándar de C++ y el asignador de memoria de C con su propia implementación, que también incluye protecciones de memoria alrededor de todos los bloques asignados (con los bits A configurados como "inválidos"). Esta característica permite a Memcheck detectar errores de desplazamiento de un bit, donde un programa lee o escribe fuera de un bloque asignado por una pequeña cantidad. Los problemas que Memcheck puede detectar y sobre los que puede advertir incluyen los siguientes:
- Lectura de memoria no inicializada
- Lectura/escritura de memoria no válida que puede ser
- memoria que ha sido
free'd - memoria fuera de los
mallocbloques 'd' - memoria por debajo del puntero de pila
- memoria que ha sido
- Uso de parámetros incorrectos para las llamadas al sistema
- Copias de memoria superpuestas inseguras
mem*constr*funciones - fugas de memoria
- Asignaciones y reasignaciones desajustes que pueden ser
- mezclando C y C++ por ejemplo,
mallocydelete - mezclando escalares y matrices, por ejemplo,
newydelete[] - El tamaño de la desasignación no es el mismo que el de la asignación.
- La desasignación alineada no es lo mismo que la alineación que la asignación.
- mezclando C y C++ por ejemplo,
- Uso de alineación incorrecta
- Uso de
realloccon un tamaño cero
El precio de esto es la pérdida de rendimiento. Los programas que se ejecutan con Memcheck suelen ser entre 20 y 30 veces más lentos [ 9 ] que los que se ejecutan fuera de Valgrind y consumen más memoria (hay una penalización de memoria por cada asignación). Por lo tanto, pocos desarrolladores ejecutan su código con Memcheck (o cualquier otra herramienta de Valgrind) de forma continua. Generalmente, utilizan estas herramientas para localizar algún error específico o para verificar que no haya errores latentes (del tipo que Memcheck puede detectar) en el código.
Errores principales
Una parte fundamental de Valgrind siempre debe realizar alguna comprobación en los descriptores de archivo (por ejemplo, para evitar que el ejecutable de prueba afecte al archivo de registro de Valgrind u otros archivos de salida). También se pueden realizar comprobaciones para detectar errores de usuario más generales que afecten a los descriptores de archivo. Los tipos de errores que se detectan son:
- cerrando un descriptor de archivo que no está abierto
- Descriptores de archivo que no se cierran cuando finaliza el ejecutable de prueba.
- uso de un descriptor de archivo que nunca se creó o que ya se cerró
A partir de Valgrind 3.24, estos errores se gestionan de la misma manera que otros errores. Esto significa que se pueden generar y utilizar supresiones con ellos.
Valgrind 3.25 añadió una función que permite modificar el comportamiento de las funciones que crean descriptores de archivo. El comportamiento predeterminado es el mismo que el de POSIX , que devuelve el descriptor de archivo disponible de menor nivel, lo que puede provocar el reciclaje de descriptores de archivo cerrados. Existe el riesgo de que el ejecutable de prueba utilice accidentalmente y de forma errónea un descriptor de archivo reciclado. La opción `--modify-fds` de Valgrind modifica este comportamiento para que ya no respete el estándar POSIX. En su lugar, intentará crear un nuevo descriptor de archivo para cada solicitud.
Otras herramientas
Además de Memcheck, Valgrind tiene varias otras herramientas: [ 10 ]
- La opción "Ninguna " ejecuta el código en la máquina virtual sin realizar ningún análisis y, por lo tanto, tiene el menor consumo de CPU y memoria posible de todas las herramientas. Dado que Valgrind proporciona un rastreo de errores en caso de fallo de segmentación , la opción "Ninguna " proporciona este rastreo con un consumo mínimo de recursos.
- Addrcheck , similar a Memcheck pero con un consumo de CPU y memoria mucho menor, detecta menos tipos de errores. Addrcheck se eliminó a partir de la versión 3.2.0. [ 11 ]
- Massif , un analizador de rendimiento de memoria . La interfaz gráfica independiente massif-visualizer muestra la salida de Massif.
- Helgrind y DRD detectan condiciones de carrera en código multihilo.
- Cachegrind , un analizador de caché . La interfaz gráfica de usuario independiente KCacheGrind visualiza la salida de Cachegrind.
- Callgrind , un analizador de gráficos de llamadas creado por Josef Weidendorfer, se agregó a Valgrind a partir de la versión 3.2.0. KCacheGrind puede visualizar la salida de Callgrind.
- DHAT es una herramienta de análisis dinámico de la memoria que analiza cuánta memoria se asigna y durante cuánto tiempo, así como los patrones de uso de la memoria.
- exp-bbv , un simulador de rendimiento que extrapola el rendimiento a partir de un pequeño conjunto de muestras.
exp-sgcheck (llamado exp-ptrcheck antes de la versión 3.7) se eliminó en la versión 3.16.0. Era una herramienta experimental para detectar errores de desbordamiento de pila y de matriz global, que Memcheck no puede detectar.
También hay varias herramientas desarrolladas externamente disponibles. Una de ellas es ThreadSanitizer, otro detector de condiciones de carrera . [ 12 ] [ 13 ]
Plataformas compatibles
A partir de la versión 3.4.0, Valgrind admite Linux en x86 , x86-64 y PowerPC . [ 14 ] La compatibilidad con Linux en ARMv7 (utilizado, por ejemplo, en ciertos teléfonos inteligentes ) se agregó en la versión 3.6.0. [ 15 ] [ 16 ] A partir de la versión 3.7.0 se agregó la compatibilidad con la plataforma ARM/ Android . [ 17 ] La compatibilidad con Solaris se agregó en la versión 3.11.0. [ 18 ] La compatibilidad con OS X se agregó en la versión 3.5.0. [ 19 ] La compatibilidad con FreeBSD x86 y amd64 se agregó en la versión 3.18.0. [ 20 ] La compatibilidad con FreeBSD aarch64 se agregó en la versión 3.23.0. [ 21 ]
Desde la versión 3.9.0 se ofrece soporte para Linux en MIPS64 little y big endian, para MIPS DSP ASE en MIPS32 , para instrucciones de punto flotante decimal s390x , para instrucciones POWER8 ( Power ISA 2.07 ), para instrucciones Intel AVX2 , para extensiones de sincronización transaccional de Intel, tanto RTM como HLE, y soporte inicial para memoria transaccional de hardware en POWER. [ 22 ]
RISC-V de 64 bits desde la versión 3.25.0. [ 23 ]
Se mejoró la compatibilidad con macOS 10.13 y se agregó compatibilidad con macOS 10.14 [ 24 ] , 10.15 [ 25 ] , 11 [ 26 ] , 12 [ 27 ] y 13 [ 28 ] en Valgrind 3.27.
Hay puertos no oficiales a otras plataformas tipo Unix (como OpenBSD , [ 29 ] NetBSD [ 30 ] , DragonFly BSD [ 31 ] y QNX [ 32 ] ).
Historia y desarrollo
El nombre Valgrind hace referencia a la entrada principal del Valhalla en la mitología nórdica . [ 33 ] [ 34 ] Durante el desarrollo (antes del lanzamiento) el proyecto se denominó Heimdall ; sin embargo, el nombre habría entrado en conflicto con un paquete de seguridad. [ 33 ]
El autor original de Valgrind es Julian Seward , quien en 2006 ganó un premio Google-O'Reilly de código abierto por su trabajo en Valgrind. [ 35 ] [ 36 ]
Otros también han realizado contribuciones significativas, entre ellos Nicholas Nethercote, Bart Van Assche, Florian Krohm, Tom Hughes, Philippe Waroquiers, Mark Wielaard, Paul Floyd, Petar Jovanovic, Carl Love, Petr Pavlu e Ivo Raisr. [ 37 ]
Es utilizado por varios proyectos basados en Linux. [ 38 ]
Limitaciones de Memcheck
Además de la penalización en el rendimiento, una limitación importante de Memcheck es su incapacidad para detectar todos los casos de errores de límites en el uso de datos estáticos o asignados en la pila. [ 39 ] El siguiente código pasará la herramienta Memcheck en Valgrind sin incidentes, a pesar de contener los errores descritos en los comentarios:
int a [ 5 ]; // Un array estático global de longitud 5int main () { int b [ 5 ]; // Un array de pila de longitud 5a [ 5 ] = 0 ; // Error: existen los intervalos a[0] a a[4], a[5] está fuera de los límites b [ 5 ] = 0 ; // Error: existen los intervalos b[0] a b[4], b[5] está fuera de los límitesdevolver 0 ; }La incapacidad para detectar todos los errores relacionados con el acceso a los datos asignados a la pila es especialmente destacable, ya que ciertos tipos de errores de pila hacen que el software sea vulnerable al clásico exploit de desbordamiento de pila .
Véase también
Notas
- ↑ "autores" . valgrind.org . Archivado del original el 20 de septiembre de 2022. Consultado el 19 de septiembre de 2022 .
- ↑ "Los desarrolladores de Valgrind" . valgrind.org . Archivado del original el 9 de julio de 2024. Consultado el 28 de octubre de 2025 .
- ↑ Nethercote, Nicholas (27 de julio de 2022). "Veinte años de Valgrind" . nnethercote.github.io . Archivado del original el 5 de agosto de 2023. Recuperado el 4 de agosto de 2023 .
- ↑ https://sourceforge.net/p/valgrind/mailman/message/59324626/ .
{{cite web}}: Falta o está vacío|title=( ayuda ) - 1 2 Wielaard, Mark (25 de noviembre de 2025). "Valgrind-3.26.0 está disponible" . Valgrind-announce (Lista de correo) . Recuperado el 19 de diciembre de 2025 .
Esta versión es compatible con X86/Linux, AMD64/Linux, ARM32/Linux, ARM64/Linux, PPC32/Linux, PPC64BE/Linux, PPC64LE/Linux, S390X/Linux, MIPS32/Linux, MIPS64/Linux, RISCV64/Linux, ARM/Android, ARM64/Android, MIPS32/Android, X86/Android, X86/Solaris, AMD64/Solaris, AMD64/MacOSX 10.12, X86/FreeBSD, AMD64/FreeBSD y ARM64/FreeBSD. También hay soporte preliminar para X86/macOS 10.13, AMD64/macOS 10.13 y nanoMIPS/Linux.
- ↑ "Preguntas frecuentes sobre Valgrind" . valgrind.org . 1.1 ¿Cómo se pronuncia "Valgrind"? Archivado del original el 4 de mayo de 2023. Consultado el 4 de mayo de 2023.
"Val" como en la palabra "valor". "grind" se pronuncia con una "i" corta, es decir, "grinned" (que rima con "tinned") en lugar de "grined" (que rima con "find").
- ↑ "Acerca de Valgrind" . valgrind.org . Archivado del original el 23 de noviembre de 2025. Consultado el 28 de octubre de 2025 .
- ↑ "Manual de Valgrind" (PDF) . valgrind.org .
- ↑ "Guía de inicio rápido de Valgrind" . 3. Ejecutar el programa con Memcheck. Archivado del original el 15 de noviembre de 2025. Consultado el 28 de octubre de 2025 .
- ↑ "Paquete de herramientas de Valgrind" . valgrind.org . Archivado del original el 29 de octubre de 2025. Consultado el 28 de octubre de 2025 .
- ↑ Seward, Julian (8 de junio de 2006). "Valgrind-3.2.0 para {x86, amd64, ppc32, ppc64}-linux está disponible" . Valgrind-developers (Lista de correo) . Consultado el 28 de octubre de 2025 .
- ↑ "Variantes y parches" . valgrind.org . Archivado del original el 25 de noviembre de 2025. Consultado el 28 de octubre de 2025 .
- ↑ Serebryany, Konstantin; Iskhodzhanov, Timur (2009). ThreadSanitizer: detección de condiciones de carrera en la práctica (PDF) . Actas del Taller sobre Instrumentación y Aplicaciones Binarias WBIA. Archivado del original (PDF) el 11 de julio de 2011. Consultado el 28 de octubre de 2025 .
- ↑ Seward, Julian (3 de enero de 2009). "Valgrind-3.4.0 está disponible" . Valgrind-announce (Lista de correo). Archivado del original el 22 de diciembre de 2025. Recuperado el 28 de octubre de 2025 .
- ↑ lma (9 de noviembre de 2010). "Valgrind 3.6.0 es compatible con ARMv7" . talk.maemo.org . Archivado del original el 23 de enero de 2025. Consultado el 28 de octubre de 2025 .
- ↑ Seward, Julian (21 de octubre de 2010). "Valgrind-3.6.0 y Valkyrie-2.0.0 están disponibles" . Valgrind-announce (Lista de correo). Archivado del original el 23 de diciembre de 2025. Recuperado el 28 de octubre de 2025 .
- ↑ Seward, Julian (7 de noviembre de 2011). "Valgrind-3.7.0 está disponible" . Valgrind-announce (Lista de correo). Archivado del original el 22 de diciembre de 2025. Recuperado el 28 de octubre de 2025 .
- ↑ Seward, Julian (23 de septiembre de 2015). "Valgrind-3.11.0 está disponible" (Lista de correo) . Consultado el 28 de octubre de 2025 .
- ↑ Nethercote, Nicholas (28 de mayo de 2009). "Mac OS X ahora es compatible con el tronco de Valgrind" . blog.mozilla.org . Archivado del original el 22 de diciembre de 2025. Consultado el 28 de octubre de 2025 .
- ↑ Seward, Julian (18 de noviembre de 2021). "Valgrind-3.18.1 está disponible" . Valgrind-announce (Lista de correo). Archivado del original el 12 de enero de 2025. Recuperado el 28 de octubre de 2025 .
- ↑ Wielaard, Mark (26 de abril de 2024). "Valgrind-3.23.0 está disponible" . Valgrind-announce (Lista de correo). Archivado del original el 17 de enero de 2025. Recuperado el 28 de octubre de 2025 .
- ↑ Seward, Julian (1 de noviembre de 2013). "Valgrind-3.9.0 está disponible" . Valgrind-announce (Lista de correo). Archivado del original el 1 de mayo de 2024. Recuperado el 28 de octubre de 2025 .
- ↑ Wielaard, Mark (25 de abril de 2025). "Valgrind-3.25.0 está disponible" . Valgrind-announce (Lista de correo). Archivado del original el 22 de diciembre de 2025. Recuperado el 28 de octubre de 2025 .
- ↑ "Hilo: [ Valgrind-developers ] [ valgrind ] Darwin: agregar soporte para macOS 10.14 | Valgrind, un depurador de memoria de código abierto" . sourceforge.net . Archivado del original el 22 de diciembre de 2025. Recuperado el 20 de diciembre de 2025 .
- ↑ " [ Desarrolladores de Valgrind ] [ valgrind ] Darwin: agregar soporte para macOS 10.15 | Valgrind, un depurador de memoria de código abierto" . sourceforge.net . Archivado del original el 23 de diciembre de 2025 . Recuperado el 20 de diciembre de 2025 .
- ↑ " [ Desarrolladores de Valgrind ] [ valgrind ] Error 513533 - Compatibilidad con macOS 11.0 (Big Sur) | Valgrind, un depurador de memoria de código abierto" . sourceforge.net . Archivado del original el 22 de diciembre de 2025 . Consultado el 20 de diciembre de 2025 .
- ↑ " [ Desarrolladores de Valgrind ] [ valgrind ] Error 513636 - Compatibilidad con macOS 12.0 (Monterey) | Valgrind, un depurador de memoria de código abierto" . sourceforge.net . Consultado el 23 de abril de 2026 .
- ↑ " [ Desarrolladores de Valgrind ] [ valgrind ] Error 513844 - Compatibilidad con macOS 13.0 (Ventura) | Valgrind, un depurador de memoria de código abierto" . sourceforge.net . Consultado el 23 de abril de 2026 .
- ↑ "devel/valgrind" . ports.su . Archivado del original el 20 de enero de 2025 . Consultado el 28 de octubre de 2025 .
- ↑ "Valgrind NetBSD port" . vg4nbsd.berlios.de . Archivado del original el 9 de febrero de 2006. Consultado el 28 de enero de 2006 .
- ↑ DragonFlyBSD. "DPorts/devel/valgrind en master · DragonFlyBSD/DPorts" . GitHub . Consultado el 12 de enero de 2026 .
- ↑ "Versión: rel9580" . community.qnx.com . Archivado del original el 24 de mayo de 2024. Consultado el 24 de mayo de 2024 .
- 1 2 "Valgrind" . valgrind.org . 1.2. ¿De dónde proviene el nombre "Valgrind"? Archivado del original el 30 de marzo de 2021. Recuperado el 28 de octubre de 2025.
Siguiendo con la temática nórdica, se eligió Valgrind. Valgrind es el nombre de la entrada principal al Valhalla (el Salón de los Caídos Elegidos en Asgard).
- ↑ "Grímnismál" . Völuspá.org . Archivado del original el 23 de enero de 2025. Consultado el 28 de octubre de 2025 .
- ↑ "Premios" . valgrind.org . Archivado del original el 4 de noviembre de 2025. Consultado el 28 de octubre de 2025 .
- ↑ "Premios Google-O'Reilly de Código Abierto – Salón de la Fama | Oficina de Programas de Código Abierto" . Google para Desarrolladores . Archivado del original el 30 de octubre de 2025. Consultado el 28 de octubre de 2025 .
- ↑ "Los desarrolladores de Valgrind" . valgrind.org . Archivado del original el 9 de julio de 2024. Consultado el 28 de octubre de 2025 .
- ↑ "Proyectos que utilizan Valgrind" . valgrind.org . Archivado del original el 26 de noviembre de 2025. Consultado el 28 de octubre de 2025 .
- ↑ "Preguntas frecuentes sobre Valgrind" . valgrind.org . 4.6. ¿Por qué Memcheck no encuentra los desbordamientos de array en este programa? Archivado del original el 30 de marzo de 2021. Consultado el 28 de octubre de 2025 .
Referencias
- Nethercote, Nicholas; Seward, Julian (10 de junio de 2007). "Valgrind: Un marco para la instrumentación binaria dinámica de alto peso" . ACM SIGPLAN Notices . 42 (6). ACM: 89– 100. doi : 10.1145/1273442.1250746 .
- Seward, Julian; Nethercote, Nicholas (10 de abril de 2005). "Uso de Valgrind para detectar errores de valor indefinido con precisión de bits" . Actas de la Conferencia Técnica Anual de USENIX 2005. Asociación USENIX: 2.
- Seward, Julian; Nethercote, Nicholas; Weidendorfer, Josef; Equipo de desarrollo de Valgrind (marzo de 2008). Valgrind 3.3: Depuración y análisis de rendimiento avanzados para aplicaciones GNU/Linux . Network Theory Ltd. 164 páginas. ISBN 978-0-9546120-5-4. OCLC 506228360 . OL 26010839M . Archivado del original el 18 de agosto de 2013 . Recuperado el 25 de junio de 2008 .
Enlaces externos
- Sitio web oficial
- Depuradores
- Depuradores de memoria libre
- Software gratuito de gestión de memoria
- Herramientas gratuitas para probar software
- Perfiladores
- Herramientas de prueba de software