2016-12-21 3 views
1

安定したハンドル数が2000年前後の運用環境(WINDOWS XP + .NET 3.5 SP1)で.NETアプリケーションを実行していますが、未知の状況ではハンドル数が非常に高速になり、 PerfMonツールで監視)。.NETアプリケーションのハンドルリーク、ソースの場所を確認するには?

私は増加期間(まだクラッシュしていない)の間にそこからメモリダンプを作ったとのWinDbgにインポートした

が、全体的にハンドルの概要を参照することができますので、

0:000> !handle 0 0 
7229 Handles 
Type   Count 
None   19 
Event   504 
Section   6108 
File   262 
Port   15 
Directory  3 
Mutant   56 
WindowStation 2 
Semaphore  70 
Key    97 
Token   2 
Process   3 
Thread   75 
Desktop   1 
IoCompletion 9 
Timer   2 
KeyedEvent  1 


   

驚きを、リークタイプがありますSection、もっと掘る:

0:000> !handle 0 ff Section 
Handle 00007114 
    Type   Section 
    Attributes 0 
    GrantedAccess 0xf0007: 
     Delete,ReadControl,WriteDac,WriteOwner 
     Query,MapWrite,MapRead 
    HandleCount 2 
    PointerCount 4 
    Name   \BaseNamedObjects\MSCTF.MarshalInterface.FileMap.IBC.AKCHAC.CGOOBGKD 
    No object specific information available 
Handle 00007134 
    Type   Section 
    Attributes 0 
    GrantedAccess 0xf0007: 
     Delete,ReadControl,WriteDac,WriteOwner 
     Query,MapWrite,MapRead 
    HandleCount 2 
    PointerCount 4 
    Name   \BaseNamedObjects\MSCTF.MarshalInterface.FileMap.IBC.GKCHAC.KCLBDGKD 
    No object specific information available 

... 
... 
... 
... 
6108 handles of type Section 

BaseNamedObjects'命名規則を見ることができますが、すべてMSCTF.MarshalInterface.FileMap.IBC.***.*****です。

基本的に私はここで停止し、アプリケーションに情報をリンクすることができませんでした。

誰でも手助けできますか?

[Edit0]

は、GFlagsコマンド(+ustまたはUIを介した)のいくつかの組み合わせを試してみましたがない運で、WinDbgので開かれたダンプは、常に!htraceを経由して何も見えないので、を使用していたプロセスを添付最終的に私はハンドルをリーク上記のスタックました:

0:033> !htrace 1758 
-------------------------------------- 
Handle = 0x00001758 - OPEN 
Thread ID = 0x00000768, Process ID = 0x00001784 

0x7c809543: KERNEL32!CreateFileMappingA+0x0000006e 
0x74723917: MSCTF!CCicFileMappingStatic::Create+0x00000022 
0x7473fc0f: MSCTF!CicCoMarshalInterface+0x000000f8 
0x747408e9: MSCTF!CStub::stub_OutParam+0x00000110 
0x74742b05: MSCTF!CStubIUnknown::stub_QueryInterface+0x0000009e 
0x74743e75: MSCTF!CStubITfLangBarItem::Invoke+0x00000014 
0x7473fdb9: MSCTF!HandleSendReceiveMsg+0x00000171 
0x7474037f: MSCTF!CicMarshalWndProc+0x00000161 
*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\Windows\system32\USER32.dll - 
0x7e418734: USER32!GetDC+0x0000006d 
0x7e418816: USER32!GetDC+0x0000014f 
0x7e4189cd: USER32!GetWindowLongW+0x00000127 
-------------------------------------- 

をして、私は再び捕まってしまった、スタックは、当社のユーザーコードのいずれかが含まれていないようで、前進のための提案は何ですか?

+0

WPR/Perfviewを使用してハンドルの使用状況をキャプチャし、WPA/Perfviewで解析します。http://geekswithblogs.net/akraus1/archive/2016/03/14/173308.aspx – magicandre1981

答えて

1

WinDbgはメモリリークのための理想的なツールではありません。

ハンドル割り振りのスタックトレースを記録するプロセスで有効にできるGFlagsオプション(+ust)があります。このフラグを有効にしていないと、おそらくダンプからさらに情報を得ることはできません。お持ちの場合は、!htraceを使用してスタックを表示してください。

UMDH (user mode dump heap)も無料ツールです。または確かにより良い使いやすさを持っているmemory validatorのようなものを手に入れてください。

+0

これで基本的にはプロダクションマシンを立ち上げ、別の問題の再生産を待つ。あなたが提案した '+ ust'で' GFlags'を有効にしたいのです。 – Shawn

+0

@Shawn:はい、それは次のステップになるはずです。さらに詳しい情報があれば、あなたの質問を編集することができます(自動的に警告がないので私に通知してください)か、新しい質問をしてください(範囲の変更の程度によって異なります)。 –

+0

@Weller私はプロダクションマシンにWinDbgとGFlagsをデプロイし、gflags/i "C:\ Program Files \ xxxx \ abc.exe" + ust'コマンドでGFlagsをアプリケーションに対して有効にしてから、アプリケーションアイコンをクリックし、プロセスエクスプローラから 'フルダンプ'を作成し、WinDbgにダンプをインポートし、 '!htrace'と打ち込んで、何も表示せず、ここで間違っていますか?私はアプリケーションにWinDbgを添付してアプリケーションの応答を大幅に減らす必要があり、基本的に顧客はこれを許可しません。 – Shawn

関連する問題