pekeqの日記

過去に書いたブログエントリから反響のあったものを抜粋しています

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から提供されている。

DLLの使い方は上記のURLに記載があるが、英語なので以下にWindows XPにおける手順を載せておく。

  1. ダウンロードサイトからWinINET_Debug.exeをダウンロードし実行する。
  2. 実行するとWinZipの自動解凍ファイルなので、適当な場所に展開しておく。
  3. %SystemRoot%\System32\Wininet.dll のバージョンを調べる。
  4. WinINET_Debug.exeを展開したディレクトリから、一番近いバージョンのDLLを探す。例えば私がいま使っているXPでは、Wininet.dllのバージョンが6.0.2800.1485になっているが、このバージョンのデバッグ版はないのでwininetdebug.6.0.2800.1106フォルダの中にあるWininet.dllを使うことになる
  5. iexplore.exeのあるディレクトリ(例えばC:\Program Files\Internet Explorer)に、デバッグ用のDLLをコピーする。
  6. コマンドプロンプトを開き、iexplore.exeのあるディレクトリのあるディレクトリに移動する。(例:cd "C:\Program Files\Internet Explorer"
  7. iexplore.exeのあるディレクトリに、iexplore.exe.localという名前で空ファイルを作成する。(例:copy nul iexplore.exe.local
  8. コマンドプロンプトからset wininetlog=1と入力してEnter。
  9. コマンドプロンプトからiexplore.exeを実行。

この手順によって、実行ユーザのデスクトップにWININET.LOG.iexplore.exe.<PID>.LOGという名前のデバッグログファイルが作成される。
ログには全ての通信のダンプが記録されるため、あっという間にものすごいファイルサイズになってしまうので注意が必要だ。問題の起きる箇所がわかっているのなら、iexplore.exeの引数にURLを指定した方がよい。
また、手元の環境ではデバッグ用Wininet.dllに入れ替えるとIEのウィンドウを閉じるたびにメモリアクセスのエラーダイアログが出るようになってしまうのだが、別段気にしなくても良いようだ。

デバッグログの解析

デバッグログの簡単な読み方は、ダウンロードしてきたファイルを展開した先にある、inetdbg.txtというファイルに記載されている。予備知識なしにログを開いても大体内容の見当はつくと思うが、読んでおいた方が読むのがラクだ。
あと、ドキュメントの"Debugging Tips"にも記載があるが、複数の接続が同時に処理されるとログを追いづらい。HINTERNETのアドレスをキーに、個々の接続を追いかけるのがよいだろう。
また、ログ中に出てくるAPI呼び出しは、MSDNで調べれば大抵は出てくる。