●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 件のコメント:
コメントを投稿