Jak śledzić / naprawić problem związany z pamięcią w dużym kodzie C / C ++ w systemach * nix


9

Jakiej strategii używasz do śledzenia problemu związanego z pamięcią? Jakich narzędzi używasz (zarówno open source, jak i zastrzeżonych) do identyfikowania wycieków pamięci, uszkodzenia pamięci itp.? Jak śledziłbyś wycieki pamięci, gdyby tylko system gdb / dbx był dostępny w systemie?

Dla mnie naprawianie wycieków pamięci tylko za pomocą debuggera jest bardzo trudne.


2
Osobiście uważam, że to pytanie jest bardziej związane z programowaniem niż z Uniksem.
phunehehe,

Odpowiedzi:


12

Jeśli możesz zmienić kod źródłowy, Dmalloc jest świetny; wyświetli listę, które wskaźniki nie zostały wprowadzone i (w przypadku kodu zbudowanego z symboli debugowania) dokładnie, w której linii zostały przydzielone.

Jeśli nie możesz, Valgrind jest właściwie standardem dla tego rodzaju rzeczy. Zasadniczo uważam, że Valgrind jest nieco trudniejszy w użyciu, ale ma znacznie więcej funkcji i nie wymaga dodawania wywołań dmalloc do kodu


dmalloc nie jest bardzo wydajny, jak oczekiwano w bardzo dużych systemach. valgrind to lepszy zakład i nawet tam trafisz na wąskie gardła ...

valgrind --tool memcheck "twoja aplikacja" poda informacje związane z pamięcią w czasie wykonywania (przydatne w systemach stacjonarnych). Kolejnym świetnym narzędziem jest memwatch, ale należy go skompilować wraz ze źródłem. Memwatch może rejestrować szczegóły w pliku, dzięki czemu jest bardziej odpowiedni dla systemów osadzonych.
rajaganesh87


2

Masyw (od valgrind) to jeden z najlepszych sposobów na wykrycie wycieków pamięci. Powtórz podejrzany kod (lub uruchom program wystarczająco długo) i zrzuć wynik za pomocą ms_print. Zwykle stos wywołań zawiera wystarczającą ilość informacji, aby go naprawić.

Za pomocą GDB możesz próbować dołączyć do działającego programu i wywołać funkcje takie jak malloc_stats()

Jeśli twój program jest napisany w innym języku, może to być trudniejsze. Ostatnio część GDB zyskała skryptowalność, a ludzie rozpoczęli ciekawe projekty, takie jak gdb-heap , które mogą analizować pamięć Python z zrzutu pamięci. Podobne skrypty analizy pamięci mogą być możliwe dla obiektów C ++.

Przeczytaj także /programming/2564752/examining-cc-heap-memory-statistics-in-gdb


1

W przypadku systemu Solaris istnieje kilka narzędzi wymienionych w odpowiedziach na to pytanie StackOverflow (obejmują one sprawdzanie szczelności z innymi formami złego dostępu do pamięci).


1

Od jakiegoś czasu zajmuję się Objective-C i istnieje analizator, który zajmuje się zarządzaniem pamięcią na poziomie C i tym podobne. Clang Static Analyzer jest tak dobry, że Apple zdecydowało się na dołączenie go do swojego IDE xCode. Nie jestem pewien, czy to jest dobre na twoje pytanie, ale jeśli robisz C, to warto spróbować.


Drobne spory: clang został opracowany do użycia w xcode od samego początku. Zobacz clang.llvm.org/clang_video-05-25-2007.html
Daniel James

Cześć Daniel, to może być prawda, ale do niedawna nie była zawarta w xCode (a przynajmniej nie w pakiecie, który
pobrałem
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.