stringtranslate.com

Valgrind

Valgrind ( / ˈv æ l ɡ r ɪ n d / ) [6] es una herramienta de programación para depuración de memoria , detección de fugas de memoria y creación de perfiles .

Valgrind fue diseñado originalmente para ser una herramienta de depuración de memoria con licencia libre 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.

Descripción general

Valgrind es en esencia una máquina virtual que utiliza técnicas de compilación justo a tiempo , 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 estática de asignación única , neutral para el procesador . Después de la conversión, una herramienta (ver a continuación) es libre de hacer las transformaciones que quiera en la IR, antes de que Valgrind traduzca la IR nuevamente a código de máquina y permita que el procesador host lo ejecute. Valgrind recompila el código binario para ejecutarse en CPU host y de destino (o simuladas) de la misma arquitectura. También incluye un stub 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 variada.

En estas transformaciones se pierde una cantidad considerable de rendimiento (y, generalmente, el código que inserta la herramienta); normalmente, el código ejecutado con Valgrind y la herramienta "ninguno" (que no hace nada al IR) se ejecuta entre un 20% y un 25% de la velocidad del programa normal. [7] [8]

Herramientas

Comprobación de memoria

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, 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 la direccionabilidad (si la dirección de memoria en cuestión apunta a un bloque de memoria asignado, no liberado), almacenado en los llamados 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 a nivel de un solo bit.

Además, Memcheck reemplaza los asignadores estándar de C++ y el asignador de memoria de C con su propia implementación, que también incluye protectores 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 error de uno en uno cuando un programa lee o escribe fuera de un bloque asignado por una pequeña cantidad. Los problemas que Memcheck puede detectar y advertir incluyen los siguientes:

El precio de esto es una pérdida de rendimiento. Los programas que se ejecutan con Memcheck suelen ejecutarse entre 20 y 30 veces más lento [9] que los que se ejecutan fuera de Valgrind y utilizan 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) todo el tiempo. Lo más común es que utilicen estas herramientas para rastrear algún error específico o para verificar que no haya errores latentes (del tipo que Memcheck puede detectar) en el código.

Otras herramientas

Además de Memcheck, Valgrind tiene varias otras herramientas: [10]

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 encontrar errores de desbordamiento de pila y matriz global, que Memcheck no puede encontrar.

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 soporta Linux en x86 , x86-64 y PowerPC . El soporte para Linux en ARMv7 (usado por ejemplo en ciertos smartphones ) fue añadido en la versión 3.6.0. [14] El soporte para Solaris fue añadido en la versión 3.11.0. [5] El soporte para OS X fue añadido en la versión 3.5.0. [15] El soporte para FreeBSD x86 y amd64 fue añadido en la versión 3.18.0. El soporte para FreeBSD aarch64 fue añadido en la versión 3.23.0. Hay puertos no oficiales a otras plataformas tipo Unix (como OpenBSD , [16] NetBSD [17] y QNX [18] ). A partir de la versión 3.7.0 el soporte para la plataforma ARM/ Android fue añadido. [5]

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 punto flotante decimal s390x , para instrucciones POWER8 ( Power ISA 2.07 ), para instrucciones Intel AVX2 , para Intel Transactional Synchronization Extensions, tanto RTM como HLE y soporte inicial para memoria transaccional de hardware en POWER. [4]

Historia y desarrollo

El nombre Valgrind es una referencia a la entrada principal del Valhalla de la mitología nórdica . [19] [20] 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.

El autor original de Valgrind es Julian Seward , quien en 2006 ganó un premio Google-O'Reilly Open Source por su trabajo en Valgrind. [21] [22]

Varios otros también han hecho contribuciones significativas, entre ellos Nicholas Nethercote, Bart Van Assche, Florian Krohm, Tom Hughes, Philippe Waroquiers, Mark Wielaard, Paul Floyd, Petar Jovanovic, Carl Love, Cerion Armour-Brown e Ivo Raisr. [23]

Lo utilizan varios proyectos basados ​​en Linux. [24]

Limitaciones de Memcheck

Además de la penalización de 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. [25] El siguiente código pasará la herramienta Memcheck en Valgrind sin incidentes, a pesar de contener los errores descritos en los comentarios:

 int Static [ 5 ]; int func ( void ) { int Stack [ 5 ]; Static [ 5 ] = 0 ; /* Error - existen Static[0] a Static[4], Static[5] está fuera de los límites */ Stack [ 5 ] = 0 ; /* Error - existen Stack[0] a Stack[4], Stack[5] está fuera de los límites */ return 0 ; }                     


La incapacidad de detectar todos los errores que involucran 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 de destrucción de pila .

Véase también

Notas

  1. ^ "AUTORES". valgrind.org . Consultado el 19 de septiembre de 2022 .
  2. ^ "Valgrind: Los desarrolladores".
  3. ^ "Veinte años de Valgrind" . Consultado el 4 de agosto de 2023 .
  4. ^ de Valgrind Noticias
  5. ^ Notas de la versión de abc Valgrind
  6. ^ "Valgrind". valgrind.org . Consultado el 4 de mayo de 2023 .
  7. ^ Página de inicio de Valgrind
  8. ^ Manual de Valgrind
  9. ^ "Valgrind".
  10. ^ Lista de herramientas principales de Valgrind
  11. ^ "Valgrind".
  12. ^ "Valgrind: Variantes / Parches".
  13. ^ K Serebryany, T Iskhodzhanov, ThreadSanitizer: detección de carreras de datos en la práctica , Actas del taller sobre instrumentación binaria y aplicaciones WBIA'09
  14. ^ Puerto ARM/Linux
  15. ^ Puerto OS X
  16. ^ Puerto OpenBSD de Valgrind
  17. ^ "Puerto NetBSD de Valgrind". Archivado desde el original el 9 de febrero de 2006. Consultado el 28 de enero de 2006 .
  18. ^ "foundry27: Ver comunicado". community.qnx.com . Consultado el 24 de mayo de 2024 .
  19. ^ Preguntas frecuentes sobre Valgrind
  20. ^ "Grímnismál". Völuspá.org .
  21. ^ Lista de premios de valgrind.org
  22. ^ Premios de código abierto Google-O'Reilly: Salón de la fama
  23. ^ Los desarrolladores de Valgrind
  24. ^ Lista de usuarios de valgrind.org
  25. ^ Preguntas frecuentes sobre Valgrind

Referencias

Enlaces externos