Valgrind ( / v æ l ɡ r ɪ n d / ) es una herramienta de programación para la depuración de memoria , pérdida de memoria de detección, y de perfiles .
Autor (es) original (es) | Julian Seward |
---|---|
Desarrollador (es) | Equipo de desarrollo de Valgrind [1] |
Lanzamiento estable | 3.17.0 (19 de marzo de 2021 [±] [2] | )
Repositorio | |
Sistema operativo | Linux macOS Solaris Android [3] |
Tipo | Profiler , depurador de memoria |
Licencia | Licencia pública general GNU |
Sitio web | www |
Valgrind fue diseñado originalmente para ser una herramienta de depuración de memoria 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 perfiladores.
El nombre Valgrind es una referencia a la entrada principal de Valhalla de la mitología nórdica. Durante el desarrollo (antes del lanzamiento), el proyecto se llamó Heimdall ; sin embargo, el nombre habría entrado en conflicto con un paquete de seguridad.
Descripción general
Valgrind es, en esencia, una máquina virtual que utiliza técnicas de compilación justo a tiempo (JIT), incluida la recompilación dinámica . Nada del programa original se ejecuta directamente en el procesador host . En cambio, Valgrind primero traduce el programa a una forma temporal y más simple llamada Representación intermedia (IR), que es una forma basada en SSA y neutral para el procesador . Después de la conversión, una herramienta (ver más abajo) es libre de hacer las transformaciones que desee en el IR, antes de que Valgrind vuelva a traducir el IR al código de máquina y permita que el procesador host lo ejecute. Valgrind recompila código binario para ejecutarlo en CPUs de host y de destino (o simuladas) de la misma arquitectura. También incluye un código auxiliar 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 información diversa.
Se pierde una cantidad considerable de rendimiento en estas transformaciones (y generalmente, el código que inserta la herramienta); por lo general, el código se ejecuta con Valgrind y la herramienta "none" (que no le hace nada al IR) se ejecuta entre el 20% y el 25% de la velocidad del programa normal. [4] [5]
Herramientas
Memcheck
Hay varias herramientas incluidas con Valgrind (y varias externas). La herramienta predeterminada (y más utilizada) es Memcheck . Memcheck inserta código de instrumentación adicional alrededor de casi todas las instrucciones, lo que realiza un seguimiento de 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 direccionabilidad (si la dirección de memoria en pregunta apunta a un bloque de memoria asignado, no liberado), almacenado en los denominados bits V y bits A, respectivamente. A medida que los datos se mueven o manipulan, el código de instrumentación realiza un seguimiento de los bits A y V, por lo que siempre son correctos en un nivel de un solo bit.
Además, Memcheck reemplaza el asignador de memoria C estándar con su propia implementación, que también incluye protecciones de memoria alrededor de todos los bloques asignados (con los bits A establecidos en "inválidos"). Esta función permite que Memcheck detecte errores uno por uno cuando un programa lee o escribe fuera de un bloque asignado en una pequeña cantidad. Los problemas que Memcheck puede detectar y advertir son los siguientes:
- Uso de memoria no inicializada
- Lectura / escritura de la memoria después de que ha sido
free
'd - Leer / escribir el final de
malloc
los bloques 'd - Pérdidas de memoria
El precio de esto es la pérdida de rendimiento. Los programas que se ejecutan con Memcheck generalmente se ejecutan de 20 a 30 veces más lento [6] que los que se ejecutan fuera de Valgrind y usan más memoria (hay una penalización de memoria por asignación). Por lo tanto, pocos desarrolladores ejecutan su código bajo Memcheck (o cualquier otra herramienta de Valgrind) todo el tiempo. Por lo general, usan tales herramientas para rastrear algún error específico o para verificar que no hay errores latentes (del tipo que Memcheck puede detectar) en el código.
Otras herramientas
Además de Memcheck, Valgrind tiene varias otras herramientas: [7]
- Ninguno , ejecuta el código en la máquina virtual sin realizar ningún análisis y, por lo tanto, tiene la sobrecarga de CPU y memoria más pequeña posible de todas las herramientas. Dado que valgrind en sí mismo proporciona un rastreo desde una falla de segmentación , la herramienta none proporciona este rastreo con una sobrecarga mínima.
- Addrcheck , similar a Memcheck pero con una sobrecarga de CPU y memoria mucho menor, por lo que detecta menos tipos de errores. Addrcheck se ha eliminado a partir de la versión 3.2.0. [8]
- Macizo , un montón de perfiles . El visualizador de macizo GUI separado visualiza la salida de Massif.
- Helgrind y DRD , detectan condiciones de carrera en código multiproceso
- Cachegrind , un generador de perfiles de caché . La GUI separada 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 , herramienta de análisis dinámico del montón que analiza cuánta memoria se asigna y durante cuánto tiempo, así como los patrones de uso de la memoria.
- exp-sgcheck (llamado exp-ptrcheck antes de la versión 3.7), una herramienta experimental para encontrar errores de saturación de la pila y de la matriz global que Memcheck no puede encontrar. [9] Algunos códigos dan como resultado falsos positivos de esta herramienta. [10]
- exp-bbv , un simulador de rendimiento que extrapola el rendimiento de un pequeño conjunto de muestras.
También hay varias herramientas desarrolladas externamente disponibles. Una de esas herramientas es ThreadSanitizer, otro detector de condiciones de carrera . [11] [12]
Plataformas compatibles
A partir de la versión 3.4.0, Valgrind es compatible con Linux en x86 , x86-64 y PowerPC . Se agregó soporte para OS X en la versión 3.5.0. [13] Se agregó soporte para Linux en ARMv7 (usado por ejemplo en ciertos teléfonos inteligentes ) en la versión 3.6.0. [14] Se agregó soporte para Solaris en la versión 3.11.0. [3] Hay puertos no oficiales a otras plataformas similares a UNIX (como FreeBSD , [15] OpenBSD , [16] y NetBSD [17] ). A partir de la versión 3.7.0 se agregó la compatibilidad con la plataforma ARM / Android . [3]
Desde la versión 3.9.0 hay soporte para Linux en MIPS64 little y big endian, para MIPS DSP ASE en MIPS32, para instrucciones de coma flotante decimal s390x , para instrucciones POWER8 ( Power ISA 2.07 ), para instrucciones Intel AVX2 , para extensiones de sincronización transaccional Intel , tanto RTM como HLE y soporte inicial para memoria transaccional de hardware en POWER. [2]
Historia y desarrollo
Lleva el nombre de la entrada principal a Valhalla en la mitología nórdica . [18]
El autor original de Valgrind es Julian Seward , quien en 2006 ganó un premio Google-O'Reilly Open Source por su trabajo en Valgrind. [19] [20]
Varios otros también han hecho contribuciones significativas, incluidos Cerion Armor-Brown, Jeremy Fitzhardinge, Tom Hughes, Nicholas Nethercote, Paul Mackerras, Dirk Mueller, Bart Van Assche, Josef Weidendorfer y Robert Walsh. [21]
Es utilizado por varios proyectos basados en Linux. [22]
Limitaciones de Memcheck
Además de la penalización del 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 a la pila. [23] El siguiente código pasará la herramienta Memcheck en Valgrind sin incidentes, a pesar de contener los errores descritos en los comentarios:
int Estático [ 5 ]; int func ( void ) { int Stack [ 5 ]; Estático [ 5 ] = 0 ; / * Error - Estático [0] a Estático [4] existe, Estático [5] está fuera de límites * / Pila [ 5 ] = 0 ; / * Error - La pila [0] a la pila [4] existe, la pila [5] está fuera de los límites * / return 0 ; }
La herramienta experimental valgrind exp-sgcheck se ha escrito para abordar esta limitación en Memcheck. Detectará errores de saturación de la matriz, siempre que el primer acceso a una matriz esté dentro de los límites de la matriz. Tenga en cuenta que exp-sgcheck no detectará el desbordamiento de la matriz en el código anterior, ya que el primer acceso a una matriz está fuera de los límites, pero detectará el error de desbordamiento de la matriz en el siguiente código.
void func ( void ) { int i , Stack [ 5 ]; para ( i = 0 ; i <= 5 ; i ++ ) Pila [ i ] = 0 ; / * Dentro de los límites para i = 0..4, error fuera de los límites cuando i = 5 * / }
La incapacidad de detectar todos los errores relacionados con el acceso a los datos asignados a la pila es especialmente notable, ya que ciertos tipos de errores de pila hacen que el software sea vulnerable al clásico exploit que rompe la pila .
Ver también
- Análisis dinámico de programas
- Alfiler
- DynamoRIO
- VOGL
- Libumem
- AddressSanitizer et al.
Notas
- ^ https://valgrind.org/info/developers.html
- ^ a b Noticias de Valgrind
- ^ a b c Notas de la versión de Valgrind
- ^ Página de inicio de Valgrind
- ^ Manual de Valgrind
- ^ https://valgrind.org/docs/manual/quick-start.html#quick-start.mcrun
- ^ Lista de herramientas principal de Valgrind
- ^ [1]
- ^ sección sobre exp-sgcheck en el manual de usuario de Valgrind
- ^ [2]
- ^ https://valgrind.org/downloads/variants.html
- ^ K Serebryany, T Iskhodzhanov, ThreadSanitizer: detección de carrera de datos en la práctica , Actas del taller sobre instrumentación binaria y aplicaciones WBIA'09
- ^ Puerto OS X
- ^ Puerto ARM / Linux
- ^ Puerto Valgrind FreeBSD
- ^ Puerto Valgrind OpenBSD
- ^ "Puerto Valgrind NetBSD" . Archivado desde el original el 9 de febrero de 2006 . Consultado el 28 de enero de 2006 .
- ^ Preguntas frecuentes de Valgrind
- ^ Lista de premios de valgrind.org
- ^ Premios de código abierto Google-O'Reilly - Salón de la fama
- ^ Los desarrolladores de Valgrind
- ^ Lista de usuarios de valgrind.org
- ^ Preguntas frecuentes de Valgrind
Referencias
- Nethercote, Nicholas; Seward, Julian. "Valgrind: un marco para la instrumentación binaria dinámica de peso pesado" . Actas de la Conferencia ACM SIGPLAN 2007 sobre diseño e implementación de lenguajes de programación (PLDI 2007) . ACM.
- Seward, Julian; Nethercote, Nicholas. "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.
- Seward, J .; Nethercote, N .; Weidendorfer, J .; Equipo de desarrollo de Valgrind (marzo de 2008). Valgrind 3.3 - Depuración y creación de perfiles avanzados para aplicaciones GNU / Linux . Network Theory Ltd. págs. 164 páginas. ISBN 0-9546120-5-1.
enlaces externos
- Página web oficial