如何用SOS读取字符串?

时间:2013-08-29 07:55:35

标签: .net memory-management windbg crash-dumps sos

我正在使用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

1 个答案:

答案 0 :(得分:1)

!do为您提供字符串值作为对象转储的一部分。如果要查看对象的字符串字段,则需要在字段值上运行!do!sosex.mdt在这方面效率更高一些,因为它会列出字符串字段旁边的字符串值。