2017-03-22 7 views
1

現在、.Net 4.0アプリケーションのアプリケーションハングの問題を分析しています。いくつかのスレッドのスタックトレースに基づいて、私の推測では、辞書のいくつかの重要な値のペアがいくつかの方法を削除されているということです。同じことを確認するために、私は、辞書の内容を分析しようとしています windbgを使用して辞書でキーと値のペアを見つけることができません

Dictionary object

Windbgの

を使用する際には、辞書の「エントリー」は配列であることを見ることができました。だから、 '!da'を使ってエントリをリストしようとしましたが、うまくいきません。

みました!dumpvc(私はそのリストには使用できません知っている)が、ちょうど

!da and !dumpvc Results

そしてもちろん、試してみてください!また、動作しないでくださいました。

誰かが辞書の「エントリ」の値のリストを取得してくれたら助かりますか?

+0

'!da'は私が書いたコードで動作します。あなたは[mcve]を投稿できますか? –

答えて

1

!daは、私が書いた例のために働きました。これはthis MSDN articleでも同じように行われます。しかし、あなたはキーと値に分割する必要があるたくさんのアドレスを取得するだけなので、それはまったく便利ではありません。

!mdt拡張の方がはるかに便利です。 -e:<depth>引数では、キーと値に展開されます。

0:000> !mdt -e:2 025332a4 
025332a4 (System.Collections.Generic.Dictionary`2+Entry[[System.String, mscorlib],[DumpDictionaryInWinDbg.Program+A, DumpDictionaryInWinDbg]][], Elements: 3, ElementMT=001951b4) 
[0] (System.Collections.Generic.Dictionary`2+Entry[[System.String, mscorlib],[DumpDictionaryInWinDbg.Program+A, DumpDictionaryInWinDbg]]) VALTYPE (MT=001951b4, ADDR=025332ac) 
    hashCode:0x68d80062 (System.Int32) 
    next:0xffffffff (System.Int32) 
    key:0253316c (System.String) Length=4, String="keyA" 
    value:02533280 (DumpDictionaryInWinDbg.Program+A) 
[1] (System.Collections.Generic.Dictionary`2+Entry[[System.String, mscorlib],[DumpDictionaryInWinDbg.Program+A, DumpDictionaryInWinDbg]]) VALTYPE (MT=001951b4, ADDR=025332bc) 
    hashCode:0x5d730062 (System.Int32) 
    next:0xffffffff (System.Int32) 
    key:025331a0 (System.String) Length=4, String="keyB" 
    value:025332e0 (DumpDictionaryInWinDbg.Program+A) 
[2] (System.Collections.Generic.Dictionary`2+Entry[[System.String, mscorlib],[DumpDictionaryInWinDbg.Program+A, DumpDictionaryInWinDbg]]) VALTYPE (MT=001951b4, ADDR=025332cc) 
    hashCode:0x520e0062 (System.Int32) 
    next:0xffffffff (System.Int32) 
    key:025331d4 (System.String) Length=4, String="keyC" 
    value:025332ec (DumpDictionaryInWinDbg.Program+A) 

それはさらに値(あなたがリンクをクリックすることができますので、それは、DMLをサポートしています)印刷されませんが、それはまた、NetExt!wdictで動作します:

0:004> !wdict 0228320C 
Items : 3 
[0]:==============================================(Physical Index: 1) 
System.__Canon key = 022831a0 keyB 
System.__Canon value = 022832e0 
[1]:==============================================(Physical Index: 0) 
System.__Canon key = 0228316c keyA 
System.__Canon value = 02283280 
[2]:==============================================(Physical Index: 2) 
System.__Canon key = 022831d4 keyC 
System.__Canon value = 022832ec 

SDbgExt2延長の請求への!DumpDictionaryコマンドがありますが、使用できませんでした。

と同じですが、PSSCOR4には!dcというコマンドがありましたが、廃止され、少なくとも.NET 4.6の一般的な辞書では失敗します。

+0

@ThomasWellerありがとうございます。 !mdtはディクショナリの値を取得することもできません(エラー '00000004000d0180は有効なObjectまたはMethodTableのアドレスではありません。')。私は一例を思いついた。しかし!da&!mdtはうまく動作します。できるだけ早く実際の例を掲載します。 –

関連する問題