无法使用windbg在字典中找到键值对

时间:2017-03-22 18:09:23

标签: c# dictionary windbg

我目前正在分析.Net 4.0应用程序的应用程序挂起问题。根据几个线程的堆栈跟踪,我的猜测是字典中的几个键值对已被删除了一些方法。为了确认相同,我试图使用Windbg分析字典的内容

Dictionary object

可以看到字典中的“条目”是一个数组。因此尝试使用'!da'列出条目,但它不起作用。

尝试过!dumpvc(我知道它不适用于列表),但只是尝试了一下

!da and !dumpvc Results

当然!也行不通。

有人可以帮助我获取字典“条目”中的值列表。

1 个答案:

答案 0 :(得分: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)

它也适用于NetExt !wdict,虽然它不会进一步打印值(它支持DML,因此您可以点击链接):

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中的通用词典中)。