2016-12-01 7 views
7

潜在的なGDIハンドルリークをデバッグしています。 @Alois Krausのおかげで、ハンドルカウントを実行するWinDbg scriptがあります。GDIハンドル分析のためにWOW64ダンプが必要ですか?

私のデバッグセッションでは、especially for .NETから、通常32ビットプロセスの32ビットダンプと64ビットプロセスの64ビットダンプがあることがわかりました。

私が受け取った2つのクラッシュダンプでは、スクリプトは機能しません。それに深く見て、私はGdiSharedHandleTableはそれらのダンプでnullであることが判明:今

0:000> dt ntdll!_PEB GdiSharedHandleTable @$peb 
    +0x094 GdiSharedHandleTable : (null) 

his websiteに、アロイスは

重要

に言及している:あなたはあなたが必要とする64ビットOS上で実行している場合32ビットアプリケーションをデバッグしても64ビットWindbgをアタッチすることができます!

残念ながら、32ビットクラッシュダンプで64ビットWinDbgを使用することは役に立ちません。結果は変わりません。

が今ここに理論です:32ビットプロセスで

  • いくつかのDLLは、64ビットのDLLです(Windowsの内部5を参照して、第3章、 "システムの仕組み、" 211ページ)
  • ntdllは1です
  • GDIオブジェクトはユーザーオブジェクト(カーネルオブジェクトではありません)ですが、OSによってペイントされなければなりません。従って、これは私がそれを

を動作させるためにWOW64のクラッシュダンプを持っている必要があることを意味しますWOW64層

  • にそれらが管理されていることを要求される可能性があるので、私の質問は:私はめったにケースを持っていますここで私はWOW64クラッシュダンプが必要ですか?私の理論のより詳細な説明は素晴らしいでしょう。すでにある書籍に良い説明がある場合は、その章への言及で十分です。私はまだそれを持っていない場合、私はそれを購入します。

  • 答えて

    1

    GDIハンドルダンプでは、Win64コンピュータで32ビットプロセスであっても64ビットダンプを取る必要があります。 64ビットマシンで32ビットダンプを取る場合、GDI共有ハンドルテーブルへのポインタはnullです。この情報は、64ビットのダンプ用にしかキャプチャされていないようです。

    プロセスのGDIハンドルテーブル部分がカーネルスペースからアドレススペースにマップされるため、32ビットプロセスで64ビットポインタに対処する必要があるので理にかなっています。私は、32ビットプロセスには同じビット数のポインタしか含めるべきではないというルールと一貫性を保つために行われたと思います。初期化コードは、それはダンプのケースではありませんGdiSharedHandleTableがnull

    することができ、その後に実行されていない場合である

    2

    ダンプが取られた場合、プロセスはそのWinMain関数/メインに達する前に/のWinMainCRTStartupの/ etc
    これは通常の操作中にクラッシュしますが、たとえばcalcを起動した場合は、
    などの注記があります。windbgをでexeファイルと、それはGdiSharedHandleが
    NULLできるブレークができますが、@ $ exentryまたはCALCにブレークを設定した場合、入力されます最初のシステム上にあったときGdiSharedHandleTableをチェック!WinMain関数

    この出力を生成したスクリプトがされていますlinked threadあなたが使用しましたカルク

    0:000> dd @@c++(@$Peb->GdiSharedHandleTable) 
    
    00000000 ???????? ???????? ???????? ???????? 
    00000010 ???????? ???????? ???????? ???????? 
    00000020 ???????? ???????? ???????? ???????? 
    00000030 ???????? ???????? ???????? ???????? 
    00000040 ???????? ???????? ???????? ???????? 
    00000050 ???????? ???????? ???????? ???????? 
    00000060 ???????? ???????? ???????? ???????? 
    00000070 ???????? ???????? ???????? ???????? 
    
    0:000> g calc!WinMain 
    
    calc!WinMain: 
    00591635 8bff   mov  edi,edi 
    
    0:000> dd @@c++(@$Peb->GdiSharedHandleTable) 
    
    00470000 00000000 00000000 40000000 00000000 
    00470010 00000000 00000000 00000000 00000000 
    00470020 00000000 00000000 00000000 00000000 
    00470030 00000000 00000000 00000000 00000000 
    00470040 00000000 00000000 00000000 00000000 
    00470050 00000000 00000000 00000000 00000000 
    00470060 00000000 00000000 00000000 00000000 
    00470070 00000000 00000000 00000000 00000000 
    
    0:000> $$>a< c:\wdscr\dumpgdi.txt 
    
    gdioffs Kaddr  Pid  Count Handle Type  Tname IsLive UAddr  
    00472b30 fe6b5728 00000ca4 00000000 0d0102b3 00000001 DC  00000040 000e0cb0 
    00472be0 fdf73da8 00000ca4 00000000 420502be 00000005 Bitmap 00000040 00000000 
    004737b0 fddac108 00000ca4 00000000 9605037b 00000005 Bitmap 00000040 00000000 
    00474030 fe76eda8 00000ca4 00000000 eb050403 00000005 Bitmap 00000040 00000000 
    00474c90 fddde008 00000ca4 00000000 d70a04c9 0000000a Font  00000040 001fb1e8 
    0047ab80 fddab008 00000ca4 00000000 ba050ab8 00000005 Bitmap 00000040 00000000 
    0047f270 fddbcda8 00000ca4 00000000 16050f27 00000005 Bitmap 00000040 00000000 
    0047fef0 fdee4da8 00000ca4 00000000 cd050fef 00000005 Bitmap 00000040 00000000 
    004809f0 fe72eda8 00000ca4 00000000 3405109f 00000005 Bitmap 00000040 00000000 
    00480e50 fdda5aa8 00000ca4 00000000 0e0510e5 00000005 Bitmap 00000040 00000000 
    00481cf0 ffb0fda8 00000ca4 00000000 df0511cf 00000005 Bitmap 00000040 00000000 
    00481d70 fddb0da8 00000ca4 00000000 930511d7 00000005 Bitmap 00000040 00000000 
    00482020 ff4a1da8 00000ca4 00000000 d4051202 00000005 Bitmap 00000040 00000000 
    00482060 fddd4008 00000ca4 00000000 39051206 00000005 Bitmap 00000040 00000000 
    00482170 fddb6008 00000ca4 00000000 20051217 00000005 Bitmap 00000040 00000000 
    00483140 ff4a0008 00000ca4 00000000 4e051314 00000005 Bitmap 00000040 00000000 
    00483870 ff427980 00000ca4 00000000 6d051387 00000005 Bitmap 00000040 00000000 
    00483d80 fe7d04b0 00000ca4 00000000 bd0513d8 00000005 Bitmap 00000040 00000000 
    00484620 ff437eb8 00000ca4 00000000 0d101462 00000010 Brush 00000040 000f0fd8 
    004846a0 fddc2da8 00000ca4 00000000 d305146a 00000005 Bitmap 00000040 00000000 
    00484b80 fdf1a728 00000ca4 00000000 530114b8 00000001 DC  00000040 000e0ae0 
    
    
    Gdi Handles for C:\Windows\system32\calc.exe 
    Total Gdi Handles = 21 
    DC  = 2 
    Font  = 0 
    Region = 17 
    Brush = 0 
    Bitmap = 1 
    Pen  = 1 
    Pallete = 0 
    Unknpown = 0 
    

    enter image description here

    +0

    への答えとして掲載? Win 7 x64では、calcは64ビットです。あなたのデバッグセッションでは、 'dd @@ C++(@ $ Peb-> GdiSharedHandleTable)'は '00000000 00000000'を返すので、それはnullであり、スクリプトは動作しません。ただし、スクリプトを実行すると正しい結果が返されます。これは私にとっては矛盾しているようです。 –

    +0

    申し訳ありません私はdd poi()が2回目に見えるのは分かりません。appがsystembpにあるときに2回目、appがwinmainに初めて1回目のテーブルがヌルで2回目のテーブルが有効なメモリを指しているとき – blabb

    +0

    申し訳ありません失敗。 –

    関連する問題