我目前正在分析.Net 4.0应用程序的应用程序挂起问题。根据几个线程的堆栈跟踪,我的猜测是字典中的几个键值对已被删除了一些方法。为了确认相同,我试图使用Windbg分析字典的内容
可以看到字典中的“条目”是一个数组。因此尝试使用'!da'列出条目,但它不起作用。
尝试过!dumpvc(我知道它不适用于列表),但只是尝试了一下
当然!也行不通。
有人可以帮助我获取字典“条目”中的值列表。
答案 0 :(得分:1)
!da
为我编写的示例工作,它在this MSDN article中以相同的方式完成。然而,它根本不方便,因为你只需要获得一堆地址,然后你需要将它们分成键和值。
使用sosex扩展程序!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中的通用词典中)。