2012-06-12 17 views
6

me sale mi mensaje final "hecho" con valgrind, y recibe este informe de salida:violación de segmento sólo sin valgrind

==3434== HEAP SUMMARY: 
==3434==  in use at exit: 8,432 bytes in 4 blocks 
==3434== total heap usage: 4,369 allocs, 8,037 frees, 377,356 bytes allocated 
==3434== 
==3434== LEAK SUMMARY: 
==3434== definitely lost: 152 bytes in 1 blocks 
==3434== indirectly lost: 0 bytes in 0 blocks 
==3434==  possibly lost: 0 bytes in 0 blocks 
==3434== still reachable: 8,192 bytes in 2 blocks 
==3434==   suppressed: 88 bytes in 1 blocks 
==3434== Rerun with --leak-check=full to see details of leaked memory 
==3434== 
==3434== For counts of detected and suppressed errors, rerun with: -v 
==3434== ERROR SUMMARY: 100190 errors from 140 contexts (suppressed: 0 from 0) 

Pero cuando lo ejecuto sin valgrind, que segfaults inmediatamente. ¿Valgrind suprime un cierto tipo de error que debería estar buscando? No puedo encontrar ninguna información sobre este en línea

+1

¿Alguna "lectura no válida" o "escritura no válida" en la salida valgrind? –

+0

toneladas de ellos. Esos deben ser malos. – SetSlapShot

+2

Sí. Significan que estás leyendo o escribiendo recuerdos que no son tuyos. Tengo que arreglarlos a todos. –

Respuesta

4

Valgrind ejecuta el programa en un entorno diferente que si lo ejecuta desde el shell. Esto puede evitar algunos bloqueos en relación con el agotamiento de la memoria o la salida de la matriz.

Corrija sus 140 contextos de errores y estará bien.

3

Memcheck no realiza la comprobación de límites completos y, como tiene su propio asignador de memoria, puede suprimir las fallas que de otro modo obtendría. Use un depurador en su lugar.

1

Un ejemplo de un error que Valgrind a veces no capta es cuando liberas memoria y luego lo referencia a través de otro puntero que también apunta al mismo lugar.

No estoy seguro de por qué sucede esto. Quizás el entorno de Valgrind maneje la asignación de memoria y la desasignación de manera diferente. [Como dice Eregrith]

Una forma rápida de comprobar esto sería comentar temporalmente las llamadas a la función free() y ver si todavía fallan. [Desártelos más tarde, una vez que los arregles!]