¿Alguien puede proporcionar una explicación rápida de nivel superior de cómo funciona Valgrind? Un ejemplo: ¿cómo sabe cuándo se asigna y se libera memoria?
Valgrind básicamente ejecuta su aplicación en una "caja de arena". Mientras se ejecuta en esta caja de arena, puede insertar sus propias instrucciones para realizar depuraciones y perfiles avanzados.
Del manual:
Luego, su programa se ejecuta en una CPU sintética proporcionada por el núcleo de Valgrind. Cuando se ejecuta un 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 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 que se procesen las instrucciones de su aplicación, se pasan a 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 está diseñado para medir el rendimiento o ejecutarse durante la ejecución normal de su aplicación, por lo que esto no es realmente un problema.
Valgrind es una herramienta de análisis binario dinámico (DPA) que utiliza el marco de instrumentación binaria dinámica (DPI) para verificar la asignación de memoria, detectar puntos muertos y perfilar las aplicaciones. El marco DPI tiene su propio administrador de memoria de bajo nivel, programador, manejador de subprocesos y manejador de señales. La suite de herramientas Valgrind incluye herramientas como
La herramienta Valgrind utiliza un 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 Core desensambla el código de la aplicación y pasa el fragmento de código al complemento de la herramienta para la instrumentación. El complemento de la herramienta agrega el código de análisis y lo ensambla nuevamente. Por lo tanto, Valgrind proporciona la flexibilidad de escribir nuestra propia herramienta sobre el marco de Valgrind. Valgrind utiliza registros de sombra y memoria de sombra para instrumentar instrucciones de lectura / escritura, llamadas al sistema de lectura / escritura, asignaciones de pila y montón.
Valgrind proporciona envoltorios alrededor de la llamada al sistema y se registra para 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 sistema operativo entre el sistema operativo Linux y la aplicación cliente.
El diagrama ilustra las 8 fases de Valgrind:
fuente
valgrind se sienta como una capa entre su programa y el sistema operativo, interceptando llamadas al sistema operativo que solicitan la (des) asignación de memoria y registran lo que se está manipulando antes de asignar la memoria y devolver un equivalente. Esencialmente, así es como funcionan la mayoría de los perfiladores de código, excepto en un nivel mucho más bajo (llamadas al sistema en lugar de llamadas a funciones de programa).
fuente
Aquí puede encontrar buena información:
Además de familiarizarse con LD_PRELOAD.
fuente
Valgrind es básicamente una máquina virtual que ejecuta su programa. Es una arquitectura virtual que intercepta cada llamada para asignar / liberar memoria.
fuente