1
我正在用WinDbg和SOS分析崩潰轉儲(How to debug System.ExecutionEngineException in a framework code of a managed application)。如何用SOS讀取字符串?
我能列出在託管堆中某些類型的對象: 字符串
!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)。結果是起始行「字符串:」,並且該行包含所需的值(在我的情況下,它包含一個路徑,我不認爲它是一個正確的值)。
要訪問另一個對象字段的對象,我們使用Value
列中的值作爲!do的地址。因此,對於來自示例的字段m_Name,我們運行!do 0x01182390
。
感謝sosex http://www.stevestechspot.com/SOSEXV40NowAvailable.aspx。使用!mdt地址,我可以看到字符串字段的值。但我仍然想知道如何與SOS做到這一點。用!我得到只列出哪些是在問題中,我不知道如何訪問字段值(什麼是地址)以及如何讀取字符串。 – IvanH
正如我所說的,你通過運行來做到這一點!在你拋棄的前一個對象的字符串字段上做!在上面的示例中:!do 1182390. –
地址位於「值」字段中。 –