usar como valgrind

como - ¿Cómo funciona Valgrind?



valgrind c (5)

Aquí puedes encontrar buena información:

Además de familiarizarte con LD_PRELOAD.

¿Puede alguien proporcionar una explicación rápida de alto nivel de cómo funciona Valgrind? Un ejemplo: ¿cómo sabe cuándo se asigna y libera la memoria?


Valgrind básicamente ejecuta su aplicación en una "caja de arena". Mientras se ejecuta en este entorno limitado, puede insertar sus propias instrucciones para realizar una depuración y un perfil avanzados.

Del manual:

Su programa se ejecuta en una CPU sintética proporcionada por el núcleo de Valgrind. A medida que se ejecuta el nuevo código por primera vez, el núcleo entrega el código a la herramienta seleccionada. La herramienta agrega su propio código de instrumentación a esto y devuelve el resultado al núcleo, que coordina la ejecución continua de este código instrumentado.

Básicamente, valgrind proporciona un procesador virtual que ejecuta su aplicación. Sin embargo, antes de procesar las instrucciones de su aplicación, se pasan a las herramientas (como memcheck). Estas herramientas son como complementos, y pueden modificar su aplicación antes de que se ejecute en el procesador.

Lo mejor de este enfoque es que no tiene que modificar o volver a vincular su programa para ejecutarlo en valgrind. Hace que su programa se ejecute más lento, sin embargo, valgrind no tiene la intención de medir el rendimiento o ejecutar durante la ejecución normal de su aplicación, por lo que esto no es realmente un problema.


Valgrind es básicamente una máquina virtual que ejecuta su programa. Es una arquitectura virtual que intercepta cada llamada para asignar / liberar memoria.


Valgrind es una herramienta de Análisis Binario Dinámico (DPA) que utiliza el marco de Instrumentación Dinámica Binaria (DPI) para verificar la asignación de memoria, detectar interbloqueos y perfilar las aplicaciones. El marco DPI tiene su propio administrador de memoria de bajo nivel, programador, manejador de subprocesos y manejador de señal. Valgrind tool suite incluye herramientas como

  1. Memcheck: realiza un seguimiento dinámico de la asignación de memoria e informa sobre pérdidas de memoria.
  2. Helgrind - detecta e informa bloqueos muertos, posibles carreras de datos y reversiones de bloqueo.
  3. Cachegrind: simula cómo la aplicación interactúa con la memoria caché del sistema y proporciona información sobre errores de caché.
  4. Nulgrind: un valor simple que nunca hace ningún análisis. Utilizado por los desarrolladores para el rendimiento de referencia.
  5. Macizo: una herramienta para analizar el uso de memoria de la aplicación.

La herramienta Valgrind utiliza el mecanismo de desmontaje y resintetización donde carga la aplicación en un proceso, desensambla el código de la aplicación, agrega el código de instrumentación para el análisis, lo ensambla y ejecuta la aplicación. Utiliza Just Intime Compiler (JIT) para incrustar la aplicación con el código de instrumentación.

Valgrind Tool = Valgrind Core + Tool Plugin

Valgrind Core desmonta el código de la aplicación y pasa el fragmento de código al plugin de herramientas para la instrumentación. El complemento de herramienta agrega el código de análisis y lo ensambla. Por lo tanto, Valgrind proporciona la flexibilidad para escribir nuestra propia herramienta sobre el marco de Valgrind. Valgrind utiliza registros de sombra y memoria oculta para instruir instrucciones de lectura / escritura, lectura / escritura de llamadas al sistema, pila y asignaciones de pila.

Valgrind proporciona envoltorios alrededor de la llamada al sistema y registra las devoluciones de llamada previas y posteriores para cada llamada al sistema para rastrear la memoria a la que se accede como parte de la llamada al sistema. Por lo tanto, Valgrind es una capa de abstracción del SO entre el sistema operativo Linux y la aplicación cliente.

El diagrama ilustra las 8 fases de Valgrind:


valgrind se sienta como una capa entre su programa y el sistema operativo, interceptando llamadas al sistema operativo solicitando la asignación de memoria (de) y registrando lo que se está manipulando antes de asignar la memoria y devolver un equivalente. Esencialmente, la mayoría de los analizadores de código funcionan, excepto a un nivel mucho más bajo (llamadas al sistema en lugar de llamadas a funciones del programa).