我正在使用WinDbg和SOS(How to debug System.ExecutionEngineException in a framework code of a managed application)分析崩溃转储。
我能够在托管堆上列出某些类型的对象: 串
!DumpHeap -mt 7239afb0 -min 50
I can look at the class:
!DumpObj 0x0a7be6a4
Name: System.String
...
File: C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
String: C:\Program Files (x86)\XSLStylesheets
Fields:
MT Field Offset Type VT Attr Value Name
7239c770 40000aa 4 System.Int32 1 instance 74 m_stringLength
7239b9a8 40000ab 8 System.Char 1 instance 43 m_firstChar
7239afb0 40000ac c System.String 0 shared static Empty
现在如何读取字符串值?和如果字符串是类的字段,如何访问字符串?
Fields:
MT Field Offset Type VT Attr Value Name
...
7239afb0 4000719 c System.String 0 instance 01182390 m_Name
修改
因为我在评论后得到答案,我在这里作了解释。要获取字符串值,只需使用!do address
或!do -nofields address
(!do =!DumpObj)。在结果是行开始“ String:”,这一行包含所需的值(在我的情况下,它包含一个路径,我认为不是一个正确的值)。
要访问作为另一个对象的字段的对象,我们使用列Value
中的值作为!do的地址。因此,对于示例中的字段m_Name,我们运行!do 0x01182390
。
答案 0 :(得分:1)
!do
为您提供字符串值作为对象转储的一部分。如果要查看对象的字符串字段,则需要在字段值上运行!do
。 !sosex.mdt
在这方面效率更高一些,因为它会列出字符串字段旁边的字符串值。