小さい頃はエラ呼吸

いつのまにやら肺で呼吸をしています。


Visual Studio 2005でクラシックASPをデバッグする方法(IIS5.1)(翻訳)

Visual Studio 2005でクラシックASPをデバッグする方法を探していたら、以下のページを見つけました。Google翻訳を駆使して、訳してみました。

How to debug classic ASP pages in VS 2005: IIS 5.1

先日、Visual Studio 2005でクラシックASPをデバッグする方法(IIS 6)というエントリをブログに書きました。しかしながら、その方法では、Windows XP(IIS 5.1)において、デバッグすることが困難であることがわかりました。おそらくは、IISのデフォルトの設定では、IISプロセス内のエクステンションがロードされないというのが原因だと思われます。
以下のページに、ISAPI DLL のデバッグ方法が記載されています。(ASPは、IISのエクステンションです。)

ここで、最も重要なことは、ロードされたasp.dllのプロセスにアタッチしなければならないということです。
IISの設定で、アプリケーション保護の項目が「低」に設定されているとき、ホストのプロセスはinetinfo.exeとなります。一方、「中(プール)」や「高(分離プロセス)」に設定されている場合は、dllhost.exeとなります。しかしながら、ここでキャッチされるdllhost.exeは、プロセスの分離が要求される、すべてのダイナミックライブラリへのアクセスに使用される一般的なホストです。仮にdllがクラッシュしたり、メモリリークを起こした場合でも、dllhost.exeから生成された主なプロセスは、影響を受けないため、分離プロセスは非常に扱いやすいです。

タスクマネージャを開いたとき、実行中のdllhost.exeのプロセスを複数見つけることができるはずです。ASPページを実行する際に、はじめにASP拡張ライブラリをIISに強制的に読み込ませたいと思うかもしれません。その手順を以下に示します。

SysInternalsのページへアクセスし、ListDllsユーティリティをダウンロードします。デッドリンクになっていました。そして、コマンドウインドウを開き、以下のように入力します。

listdlls -d asp.dll

このコマンドは、プロセス名(dllhost.ext)とプロセスIDを教えてくれます。プロセスアタッチダイアログ内のプロセスIDを使って、スクリプトとしてアタッチします。
もし、asp.dllがリストに表示されていない場合には、クラシックaspはまだ起動されていません。

  1. Visual Studio 2005でクラシックASPを開きます。
  2. ブレークポイントを設定します。
  3. ブラウザでページを表示するか、あるいは、デバッグなしで実行します。
  4. コマンドラインからlistdlls -d asp.dllを実行します。そして、asp.dllをロードしているdllhost.exeを探し出します。
  5. プロセスにアタッチし、デバッグを開始します。
  6. 該当するIDのプロセスを見つけて、それをスクリプトとしてアタッチします。
  7. ページを更新すると、ブレークポイントがヒットします。