2013-08-29 35 views
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

回答

1

!do爲您提供字符串值作爲對象轉儲的一部分。如果要查看對象的字符串字段,則需要在字段值上運行!do!sosex.mdt在這方面效率更高,因爲它會列出字符串字段旁邊的字符串值。

+0

感謝sosex http://www.stevestechspot.com/SOSEXV40NowAvailable.aspx。使用!mdt地址,我可以看到字符串字段的值。但我仍然想知道如何與SOS做到這一點。用!我得到只列出哪些是在問題中,我不知道如何訪問字段值(什麼是地址)以及如何讀取字符串。 – IvanH

+0

正如我所說的,你通過運行來做到這一點!在你拋棄的前一個對象的字符串字段上做!在上面的示例中:!do 1182390. –

+1

地址位於「值」字段中。 –