Uso de Valgrind
TIP
Para saber qué es Valgrind y para qué sirven Memcheck y Helgrind, te recomiendo haber visto esta guía.
Chequear el uso de memoria con Memcheck
Para ejecutar Valgrind en modo --leak-check=full
, los makefiles cuentan con una regla memcheck
:
make memcheck
Este comando se puede configurar editando la regla MEMCHECK_FLAGS
del archivo settings.mk
:
# Valgrind flags
MEMCHECK_FLAGS=--track-origins=yes --log-file="memcheck.log"
Chequear condiciones de carrera con Helgrind
Para ejecutar Valgrind en modo --tool=helgrind
, los makefiles cuentan con una regla helgrind
:
make helgrind
Este comando se puede configurar editando la regla HELGRIND_FLAGS
del archivo settings.mk
:
# Valgrind flags
HELGRIND_FLAGS=--log-file="helgrind.log"
Imprimir stack traces con Nulgrind
Valgrind provee una función que nos permite imprimir stack traces mientras estemos utilizando cualquiera de sus modos a través de su biblioteca:
#include <valgrind/valgrind.h>
Esta función se llama VALGRIND_PRINTF_BACKTRACE
y permite darle formato de la misma forma que printf
y los logs de las commons:
#include <valgrind/valgrind.h>
void funcion(char *str, int i) {
VALGRIND_PRINTF_BACKTRACE("%s: %d\n", str, i);
}
int main() {
funcion("Hola Mundo", 42);
return 0;
}
Sin embargo, este stacktrace solamente se imprime mientras utilicemos valgrind
, por lo que si compilamos este código y e intentamos ejecutarlo desde la consola no se va a imprimir nada.
Por lo tanto, los makefiles también incluyen una regla start
para ejecutar el proyecto con Valgrind en su modo más minimalista: Nulgrind
make start
De esta forma, vamos a poder imprimir el stack trace correctamente:
********* Hola Mundo: 42
========= at 0x10938B: VALGRIND_PRINTF_BACKTRACE (valgrind.h:6808)
========= by 0x1093F3: funcion (main.c:4)
========= by 0x109412: main (main.c:8)