2012-03-15 5 views
5

Quiero comprobar un proceso prolongado para detectar fugas de memoria con valgrind. Sospecho que la pérdida de memoria que estoy buscando podría suceder solo después de varias horas de ejecución. Puedo ejecutar la aplicación en valgrind y obtener el registro valgrind muy bien, pero hacerlo significa que tengo que salir de la aplicación y volver a iniciarla de nuevo para una nueva sesión valgrind para la que todavía tendría que esperar varias horas. ¿Es posible mantener valgrind y la aplicación ejecutándose y aún obtener datos valgrind (parciales) en cualquier punto durante la ejecución?¿Puede valorar los informes parciales de salida sin tener que salir de la aplicación perfilada?

Respuesta

8

Puede hacerlo utilizando el Valgrind gdbserver and GDB.

En resumen, se inicia el programa con valgrind como de costumbre, pero con el interruptor --vgdb=yes:

$ valgrind --tool=memcheck --vgdb=yes ./a.out 

En otra sesión, se empieza GDB en el mismo ejecutable, y se conectan a valgrind. A continuación, puede emitir comandos valgrind:

$ gdb ./a.out 
... 
(gdb) target remote | vgdb 
.... 
(gdb) monitor leak_check full reachable any 
==8677== 32 bytes in 1 blocks are definitely lost in loss record 1 of 2 
==8677== at 0x4C28E3D: malloc (vg_replace_malloc.c:263) 
==8677== by 0x400591: foo (in /home/me/tmp/a.out) 
==8677== by 0x4005A7: main (in /home/me/tmp/a.out) 
==8677== 
==8677== 32 bytes in 1 blocks are definitely lost in loss record 2 of 2 
==8677== at 0x4C28E3D: malloc (vg_replace_malloc.c:263) 
==8677== by 0x400591: foo (in /home/me/tmp/a.out) 
==8677== by 0x4005AC: main (in /home/me/tmp/a.out) 
==8677== 
==8677== LEAK SUMMARY: 
==8677== definitely lost: 64 bytes in 2 blocks 
==8677== indirectly lost: 0 bytes in 0 blocks 
==8677==  possibly lost: 0 bytes in 0 blocks 
==8677== still reachable: 0 bytes in 0 blocks 
==8677==   suppressed: 0 bytes in 0 blocks 
==8677== 
(gdb) 

Consulte el manual para obtener una lista de comandos, here para memcheck.

Cuestiones relacionadas