2011-10-01 27 views
9

Mam proces, który jest gospodarzem WCF ServiceHost. Przecieka jak szaleje zgodnie z ProcessExplorer. Przeszedłem przez ten kod i nie mogę znaleźć niczego oczywistego, co powoduje wyciekanie uchwytów.Jak zdiagnozować wyciek uchwyt?

Najbliżej mogę przyjść na to zestawienie uchwytów dostarczonych przez ProcessExplorer, ale użyteczność, która wydaje ograniczona. Czy są jakieś inne narzędzia, które pomogą zdiagnozować, skąd pochodzi uchwyt, np. Za pomocą śladu stosu lub czegoś podobnego?

EDIT

Mam WinDBG zainstalowany. Gdy używam go do listy uchwyty, to pokazuje mi, że 914 uchwyty są typu „zdarzenie” -

Jeśli wybiorę kilka z nich, a wyjście z użyciem !handle x f uzyskać wynik podobny do tego na najbardziej:

Type   Event 
Attributes  0 
GrantedAccess 0x1f0003 
HandleCount 2 
PointerCount 3 
Object Specific Information 
    Event Type Manual Reset 
    Event is Set 

Czy istnieje sposób, aby kopać dalej, aby określić więcej o tym wydarzeniu?

+2

Visual Studio analizy kodu (lub FxCop) poinformuje Cię, jeśli nie udaje Ci się prawidłowo Usunąć zasoby. –

+0

John, jestem ciekawa, dlaczego wysłałeś swoją odpowiedź jako komentarz, a nie odpowiedź? –

+1

Nie sądzę, że to była odpowiedź. Miałem nadzieję, że ktoś inny poradzi sobie lepiej z tym pomysłem. –

Odpowiedz

12

Przepraszamy za wcześniejszą złą odpowiedź (obecnie usunięta wydaje).

Narzędzia debugowania dla pakietu Windows zawiera WinDbg i przyjaciół. WindDbg jest pełnym debuggerem takim jak Visual Studio, ale jest bardziej szczupły i złośliwy, i bardziej wydajny na wiele sposobów. Uruchom WinDbg, dołącz do procesu (F6) i wpisz !handle w oknie poleceń. Otrzymasz listę wszystkich uchwytów i niektórych statystyk. Jeśli przewiniesz w górę i zobaczysz uchwyt, który wygląda jak jeden z nieszczelnych, możesz wykonać !handle <handlenum> f, aby wyświetlić więcej informacji na jego temat. Na przykład, dołączając do iexplore.exe w moim systemie:

0:019> !handle 1bc f 
Handle 1bc 
    Type   Key 
    Attributes 0 
    GrantedAccess 0x2001f: 
     ReadControl 
     QueryValue,SetValue,CreateSubKey,EnumSubKey,Notify 
    HandleCount 2 
    PointerCount 3 
    Name   \REGISTRY\USER\S-1-5-21-498032705-2416727736-2837886327-1001\Software\Microsoft\Windows\CurrentVersion\Internet Settings 
    Object Specific Information 
    Key last write time: 11:04:51. 9/4/2011 
    Key name Internet Settings 

EDIT

Aby dowiedzieć się więcej informacji, można użyć polecenia htrace WinDBG!. Aby z niego skorzystać, dołącz do swojego procesu za pomocą windbg i wpisz !htrace -enable, a następnie wpisz g, aby wznowić proces. Przetwórz proces na nieco, a następnie włóż przy użyciu CTRL-Break (tj. CTRL-Pause). Wpisz !htrace -diff. Powinieneś zobaczyć listę śladów stosu pokazujących otwarte uchwyty i stos wywołań w momencie ich otwarcia. Jeśli nie masz skonfigurowanych symboli systemu Windows, jedynymi adresami, które będą miały sens, będzie twój własny kod - ale to powinno wystarczyć, aby uzyskać potrzebne wskazówki.

<snip> 
ModLoad: 00000000`75020000 00000000`7504d000 WINTRUST.dll 
ModLoad: 00000000`75160000 00000000`7527d000 CRYPT32.dll 
ModLoad: 00000000`757d0000 00000000`757dc000 MSASN1.dll 
(2fd0.1ce4): Break instruction exception - code 80000003 (first chance) 
ntdll!DbgBreakPoint: 
00000000`77440530 cc    int  3 
0:019> !htrace -enable 
Handle tracing enabled. 
Handle tracing information snapshot successfully taken. 
0:019> g 
(2fd0.2c88): Break instruction exception - code 80000003 (first chance) 
ntdll!DbgBreakPoint: 
00000000`77440530 cc    int  3 
0:019> !htrace -diff 
Handle tracing information snapshot successfully taken. 
0x360 new stack traces since the previous snapshot. 
Ignoring handles that were already closed... 
Outstanding handles opened since the previous snapshot: 
-------------------------------------- 
Handle = 0x000000000000070c - OPEN 
Thread ID = 0x0000000000000c44, Process ID = 0x0000000000002fd0 

0x000000007744232a: ntdll!NtOpenThread+0x000000000000000a 
0x0000000074c83910: wow64!whNtOpenThread+0x00000000000000a0 
0x0000000074c6cf87: wow64!Wow64SystemServiceEx+0x00000000000000d7 
0x0000000074bf2776: wow64cpu!TurboDispatchJumpAddressEnd+0x000000000000002d 
0x0000000074c6d07e: wow64!RunCpuSimulation+0x000000000000000a 
0x0000000074c6c549: wow64!Wow64LdrpInitialize+0x0000000000000429 
0x000000007746e707: ntdll! ?? ::FNODOBFM::`string'+0x0000000000029364 
0x000000007741c32e: ntdll!LdrInitializeThunk+0x000000000000000e 
0x00000000775f113a: ntdll_775d0000!ZwOpenThread+0x0000000000000012 
0x0000000075ea2e32: KERNELBASE!OpenThread+0x0000000000000049 
0x00000000755578df: iertutil!CIsoMalloc::AllocArtifact+0x0000000000000050 
0x00000000755578b4: iertutil!CIntraprocessMessageQueueSite::_QueryMessageThreadAffinityHelper_UntrustedSerializedIsoMessage+0x0000000000000055 
0x0000000075557754: iertutil!CIntraprocessMessageQueueSite::QueryMessageThreadAffinity+0x000000000000004b 
-------------------------------------- 
Handle = 0x0000000000000790 - OPEN 
Thread ID = 0x00000000000019d4, Process ID = 0x0000000000002fd0 

0x000000007744226a: ntdll!NtOpenKeyEx+0x000000000000000a 
0x0000000074c8d205: wow64!Wow64NtOpenKey+0x0000000000000091 
0x0000000074c8314f: wow64!whNtOpenKeyEx+0x0000000000000073 
0x0000000074c6cf87: wow64!Wow64SystemServiceEx+0x00000000000000d7 
0x0000000074bf2776: wow64cpu!TurboDispatchJumpAddressEnd+0x000000000000002d 
0x0000000074c6d07e: wow64!RunCpuSimulation+0x000000000000000a 
0x0000000074c6c549: wow64!Wow64LdrpInitialize+0x0000000000000429 
0x000000007746e707: ntdll! ?? ::FNODOBFM::`string'+0x0000000000029364 
0x000000007741c32e: ntdll!LdrInitializeThunk+0x000000000000000e 
0x00000000775f101a: ntdll_775d0000!ZwOpenKeyEx+0x0000000000000012 
0x0000000075ad2271: KERNEL32!LocalBaseRegOpenKey+0x000000000000010c 
0x0000000075ad2416: KERNEL32!RegOpenKeyExInternalW+0x0000000000000130 
0x0000000075ad2302: KERNEL32!RegOpenKeyExW+0x0000000000000021 
-------------------------------------- 
Handle = 0x0000000000000788 - OPEN 
Thread ID = 0x00000000000019d4, Process ID = 0x0000000000002fd0 

0x000000007744226a: ntdll!NtOpenKeyEx+0x000000000000000a 
0x0000000074c8d205: wow64!Wow64NtOpenKey+0x0000000000000091 
0x0000000074c8314f: wow64!whNtOpenKeyEx+0x0000000000000073 
0x0000000074c6cf87: wow64!Wow64SystemServiceEx+0x00000000000000d7 
0x0000000074bf2776: wow64cpu!TurboDispatchJumpAddressEnd+0x000000000000002d 
0x0000000074c6d07e: wow64!RunCpuSimulation+0x000000000000000a 
0x0000000074c6c549: wow64!Wow64LdrpInitialize+0x0000000000000429 
0x000000007746e707: ntdll! ?? ::FNODOBFM::`string'+0x0000000000029364 
0x000000007741c32e: ntdll!LdrInitializeThunk+0x000000000000000e 
0x00000000775f101a: ntdll_775d0000!ZwOpenKeyEx+0x0000000000000012 
0x0000000075ad2271: KERNEL32!LocalBaseRegOpenKey+0x000000000000010c 
0x0000000075ad2416: KERNEL32!RegOpenKeyExInternalW+0x0000000000000130 
0x0000000075ad2302: KERNEL32!RegOpenKeyExW+0x0000000000000021 
<snip> 
+0

Głupie pytanie ... Znalazłem to, co uważałem za narzędzie do debugowania dla pakietu Windows, ale po instalacji nie ma żadnej wzmianki o WinDbg - gdzie mam zainstalować oficjalnie, aby go pobrać? – bugfixr

+0

Mam to, musiałem zainstalować wersję 64-bitową, zanim zainstaluje narzędzia do debugowania. – bugfixr