Valgrind

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 29 de diciembre de 2020; las comprobaciones requieren 8 ediciones .
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 .

Resumen

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.

Herramientas

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.

Plataformas soportadas

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] ).

Limitaciones de Memcheck

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.

Notas

  1. http://valgrind.org/info/developers.html
  2. Valgrind: Lanzamientos actuales . Consultado el 16 de noviembre de 2013. Archivado desde el original el 13 de noviembre de 2013.
  3. El proyecto de código abierto valgrind en Open Hub: página de idiomas - 2006.
  4. Preguntas frecuentes sobre Valgrind . Consultado el 10 de diciembre de 2009. Archivado desde el original el 30 de marzo de 2021.
  5. Lista de usuarios en valgrind.org . Consultado el 10 de diciembre de 2009. Archivado desde el original el 14 de abril de 2022.
  6. Lista de premios en valgrind.org . Consultado el 10 de diciembre de 2009. Archivado desde el original el 26 de junio de 2021.
  7. Premios Google-O'Reilly Open Source - Salón de la fama . Consultado el 10 de diciembre de 2009. Archivado desde el original el 7 de septiembre de 2008.
  8. Desarrolladores de Valgrind . Consultado el 10 de diciembre de 2009. Archivado desde el original el 25 de noviembre de 2009.
  9. http://valgrind.org/info/about.html Archivado el 21 de agosto de 2012 en Wayback Machine "Dependiendo de la herramienta que uses, el factor de ralentización puede oscilar entre 5 y 100".
  10. SGCheck - http://valgrind.org/docs/manual/sg-manual.html Archivado el 25 de octubre de 2014 en Wayback Machine .
  11. Puerto Mac OS X. Consultado el 10 de diciembre de 2009. Archivado desde el original el 31 de mayo de 2009.
  12. Puerto FreeBSD de Valgrind . Consultado el 10 de diciembre de 2009. Archivado desde el original el 25 de julio de 2011.
  13. Port Valgrind NetBSD Archivado el 9 de febrero de 2006.
  14. Puerto Valgrind QNX . Consultado el 6 de marzo de 2017. Archivado desde el original el 6 de marzo de 2017.
  15. Preguntas frecuentes sobre Valgrind . Consultado el 10 de diciembre de 2009. Archivado desde el original el 30 de marzo de 2021.

Enlaces

Fuentes adicionales