2012-03-15 12 views
5

Chcę sprawdzić długotrwały proces wycieków pamięci za pomocą valgrind. Podejrzewam, że wyciek pamięci, o którym mówię, może nastąpić dopiero po kilku godzinach egzekucji. Mogę uruchomić aplikację pod kontrolą valgrind i uzyskać log Valgrind w porządku, ale oznacza to, że muszę opuścić aplikację i zacząć od nowa na nową sesję Valgrind, na którą wciąż będę musiał czekać kilka godzin. Czy możliwe jest utrzymanie valgrindu i uruchomionej aplikacji, a mimo to uzyskiwanie danych valgrind (częściowych) w dowolnym momencie podczas wykonywania?Czy można wykonać valgrindowe raporty częściowe bez konieczności zamykania profilowanej aplikacji?

Odpowiedz

8

Możesz to zrobić, korzystając z Valgrind gdbserver and GDB.

W skrócie, to uruchomić program z valgrind jak zwykle, ale z przełącznikiem --vgdb=yes:

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

W innej sesji, zaczynasz gdb na tym samym pliku wykonywalnego, a następnie podłącz do valgrind. Następnie można wydać Valgrind polecenia:

$ 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) 

Zobacz instrukcję dla listy poleceń, here dla memcheck.

Powiązane problemy