2010-09-28 17 views
12

Recientemente desarrollé el hábito de ejecutar todos mis programas a través de valgrind para verificar si hay pérdidas de memoria, pero la mayoría de sus resultados han sido un poco crípticos para mí.Errores de valgrind a pesar de que se liberaron todos los bloques de montón

Por mi última ejecución, valgrind -v me dio:

All heap blocks were freed -- no leaks are possible 

Eso significa cubierto de mi programa de pérdidas de memoria, ¿verdad?

¿Qué significa este error? ¿Mi programa no lee ciertos bloques de memoria correctamente?

ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 14 from 9) 

1 errors in context 1 of 1: 
Invalid read of size 4 
    at 0x804885B: findPos (in /home/a.out) 
    by 0xADD918: start_thread (pthread_create.c:301) 
    by 0xA26CCD: clone (clone.S:133) 
Address 0x4a27108 is 0 bytes after a block of size 40 alloc'd 
    at 0x4005BDC: malloc (vg_replace_malloc.c:195) 
    by 0x804892F: readInput (in /home/a.out) 
    by 0xADD918: start_thread (pthread_create.c:301) 
    by 0xA26CCD: clone (clone.S:133) 

used_suppression:  14 dl-hack3-cond-1 

Además, ¿qué son los llamados "errores suprimidos" aquí?

Respuesta

12
  1. Sí, usted está cubierto en gran medida, no lo hacen piensan que valgrind fácilmente puede perderse una fuga en el código de usuario
  2. significa que su error que es probable que tiene un error de 1 en la indexación de una variable de matriz . las líneas que valgrind te dicen debe ser precisa, por lo que debería encontrar fácilmente que, siempre que se compila todo el código con -g
  3. errores suprimidos son por lo general de bibliotecas del sistema, que a veces tienen pequeñas fugas o cosas indetectables como el estado variables de hilos. su página de manual debe incluir el archivo de supresión que se utiliza por defecto
+0

Este es uno de los errores suprimidos, simplemente me dio "1 error suprimido" cuando usé valgrind sin -v. Entonces, no es mi dolor de cabeza, ¿verdad? –

+1

@crypto: ¿te refieres al error en 'findPos'? No, este es real, este es tu código que está haciendo algo mal. Sin el código en sí solo puedo adivinar, pero a partir del nombre de la función supongo que esto escanea una matriz y va más allá del límite asignado en algún caso de frontera. Compile con '-g' y valgrind le dirá la línea exacta. –

+0

Pero la ubicación final del error se establece como clone.S, sobre el cual no tengo control. –

18

Esto parece obvio ... pero podría valer la pena señalar que el mensaje "no leaks are possible" no quiere decir que el programa no puede escaparse; solo significa que no goteó en la configuración bajo la cual fue probado.

Si ejecuto lo siguiente con valgrind sin parámetros de línea de comandos, me informa que no hay fugas posibles. Pero se filtra si proporciono un parámetro de línea de comando.

int main(int argc, char* argv[]) 
{ 
    if (argc > 1) 
     malloc(5); 
    printf("Enter any command line arg to cause a leak\n"); 
} 
+1

+1 ¡buen comentario! –

1

Comprobación de fugas de memoria es una de las razones para usar valgrind, pero yo diría que es una razón mejor para encontrar los errores más graves en su código, como el uso de un subíndice de matriz no válida o eliminación de referencias a un puntero no inicializado o una puntero a la memoria liberada.

Es bueno si valgrind te dice que las rutas de código que ejercitaste al ejecutar valgrind no provocaron pérdidas de memoria, pero no permitas que ignores los informes de errores más graves, como el que eres viendo aquí.

Como otros han sugerido, volver a ejecutar valgrind después de compilar con la información de depuración (-g) sería un buen paso siguiente.

Cuestiones relacionadas