2011-10-01 4 views
9

WCF ServiceHost를 호스팅하는 프로세스가 있습니다. 그것은 ProcessExplorer에 따라 미친 핸들을 유출합니다. 코드를 살펴보고 유출 된 핸들을 일으키는 명백한 것을 찾을 수 없습니다.손잡이 누출을 어떻게 진단합니까?

가장 가까운 곳은 ProcessExplorer에서 제공하는 핸들 목록이지만 그 유용성은 제한적으로 보입니다. 스택 트레이스 등을 통해 핸들이 어디서 왔는지 진단하는 데 도움이되는 다른 툴이 있습니까? 내가 설치 한 Windbg에서있어

편집 할 수 있습니다.

Type   Event 
Attributes  0 
GrantedAccess 0x1f0003 
HandleCount 2 
PointerCount 3 
Object Specific Information 
    Event Type Manual Reset 
    Event is Set 
: 내가 가장에 다음과 유사한 출력을 얻을 나는 이들의 몇 가지를 선택하면

, 출력은 !handle x f를 사용하여 - 내가 핸들을 표시하는 데 사용할 때 914 개 핸들 타입 "이벤트"의 것을 저를 보여주는 것

이벤트에 대해 더 자세히 결정할 수있는 방법이 있습니까?

+2

의 Visual Studio 코드 분석 또는 FxCop)은 자원을 적절하게 폐기하지 못한 경우 알려줍니다. –

+0

John, 궁금합니다. 왜 대답을 답이 아닌 댓글로 게시 했습니까? –

+1

답변이 많지 않다고 생각했습니다. 나는 다른 누군가가 그 아이디어로 더 잘할 수 있기를 바랐다. –

답변

12

죄송합니다. 이전의 악성 답변을 죄송합니다 (지금 삭제됨).

Windows 용 디버깅 도구에는 WinDbg 및 친구가 포함됩니다. WindDbg는 Visual Studio와 같은 완전한 디버거지만 더 가볍고 더 어둡고 여러면에서 더 뛰어난 기능을 제공합니다. WinDbg를 실행하고 프로세스 (F6)에 연결 한 다음 명령 창에 !handle을 입력하십시오. 모든 핸들과 통계 목록을 볼 수 있습니다. 위로 스크롤하여 새는 핸들 중 하나 일 수있는 핸들을 보면 !handle <handlenum> f을 사용하여 더 많은 정보를 표시 할 수 있습니다. 예를 들어, 연결은 내 시스템에 iexplore.exe를합니다 :

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 

편집

, 당신은 htrace windbg를 명령을 사용할 수 있습니다 자세한 내용을 확인하려면!를. 이를 사용하려면 windbg를 사용하여 프로세스에 연결하고 !htrace -enable을 입력 한 다음 g을 입력하면 프로세스가 재개됩니다. 약간의 과정을 연습 한 다음 CTRL-Break (즉, CTRL-Pause)을 사용하여 침입하십시오. !htrace -diff을 입력하십시오. 열려있는 핸들을 보여주는 스택 추적 목록과 열 때의 호출 스택이 나타납니다. Windows 기호가 설정되어 있지 않으면 이해할 수있는 유일한 주소는 자신의 코드가 될 것이지만 필요한 단서를 충분히 얻을 수 있어야합니다.

<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

멍청한 질문 ... 나는 윈도우 패키지 용 디버깅 도구라고 생각했던 것을 발견했지만, 설치 후 WinDbg에 대한 언급이 없다. 공식적으로 설치하려면 어디에서 설치해야합니까? – bugfixr

+0

디버깅 도구를 설치하기 전에 64 비트 버전을 설치해야했습니다. – bugfixr

관련 문제