Czy istnieje sposób, aby wykryć wyciek pamięci w uruchomionym procesie? Mogę użyć Valgrind do wykrywania wycieków pamięci przed rozpoczęciem procesu. Mogę użyć GDB, aby dołączyć go do uruchomionego procesu. Jak mogę debugować wycieki pamięci z uruchomionego procesu?
c
gdb
memory-leaks
howtechstuffworks
źródło
źródło
Odpowiedzi:
Oto prawie gwarancja kroków, aby dowiedzieć się, kto przecieka pamięć:
Znajdź PID procesu, który powoduje wyciek pamięci.
przechwyć
/proc/PID/smaps
i zapisz w jakimś pliku, takim jakBeforeMemInc.txt
./proc/PID/smaps
i zapisz goafterMemInc.txt
znajdź różnicę między pierwszym
smaps
a drugimsmaps
, np. za pomocądiff -u beforeMemInc.txt afterMemInc.txt
zanotuj zakres adresów, w których pamięć została zwiększona, na przykład:
użyj GDB, aby zrzucić pamięć przy uruchomionym procesie lub uzyskać zrzut rdzeniowy za pomocą
gcore -o process
Użyłem gdb podczas uruchamiania procesu, aby zrzucić pamięć do jakiegoś pliku.
teraz użyj
strings
polecenia lub,hexdump -C
aby wydrukowaćdump_outputfile.dump
Otrzymasz czytelną formę, w której możesz zlokalizować te ciągi w kodzie źródłowym.
Przeanalizuj swoje źródło, aby znaleźć wyciek.
źródło
Myślę, że memleax jest dokładnie tym, czego chcesz.
Debuguje wyciek pamięci uruchomionego procesu, dołączając go, bez ponownej kompilacji programu lub ponownego uruchamiania procesu docelowego. Jest to bardzo wygodne i odpowiednie dla środowiska produkcyjnego.
Działa na GNU / Linux i FreeBSD.
UWAGA: Jestem autorem, wszelkie sugestie są mile widziane
== EDYCJA ==
Piszę kolejne narzędzie libleak , które przechwytuje funkcje pamięci przez LD_PRELOAD.
Nie ma również potrzeby modyfikowania programu docelowego. Chociaż musisz ponownie uruchomić postęp z LD_PRELOAD, możesz włączyć / wyłączyć wykrywanie podczas działania.
Wpływ na wydajność jest znacznie mniejszy, ponieważ nie ma pułapki na sygnał.
W porównaniu z podobnymi narzędziami (takimi jak mtrace), drukuje pełny stos wywołań w podejrzanym punkcie przecieku pamięci.
źródło
W systemie Linux możesz włączyć mtrace w swoim programie, ale jest to zmiana kodu.
Na OpenBSD możesz wypróbować statystyki malloc .
Warto również sprawdzić narzędzie Google do sprawdzania szczelności , w przeciwieństwie do mtrace, którego można użyć,
LD_PRELOAD
aby uniknąć ponownej kompilacji.źródło
Myślę, że bez wsparcia monitorowania alokacji po uruchomieniu programu bezpośrednio w kodzie źródłowym nie masz szczęścia. Oto dwa powody, dla których mogę wymyślić:
Jeśli jednak program działa na maszynie wirtualnej, środowisko to może obsługiwać monitorowanie przydziałów. Wiem, że Java ma kilka narzędzi do monitorowania alokacji i czyszczenia pamięci (takich jak visualVM ), które dołączają się do uruchomionych programów lub maszyn wirtualnych.
źródło
IBM Purify jest prawdopodobnie najstarszym i najbardziej zaawansowanym narzędziem ze wszystkich. Będzie to oznaczać numer linii w kodzie, który powoduje wyciek pamięci.
źródło