2016-07-18 1 views
1

.NET 응용 프로그램에서 발생하는 핸들 누수를 조사해야하며 임의로 메모리 덤프를 처리해야합니다. 라이브 디버깅이나 모니터링을 할 수 없습니다.메모리 덤프에서만 .NET 응용 프로그램의 핸들 누수를 조사하십시오.

Visual Studio 2015, .NET 메모리 프로파일 러 및 Windbg에서 덤프 파일을 openend합니다. 내가 가장 많이 쓰레드 핸들 인 Windbg에서 100k 오픈 핸들을 나열 할 수있다 :

0:000> !handle 0006aaf8 f 
Handle 0006aaf8 
    Type     Thread 
    Attributes   0 
    GrantedAccess    0x1fffff: 
     Delete,ReadControl,WriteDac,WriteOwner,Synch 
     Terminate,Suspend,Alert,GetContext,SetContext,SetInfo,QueryInfo,SetToken,Impersonate,DirectImpersonate 
    HandleCount 3 
    PointerCount 5 
    Name     <none> 
    Object specific information 
    Thread Id 1f24.1ce1c 
    Priority 10 
    Base Priority 0 

그 후, 나는 붙어있다. 나는이 스레드 ID "1f24.1ce1c"로 무엇을 해야할지 모르겠다! 어떤 스레드와도 일치하지 않는 것 같다 (총 74 개 스레드). 내 관리 메모리와 관련하여 용의자가 보이지 않습니다. 일부 가이드는 추가 조사를 위해! htrace를 사용하도록 제안하지만, 내가 잘못 본 것이 아니라면 실행중인 프로세스에 연결할 때만 작동합니다.

나는 어떤 제안에도 감사 할 것입니다.

+0

핸들 누출은 치명적인 버그는 아닙니다. 디버깅 또는 인스트루먼트 빌드를 프로파일 링하지 않고 핸들 누수를 찾을 수없는 이유는 무엇입니까? 물론 * mad *와 같은 핸들을 누출하지 않으면 핸들 누수가 크래시를 유발하지 않을 가능성이 있습니다.이 경우 디버그 빌드에서 문제를 재현하기가 쉽습니다. –

+0

당신은 스레드 핸들이라고 말합니다. 스레드는 누가 작성합니까? 왜 코드를 대화식으로 디버깅 할 수 없습니까? 코드를 작성했거나 액세스 권한이 있습니까? –

+0

문제를 찾아 내기 위해 [Debug Diagnostic Tool] (https://www.microsoft.com/en-us/download/details.aspx?id=49924)을 실행할 수도 있습니다. – Igor

답변

0

네이티브 핸들을 보면 내 생각에 쓰레드 ID가 네이티브 인 것 같습니다. 귀하의 예제에서 1f24는 파이프 '|'를 입력하는 프로세스 ID 일 수 있으며 1ce1c는! threads가 표시하는 관리되는 ThreadId와 같지 않은 기본 ThreadId입니다. 해당 스레드 ID가 '~'명령을 실행중인 살아있는 스레드와 일치하는지 확인할 수 있습니다.

! htrace를 사용하여 핸들 추적을 사용하지 않으면 기본 트랙에서 다음 작업이 복잡해집니다. DebugDiag는 다른 제안처럼 도움이 될 수 있으며, 할당 기능을 연결하는 것처럼 트레이스를 처리하는 데 영향을 미치지 않습니다.

그렇지 않으면 .NET 코드와 관련 될 수 있다고 생각되면 관리 측에서 단서를 찾아 보시기 바랍니다. 이 원시 스레드 누수를 관리 객체 누수와 연관시킬 수 없습니까? dumpheap -stat는 많은 수의 System.Threading.Thread, System.Windows.Forms.Application + ThreadContext, System.Windows.Forms.Control + ControlNativeWindow 또는 그 외 항목을 표시하지 않습니다. 이러한 관리 객체 관계를 네이티브 핸들 누수와 관련시킬 수 있다면 적어도 더 많은 단서를 얻기 위해 그러한 객체 (! gcroot)의 GC 참조를 추적 할 수 있습니다.

관련 문제