2014年10月28日火曜日

WinDbg - SOSのロード

●SOSのロード
.NETアプリのデバッグを行う場合はSOS(Son Of Strike)と呼ばれる拡張DLLが必要。.NETのインストールフォルダに存在するのでこれをロードする。

 %windir%\Microsoft.NET\Framework\<.NETジョン>\SOS.dll 
 %windir%\Microsoft.NET\Framework64\<.NETジョン>\SOS.dll


 (ex)
 0:000>.load C:\Windows\Microsoft.NET\Framework\v2.0.50727\SOS.dll
 0:000>.load C:\Windows\Microsoft.NET\Framework\v4.0.30319\SOS.dll
 0:000>.load C:\Windows\Microsoft.NET\Framework64\v2.0.50727\SOS.dll
 0:000>.load C:\Windows\Microsoft.NET\Framework64\v4.0.30319\SOS.dll
 ⇒ .NETのバージョンや32bit/64bitごとにそれぞれ存在する。
   どれを読み込むのかはmscoree.dllがアセンブリのメタデータやレジストリ値によって決定する。

前述した例の通り、デバッグ対象となる.NETアプリによって使用すべきSOS.dllが異なる。.NETのバージョンを調べたり、SOS.dllのフルパスを打ち込むのは面倒なので、.loadbyコマンドを使用すると便利。

 (ex)
 0:000>.loadby sos mscorwks ※.NET4.0より前
 0:000>.loadby sos clr       ※.NET4.0以降
 (結局.NETのバージョンを意識する必要がある。。)

.loadby sos * は、読み込み済みのmscorwks.dllやclr.dllと同フォルダに存在するSOS.dllをロードするコマンド。
勿論、mscorwks.dllやclr.dllをロードしていないタイミングだと実施出来ない。クラッシュダンプの解析などでは特に意識する必要はないが、エントリポイントの開始時点からデバッグしたいといったケースでは、clrjit.dllのロードタイミングでブレークポイントを張ってロードする。

 (ex)
 0:000>sxe ld:clrjit         ※sxe = Set Exception Enabledの略。ん?だったらseeでは。。
 0:000>g               ※clrjitがロードされるまで継続
 0:000>.loadby sos mscorwks ※ブレイクしたらsosをロード

sxe ld:*を実行すると、指定したdllのロード時にブレイクしてくれる。ld:mscorwksやld:clrとしても良いのだが、なるべく.NETのバージョンを意識したコマンドを打ちたくないので、バージョンによらず共通で読み込まれるclrjitを指定。

[参考]
SOS Debugging of the CLR, Part 1 – Jason Zander’s blog – Site Home – MSDN Blogs
・「SOS.dll (SOS Debugging Extension) 
・「.NET Framework の内部: CLR がランタイム オブジェクトを作成するしくみ

0 件のコメント:

コメントを投稿