2011-10-26 11 views
7

Zajmuję się tworzeniem aplikacji C#, która wydaje się mieć wyciek. Użyłem profilera pamięci i okazało się, że mojaJak rozwiązać problem z bajtami Private bajtów (Native memory)?

prywatny bajtów ciągle wzrasta, ale bajtów we wszystkich Heaps nie, co oznacza, że ​​prawdopodobnie jest to rodzimy pamięć przeciekać

Teraz utknąłem, jak znaleźć wycieki pamięci w natywnym kodzie?

+0

Czy wiesz, gdzie jest wyciek? Nie możemy ci pomóc bez kodu ... –

+0

Nie piszesz natywnego kodu w C#. Z pewnością jedyną rzeczą, którą możesz zrobić, to upewnić się, że poprawnie posługujesz się InterOp? –

+0

Jest to typowy problem z profilerami, mówią one więcej, niż chciałeś wiedzieć. Rosnące prywatne bajty nie są niczym niezwykłym, może upłynąć trochę czasu, zanim się ustabilizuje. Czy otrzymujesz wyjątki OutOfMemory? Jeśli nie, odwróć w tym celu bit ignorowania. –

Odpowiedz

0

Trudno dać solidną odpowiedź bez dodatkowych informacji, ale wygląda na to, że lib, którego próbujesz użyć, ma wyciek pamięci. Będziesz potrzebował do biblioteki odpowiednich narzędzi, w zależności od języka, w jakim został napisany. Jeśli nie masz źródła biblioteki, skontaktuj się z programistami i poproś ich o naprawienie wycieku.

Jeśli możesz opublikować nazwę biblioteki i część kodu źródłowego (a także natywną sygnaturę metody), możemy udzielić Ci bardziej szczegółowych porad.

0

Prywatne bajty w hałdach zarządzanych przez platformę .net, potrzebne jest profesjonalne narzędzie do analizy źródła. np. użyj profilera pamięci czerwonej bramy, znajdź obiekt, ale nie zostań usunięty.

3

Diagnozowanie wycieków pamięci natywnej w zarządzanej aplikacji jest (przynajmniej początkowo) bardzo podobne do diagnozowania wycieków pamięci w dowolnej innej natywnej aplikacji.

Sposób, w jaki normalnie podchodzę do tych problemów, polega na tym, aby proces wyciekł z dużej ilości pamięci, wykonać pełny zrzut procesu, a następnie zbadać zrzut, aby zobaczyć, co zużywa najwięcej pamięci. Na przykład, jeśli twój proces ma normalne/początkowe prywatne bajty ~ 20MB, ale możesz sprawić, że twój proces wycieka z pamięci, dopóki nie ma ~ 200 MB prywatnych bajtów, to jest duża szansa, że ​​~ 180 MB tej pamięci wycieknie - ogólnie mówiąc cokolwiek ma najwięcej przydzielonej pamięci, to gdzie powinieneś zacząć szukać.

Microsoft ma bardzo przydatne narzędzie o nazwie DebugDiag - początkowo opracowane do użytku w diagnozowaniu wycieków pamięci w IIS, jest bardzo płynnym narzędziem i bardzo przydatne w rozwiązywaniu problemów z pamięcią. Jeśli wykonasz zrzut awaryjny, wykona on analizę i powinien (przynajmniej) powiedzieć, który moduł przydzielił całą tę pamięć, możesz wtedy zacząć bardziej szczegółowo analizować, w jaki sposób moduł ten jest używany.

3

Po pierwsze, jeśli masz zrzut procesu przecieka, można otworzyć go w WinDbg i wydać polecenie:! zająć -summary

  • jeśli funkcja RegionUsageHeap jest duża, to powinna być natywna wyciek pamięci
  • , jeśli regionUsageIsVAD, powinien to być przeciek pamięci .NET.

Jeśli jest to rodzimy przeciek, to masz 2 opcje:

  • Zastosowanie DebugDiag: gdy komunikat, wybierz „Native wyciek pamięci i uchwyt przeciek” wybierz proces, który chcesz diagnozować, i zacznij pracę z aplikacją, aż eksperymentujesz z wyciekiem pamięci. Po zakończeniu wygeneruj pełny zrzut aplikacji (kliknij prawym przyciskiem myszy regułę wycieku i wybierz Pełny zrzut użytkownika). Następnie możesz przeanalizować wygenerowany zrzut (musisz odpowiednio skonfigurować symbole, aby działał efektywnie): w zakładce "Analiza zaawansowana" wybierz "Analizatory ciśnienia pamięci", otwórz plik zrzutu i naciśnij "Rozpocznij analizę". Tworzy to i raport HTML, który możesz analizować. Możesz zapoznać się z tym page, aby zapoznać się ze szczegółowym opisem.

  • Użyj aplikacji Verifier/WinDbg. W aplikacji weryfikacyjnej wybierz swoją aplikację (.exe). Na stronie testów upewnij się, że wybrano opcję Podstawy/Heaps. W dolnym okienku upewnij się, że "Traces" jest ustawione na true. Po zapisaniu konfiguracji ponownie uruchom aplikację i wygeneruj pełny zrzut po wystąpieniu wycieku. Nie zapomnij wyczyścić flag aplikacji po wygenerowaniu zrzutu. Następnie możesz otworzyć zrzut z WinDbg i zbadać wyciek za pomocą polecenia "! Heap". W szczególności "! Heap -l" da ci listę przeciekających bloków, "! Heap -p -a" pokaże szczegóły bloku, w tym stos wywołań alokacji.

Jeśli jest to wyciek .NET, istnieją narzędzia innych firm do ich rozwiązania. Począwszy od wersji 1.2, DebugDiag umożliwia również przeprowadzanie analizy wycieków pamięci .NET (jednak nigdy tego nie próbowano).

Powiązane problemy