・ 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
|
以上。
これで32bitのスタックを確認可能。もう一度同コマンドを実行すると64bitモードへ戻せる。
[参考資料]
0 件のコメント:
コメントを投稿