Wininet.dll デバッグログの取得
Internet Explorerの問題を追いかけるのにすごい便利なのにGoogleで引いてもロクに出てこないのでまとめてみた
Wininet.dllの役割
WininetはHTTP, FTP, Gopherなどのプロトコルによってファイルを取得するためのAPIで、Wininet.dllはAPIの実体を実装した共有ライブラリだ。
Internet Explorerは様々なDLLの上に成り立っているが、Wininet.dllの位置づけを図にしてみた。見てわかるように、Wininet.dllは割と下のレイヤーにあるDLLだ。
デバッグログを取得する意味
IEの通信に関連した問題、例えばページのロード中に止まるとかいったことが発生するのは、大抵Wininet.dllかUrlmon.dllの中だ。Ethereal等でパケットキャプチャーを取得してもよくわからないIEの問題を追うのに、Wininetのデバッグログは非常に役立つ。問題解析の切り札として、知っておいて損はない。
デバッグログを取得するには
Wininetのデバッグログを取得するために、デバッグ版のWininet.dllがMicrosoftから提供されている。
- How to use the debug version of the Wininet.dll file for Internet Explorer - DLLファイルの使い方(英語)
- Download the debug version of the Wininet.dll file - デバッグ用DLLのダウンロード
DLLの使い方は上記のURLに記載があるが、英語なので以下にWindows XPにおける手順を載せておく。
- ダウンロードサイトからWinINET_Debug.exeをダウンロードし実行する。
- 実行するとWinZipの自動解凍ファイルなので、適当な場所に展開しておく。
- %SystemRoot%\System32\Wininet.dll のバージョンを調べる。
- WinINET_Debug.exeを展開したディレクトリから、一番近いバージョンのDLLを探す。例えば私がいま使っているXPでは、Wininet.dllのバージョンが6.0.2800.1485になっているが、このバージョンのデバッグ版はないのでwininetdebug.6.0.2800.1106フォルダの中にあるWininet.dllを使うことになる
- iexplore.exeのあるディレクトリ(例えばC:\Program Files\Internet Explorer)に、デバッグ用のDLLをコピーする。
- コマンドプロンプトを開き、iexplore.exeのあるディレクトリのあるディレクトリに移動する。(例:
cd "C:\Program Files\Internet Explorer"
) - iexplore.exeのあるディレクトリに、iexplore.exe.localという名前で空ファイルを作成する。(例:
copy nul iexplore.exe.local
) - コマンドプロンプトから
set wininetlog=1
と入力してEnter。 - コマンドプロンプトから
iexplore.exe
を実行。
この手順によって、実行ユーザのデスクトップにWININET.LOG.iexplore.exe.<PID>.LOGという名前のデバッグログファイルが作成される。
ログには全ての通信のダンプが記録されるため、あっという間にものすごいファイルサイズになってしまうので注意が必要だ。問題の起きる箇所がわかっているのなら、iexplore.exeの引数にURLを指定した方がよい。
また、手元の環境ではデバッグ用Wininet.dllに入れ替えるとIEのウィンドウを閉じるたびにメモリアクセスのエラーダイアログが出るようになってしまうのだが、別段気にしなくても良いようだ。