2011-10-01 16 views
9

私はWCF ServiceHostをホストしているプロセスがあります。 ProcessExplorerによれば、狂ったようなハンドルが漏れます。私はコードを去り、リークしたハンドルを引き起こしている何も明白なものを見つけることができません。ハンドルリークを診断するにはどうすればよいですか?

最も近いのは、ProcessExplorerが提供するハンドルの一覧ですが、その有用性は限られています。スタックトレースなどでハンドルがどこから来たのかを診断するのに役立つツールがありますか?私がインストールさWindbgのを持っている

EDIT。私はハンドルを一覧表示するためにそれを使用する場合は、「イベント」914のハンドルはタイプであることを私に見せて -

私はこれらのいくつかを選択し、出力は!handle x fを使用している場合、私はほとんどの上でこのような出力が得られます。

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

さらに詳しい情報を確認する方法はありますか?

+2

Visual Studioのコード分析(またはFxCop)は、リソースの適切な廃棄に失敗した場合に通知します。 –

+0

ジョン、私は不思議です、どうして答えはコメントであり、答えではないのですか? –

+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 

EDIT

を、あなたは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

ダム質問... Windowsパッケージのデバッグツールだと思ったのですが、インストール後にWinDbgについての言及はありません。正式にどこからインストールすればいいですか? – bugfixr

+0

それは、デバッグツールをインストールする前に、64ビット版をインストールしなければならなかった。 – bugfixr

1

メモリプロファイラを使用する - 彼らは、このようなリークを見つけるのを助けることができ、例えば:

+0

私はRedGate Memory ProfilerとSciTech Memory Profilerの両方を使用しています。私はパワーユーザーモードに入る必要があるとき、私はSciTech(memprofiler.com)に切り替えます。 – Philippe

関連する問題