2

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

4

1 に答える 1

2

!doオブジェクトダンプの一部として文字列値を提供します。オブジェクトの文字列フィールドを確認したい場合は!do、フィールド値を実行する必要があります。 !sosex.mdtは、文字列フィールドの横に文字列値をリストするため、この点で少し効率的です。

于 2013-08-29T12:05:55.233 に答える