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」というデバッグエクステンションが必要となったのでメモ。



WOW64上で動作している32bitプロセスに対して、通常のタスクマネージャーからダンプを取得すると、64bitのメモリダンプが取得される(※)。
上記のように取得したメモリダンプを、DebagDiagやWinDbgなどのツールから読み込もうとしても正常に動作しない。
(sos.dllなどのモジュール類が、ダンプから正しくデータを読むことができないからの模様)

(※)ちなみに「C:\Windows\SysWOW64\taskmgr.exe」のタスクマネージャーを使えばWOW64上の32bitメモリダンプを取得可能であり、前述した問題は生じない。
しかしながら、
 運用環境でアプリがフリーズ!
 ⇒サービスマンがログとダンプ(通常のタスクマネージャーから。。)を収集
 ⇒⇒インシデント対応チームへ解析依頼
といったケースだと頂いた64bitのメモリダンプから解析するしかないので、後述する手段を取る。


[その手段とは]
0:000> !wow64exts.sw
Switched to 32bit mode
(ユーザーモードでのWinDbgの例)

以上。
これで32bitのスタックを確認可能。もう一度同コマンドを実行すると64bitモードへ戻せる。
[参考資料]

0 件のコメント:

コメントを投稿