Descripción general
valgrind proporciona varias 'herramientas' para analizar diferentes tipos de problemas. La herramienta más utilizada es 'Memcheck', que detecta errores de memoria en tiempo de ejecución. Otras herramientas incluyen Cachegrind (perfilado de caché), Callgrind (perfilado de llamadas a funciones), Helgrind/DRD (detección de errores de hilos), Massif (perfilado de heap), entre otras.
Funciones principales
valgrind ofrece las siguientes funciones principales:
- Detección de fugas de memoria
- Detección de acceso incorrecto a memoria
- Detección de uso de valores no inicializados
- Detección de corrupción de heap
- Detección de condiciones de carrera en hilos
- Perfilado de caché de CPU y llamadas a funciones
Instalación
valgrind no suele estar incluido por defecto en la mayoría de las distribuciones de Linux, por lo que debe instalarse a través del gestor de paquetes.
Debian/Ubuntu
sudo apt update
sudo apt install valgrind
Se instala utilizando el gestor de paquetes APT.
RHEL/CentOS/Fedora
sudo yum install valgrind # o sudo dnf install valgrind
Se instala utilizando el gestor de paquetes YUM o DNF.
Opciones principales
valgrind se utiliza con varias herramientas, y cada herramienta tiene sus propias opciones. Aquí se describen las opciones utilizadas comúnmente con la herramienta Memcheck.
Opciones generales
Opciones de Memcheck
Comando generado:
Combina los comandos.
Descripción:
`valgrind` Ejecutando el comando.
Combina las opciones anteriores para ejecutar virtualmente los comandos junto con la IA.
Ejemplos de uso
Varios ejemplos para analizar programas usando valgrind. Se asume que se utiliza un archivo ejecutable llamado `my_program` en los ejemplos.
Comprobación básica de errores de memoria
valgrind ./my_program
El uso más básico para comprobar errores de memoria en `my_program`.
Comprobación detallada de fugas de memoria
valgrind --leak-check=full --show-leak-kinds=all ./my_program
Informa detalladamente sobre todos los errores de memoria, incluidas las fugas, y muestra todos los tipos de fugas.
Rastreo de valores no inicializados
valgrind --track-origins=yes ./my_program
Cuando se utilizan valores no inicializados, rastrea el origen de esos valores y los informa.
Perfilado de caché con Cachegrind
valgrind --tool=cachegrind ./my_program
Analiza el uso de la caché de la CPU para encontrar cuellos de botella de rendimiento. Los resultados se guardan en el archivo `cg.out.<pid>`.
Perfilado de llamadas a funciones con Callgrind
valgrind --tool=callgrind ./my_program
Analiza el número de llamadas a funciones y su coste. Los resultados se guardan en el archivo `callgrind.out.<pid>`.
Consejos y precauciones
Consejos y puntos a tener en cuenta para utilizar valgrind de manera efectiva.
Incluir símbolos de depuración
Para que valgrind informe los nombres de archivo y números de línea correctos, debe incluir símbolos de depuración al compilar el programa (por ejemplo, usando la opción `-g` en GCC/Clang).
- Usar la opción `-g` al compilar: `gcc -g my_program.c -o my_program`
Sobrecarga de rendimiento
valgrind ejecuta el programa en una máquina virtual, por lo que es mucho más lento que la ejecución normal (de 5 a más de 100 veces). Por lo tanto, puede no ser adecuado para pruebas sensibles al rendimiento o programas de larga ejecución.
- Aumento del tiempo de ejecución: 5-100 veces más lento que la ejecución normal
- Precaución al analizar programas a gran escala
Interpretación de la salida
La salida de valgrind es detallada, pero puede parecer compleja al principio. Lea atentamente los mensajes de error y los rastreos de pila, y concéntrese especialmente en los mensajes 'definitely lost' (fugas definidas) para resolverlos.
- Análisis de mensajes de error y rastreos de pila
- Resolver primero las fugas 'definitely lost'
Uso de otras herramientas
Además de Memcheck, existen varias herramientas como Cachegrind, Callgrind, Massif, etc., así que elija la herramienta adecuada según sea necesario.
- Análisis de rendimiento: `cachegrind`, `callgrind`
- Análisis de uso de heap: `massif`
- Problemas de hilos: `helgrind`, `drd`