Valgrind | |
---|---|
Tipo de | Profiler , depurador de uso de memoria |
Autor | Seward, Julián [1] |
Desarrollador | Desarrolladores Valgrind |
Escrito en | C [3] |
Sistema operativo | Linux , Mac OS X , Android [2] |
ultima versión | 3.19.0 ( 11 de abril de 2022 ) |
Licencia | Licencia Pública General GNU |
Sitio web | valgrind.org |
Valgrind es una herramienta para depurar el uso de la memoria , detectar fugas de memoria y crear perfiles . El nombre valgrind está tomado de la mitología nórdica , donde es el nombre de la entrada principal al Valhalla [4] .
Valgrind se creó originalmente como una herramienta gratuita para depurar el uso de la memoria en el sistema operativo Linux x86 , pero se ha convertido en un marco general para crear herramientas para el análisis dinámico del uso de la memoria, las pruebas de seguridad de subprocesos y la creación de perfiles. Usado en muchos proyectos basados en Linux [5] . Desde la versión 3.5, Valgrind también funciona con Mac OS X.
El autor original de Valgrind fue Julian Seward , quien ganó un segundo premio Google - O'Reilly Open Source Award en 2006 por su trabajo en Valgrind [6] [7] . Muchos otros también hicieron contribuciones significativas, incluidos Cherion Armor-Brown, Jeremy Fitzhardin, Tom Hughes, Nicholas Nethercoat, Paul Mackerras, Dirk Muller, Bart Van Assch, Joseph Weidendorfer y Robert Walsh [8] .
Valgrind es un software libre con licencia GPL .
Valgrind es esencialmente una máquina virtual que utiliza métodos de compilación JIT , entre los que se encuentra la recompilación dinámica . Es decir, el programa original no se ejecuta directamente en el procesador principal . En cambio, Valgrind primero traduce el programa a una forma temporal más simple llamada Representación intermedia (IR), que en sí misma es independiente del procesador y en forma SSA . Una vez convertida , la herramienta (ver a continuación) puede realizar cualquier conversión de IR necesaria antes de que Valgrind vuelva a traducir el IR a código de máquina y permita que el procesador principal lo ejecute. Se usa aunque se pueda usar traducción dinámica para esto (es decir, cuando los procesadores principal y de destino pertenecen a arquitecturas diferentes). Valgrind vuelve a compilar el binario para que se ejecute en los procesadores principal y de destino (o su simulador) de la misma arquitectura.
Debido a estas transformaciones, el rendimiento se reduce significativamente: por lo general, el código que se ejecuta bajo Valgrind y una herramienta "vacía" (que no hace nada) se ejecuta de 5 a 10 veces más lento en comparación con la ejecución directa del código; y con algunas herramientas, hasta 100 veces más lento [9] . Sin embargo, la forma IR es mucho más amigable con la instrumentación que la original, y simplifica enormemente la escritura de la instrumentación, y para la mayoría de los proyectos, la degradación del rendimiento durante la depuración no es un problema significativo.
El paquete Valgrind incluye muchas herramientas (algunas herramientas adicionales no están incluidas). La herramienta predeterminada (y la más utilizada) es Memcheck . Alrededor de casi todas las instrucciones, Memcheck inserta un código de instrumentación adicional que realiza un seguimiento de la legalidad (toda la memoria no asignada se marca inicialmente como inválida o "indeterminada" hasta que se inicializa en uno de los estados definidos, probablemente desde otra memoria) y direccionabilidad (si la memoria está sujeta a la asignación de dirección especificada, es decir, si está vacía) de operaciones de memoria, que se almacena en los llamados V-bits y A-bits, respectivamente. A medida que los datos se mueven y manipulan, el código de instrumentación realiza un seguimiento de los valores de los bits A y V para que siempre sean correctos en el nivel de un solo bit.
Además, Memcheck reemplaza la asignación de memoria C estándar con su propia implementación, que, entre otras cosas, incluye protecciones de memoria alrededor de todos los bloques asignados (que tienen bits A marcados como "no válidos"). Esta función permite que Memcheck detecte desbordamientos de búfer fuera de uno , en los que el programa lee o escribe memoria fuera del bloque asignado (con poco desbordamiento). (Otra forma de resolver este problema es implementar punteros de límite en el compilador, lo que reduce un poco la posibilidad de errores no detectados, especialmente en la memoria asignada en la pila en lugar de en la memoria asignada en el montón , pero requiere volver a compilar todo el binario instrumentado). detectar Memcheck incluyen:
El precio de esto es la pérdida de rendimiento. Los programas que se ejecutan con Memcheck tienden a ejecutarse de 5 a 12 veces más lento que cuando se ejecutan sin Valgrind, y también usan más memoria (debido a la asignación de una sobrecarga significativa de memoria). Por lo tanto, el código rara vez se ejecuta constantemente bajo Memcheck / Valgrind. La situación más común es cuando rastrean algún error específico o verifican que no haya errores ocultos de ciertos tipos en el código.
Además de Memcheck, Valgrind también tiene otras herramientas.
Según la documentación de la versión 3.4.0, Valgrind es compatible con Linux para arquitecturas x86 , x86-64 y PowerPC . Se agregó soporte para Mac OS X en la versión 3.5.0 [11] . Hay puertos no oficiales a otras plataformas similares a UNIX (como FreeBSD [12] , NetBSD [13] y QNX [14] ).
Además de la limitación de rendimiento, una limitación significativa de Memcheck es su incapacidad para detectar errores de límite cuando se utilizan datos estáticos o apilados [15] . El siguiente código pasará con éxito Memcheck sin ninguna advertencia, independientemente de los errores indicados:
int estático [ 5 ]; función int ( vacío ) { pila int [ 5 ]; Estático [ 5 ] = 0 ; /* Error: solo existe Static[0] antes de Static[4], Static[5] está fuera de la matriz */ Pila [ 5 ] = 0 ; /* Error: solo existe Stack[0] antes de Stack[4], Stack[5] está fuera de la matriz */ devolver 0 ; }La necesidad de detectar este tipo de error es particularmente importante debido a ciertos errores de manipulación de pilas , lo que hace que el software sea vulnerable al clásico exploit de destrucción de pilas .
Sin embargo, la utilidad experimental SGCheck para Valgrind es bastante capaz de detectar tales errores.
Perfiladores | |
---|---|
|