ラベル WinDbg の投稿を表示しています。 すべての投稿を表示
ラベル WinDbg の投稿を表示しています。 すべての投稿を表示

2015年11月28日土曜日

WOW64デッグ

.NETアプリのプラットフォームターゲットを「ANY CPU」でビルドすると、
・ 32bit 環境では32bit
・ 64bit 環境では64bit
で動作するようになる。
ただし、「ANY CPU」でビルドした実行ファイルが32bitの外部DLLを参照していた場合、64bit環境でこの実行ファイルを動作させると、32bitと64bitのアセンブリが共存することになり動作しない。
上記を回避するため、実行ファイルを常に32bitで動作させる、つまり64bit環境であれば、WOW64上で動作するように、プラットフォームターゲットを「x86」に指定してビルド&デプロイする。

上記のようなWOW64上で動作するアプリのダンプをWinDbgでデバッグしようとした場合には、「wow64exts.dll」というデバッグエクステンションが必要となったのでメモ。


2015年7月20日月曜日

ネットワークケーブルを用いたカーネルデバッグ

Windows8からはネットワークケーブルを用いたカーネルデバッグが可能という事なので試してみた。
シリアルケーブルで接続する時はホストPCとターゲットPCは1対1で接続する必要があったが、
ネットワークケーブルの場合は、1台のホストPCに複数台のターゲットPCを接続出来るので非常に便利。

2014年10月29日水曜日

SOS Cheat Sheet - MSDN Blogsへのリンク

SOS.dllのコマンドで何か便利なものは無いものか・・・と探していたらまとめページを発見。
いざという時はこれで大丈夫!

[参考]
・「SOS Cheat Sheet (.NET 2.0/3.0/3.5)
・「MANAGED DEBUGGING with WINDBG. Introduction and Index

2014年10月28日火曜日

WinDbg - ログ出力設定

Windbgの表示ウインドウのバッファの上限を超えてしまい、出力結果が流れてしまう時がある。
そんな時のためにログ出力設定をしておく。

 (ex)
 0:004> .logopen /t c:\log\test1.log
 Opened log file 'c:\log\test1_2c9c_2014-10-28_16-19-52-506.log'

/tをコマンドに付けると、前述した例の通り、指定したファイル名にタイムスタンプが付与されてログファイルが生成される。同じダンプファイルに対して複数回解析を行う時には、/tが便利。

[参考]
・「Keeping a Log File in WinDbg

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 がランタイム オブジェクトを作成するしくみ