WinDbg と SOS (マネージ アプリケーションのフレームワーク コードで System.ExecutionEngineException をデバッグする方法) でクラッシュ ダンプを分析しています。
マネージド ヒープ上の特定のタイプのオブジェクトを一覧表示できます: String
!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
、or !do -nofields address
(!do =!DumpObj) を使用します。結果には、「 String: 」で始まる行があり、この行には目的の値が含まれています (私の場合、パスが含まれており、正しい値であるとは信じていませんでした)。
別のオブジェクトのフィールドであるオブジェクトにアクセスするには、列の値Value
を !do のアドレスとして使用します。したがって、例のフィールド m_Name に対して、 を実行します!do 0x01182390
。