ASP アプリケーションのデバッグ: Part 2
J.D. Meier
Microsoft Corporation
April 24, 2000
この記事は、もともと MSDN Online Voices のコラム "Servin' It Up" に掲載されたものです。
目次
パート 1
はじめに
ASP スクリプトのデバッグ
Microsoft Script Debugger を使用した ASP スクリプトのデバッグ
Visual InterDev デバッガを使用した ASP スクリプトのデバッグ
Global.asa ファイルのデバッグ
パート 2
Visual Basic デバッガを使用した Visual Basic コンポーネントのデバッグ
Visual InterDev からの Visual Basic コンポーネントのデバッグ
Visual C++ デバッガを使用した Visual Basic および Visual C++ コンポーネントのデバッグ
WinDBG を使用した Visual Basic および Visual C++ コンポーネントのデバッグ
まとめ
Visual Basic デバッガを使用した Visual Basic コンポーネントのデバッグ
Visual Basic コンポーネントを開発している人にとっては、Visual Basic デバッガがおそらく最適なツールとなるでしょう。Visual Basic デバッガは、ASP の下で実行される Visual Basic コンポーネントのデバッグに適していますが、いくつかの点に注意する必要があります。以下のセクションでは、これらの問題を取り上げ、Visual Basic コンポーネントのその他のデバッグ方法を紹介します。
セットアップ:
いくつかの一般的な問題が発生するのを防ぎ、Visual Basic コンポーネントのデバッグを効果的に行えるようにするために、開発マシンの構成を事前に行うようにしてください。
主に 2 つの作業を行っておく必要があります。
- Web アプリケーションは、メインの Web サービス (Inetinfo.exe) とは異なるメモリ空間内で実行します。
- IIS 5 では、Web アプリケーションのIIS 認証方式を変更するか、マシン上の DCOM 設定を変更します。
Web アプリケーションを Inetinfo.exe とは別のメモリ空間内で実行することにより、ASP を扱うときの一般的な問題を避けることができます。ASP からコンポーネントを呼び出した後に、そのコンポーネントを再コンパイルすると、Permission Denied エラーが発生することがあります(図 6 を参照)。これは、IIS がオブジェクトのクラス ファクトリをキャッシングしたためです (Q166279 "HOWTO: Lifetime of a COM Component Under IIS, ASP, and RDS" を参照)。
図 6. 再コンパイル時に Visual Basic が返す Permission Denied エラー
Web アプリケーションを別のメモリ空間内で実行すれば、再コンパイルが必要になったときに、そのアプリケーションをメモリからアンロードすることができます。IIS 5 のデフォルトの分離方式である [中 (プール)] は、Inetinfo.exeの外部の共有メモリ空間を使用しますが、この場合にはWebアプリケーションをアンロードすることはできません。IIS 5 では、Web アプリケーションのアプリケーション保護設定を [高 (分離プロセス)] に変更する必要があります (図 7を参照)。IIS 4.0 では、オプション [別のメモリ領域で実行する] が設定されていることを確認する必要があります。これらのオプションにアクセスするには、IIS 5ではインターネット サービス マネージャで Web アプリケーションを右クリックして、IIS 4.0ではインターネット サービス マネージャを右クリックして、[プロパティ] を選択します。
図 7. アプリケーション保護を [高 (分離プロセス)] に設定
アプリケーションがアウト プロセスで実行されていると、[アンロード] ボタンを使ってWebアプリケーションをメモリから削除することができます。[アンロード] ボタンは、Web アプリケーションのプロセス分離を設定するために使ったのと同じダイアログ ボックス上にありますが、Web アプリケーションがロードされているときにしか使用できません。Web アプリケーションをアウト プロセスで実行する方法の詳細については、「プロセス分離によるサーバーの信頼性向上」を参照してください。
さらに IIS 5 では、Web アプリケーションの IIS 認証レベルか DCOM 設定を変更する必要があります。さもないと、Visual Basic デバッガで Visual Basic オブジェクトをデバッグしようとしたときに、次の問題が発生します。
Server object, ASP 0178 (0x80070005)
The call to Server.CreateObject failed while checking permissions. Access is denied to this object.
/debugvb/DebugVb.asp, line 2
この問題と回避方法についての解説は、以下の記事にあります。
- Q259725 "PRB: Error Occurs When You Debug a COM+ Component Under the Visual Basic IDE with an ASP Client"
- Q244807 "PRB: Object Required Error for ObjectContext Under Windows 2000 in Visual Basic IDE and ASP"
KB の記事 「Q259725 "PRB: Error Occurs When You Debug a COM+ Component Under the Visual Basic IDE with an ASP Client" 」 に従って、DCOM の設定を変更してください。この問題は IIS 4.0 では発生しません。
デバッガの使用方法:
Visual Basic デバッガを使って、ASP の下の Visual Basic コンポーネントをデバッグするには、以下のステップを実行します。
Visual Basic で、コンポーネントの中の、ASP ページから呼び出されるメソッドにブレークポイントを設定します。このためには、[F9] キーを押すか、[デバッグ] メニューを選択して [ブレークポイントの設定/解除] を選択します。
Visual Basicで、[F5] キーを押すか、[実行] メニューを選択して [開始] を選択します。
これが初めてのデバッグ セッションである場合には、[プロジェクト プロパティ] ダイアログ ボックスに [デバッグ] タブが表示されることがあります(図 8を参照)。[コンポーネントが作成されるまで待機する] を使用するか、[ブラウザで次の URL を開く] オプションでテスト コンポーネントを呼び出す ASP ページの URL を指定します。前者の方法を使う場合は、コンポーネントを呼び出す ASP ページをブラウズする必要があります。URL を指定した場合には、ブラウザがそのページを実行します。その後、コンポーネントのデバッグを開始することができます。
図 8. プロジェクト デバッグ オプション
関連情報:
- ASP の下で Visual Basic Microsoft Transaction Server (MTS) コンポーネントをデバッグするときには、少なくとも Windows NT Service Pack 4 がインストールされており、コンポーネントが 0-NotAnMTSObject 以外に設定されていることを確認してください (「Q244457 "HOWTO: Debug an MTS Visual Basic Component Running Under ASP" 」を参照)。
- Windows 95/98 では MTS のデバッグはサポートされていないことに注意してください。
詳細については、以下の記事を参照してください。
- Q177182 "HOWTO: Debug a Visual Basic DLL under Active Server Pages"
- Q188919 "HOWOT: Avoid 'Error 91' when Debugging MTS Components with Visual Basic"
Visual InterDev からの Visual Basic コンポーネントのデバッグ
Visual InterDev からの Visual Basic コンポーネントのデバッグは、ASP スクリプトと Visual Basic コンポーネントをまたいでステップしなくてはならない場合に便利です。Visual InterDev からの Visual Basic コンポーネントのデバッグには、基本的に、Visual InterDev で ASP スクリプトをデバッグする方法と、Visual Basic で Visual Basic コンポーネントをデバッグする方法を組み合わせる必要があります。ただし、実際に Visual InterDev から Visual Basic コンポーネントのデバッグを行うわけではなく、Visual InterDev デバッガと Visual Basic デバッガの間を行き来することになります。
セットアップ:
Visual InterDev デバッガを正しく構成する必要があります(「Microsoft Visual InterDev 6.0 Debugging 」を参照)。
IIS 5 でデバッグを行うときには、IIS の認証方式を変更して Visual Basic コンポーネントにステップインできるようにしている場合でも、「Q259725 "PRB: Error Occurs When You Debug a COM+ Component Under the Visual Basic IDE with an ASP Client" 」の説明に従って DCOM 設定を変更する必要があります。DCOM 設定を変更しないと、Visual InterDev から Visual Basic コンポーネントにステップインしようとしたときに Server.CreateObject エラーが発生し、デバッグができなくなります(図 9を参照)。
図 9. Visual InterDev から Visual Basic をデバッグするときに発生する Server.CreateObject エラー
デバッガの使用:
DLL がすでにロードされている場合には、DLL をデバッグする前に IIS を再起動する必要があります。さもないと、ブレークポイントで実行を停止することができません。
Visual InterDev から Visual Basic コンポーネントをデバッグするには、以下のステップを実行します。
- Visual Basic で、コンポーネントの中の、ASP ページから呼び出されるメソッドにブレークポイントを設定します。このためには、[F9] キーを押すか、 [デバッグ] メニューを選択して [ブレークポイントの設定/解除] を選択します。
- Visual Basicで、[F5] キーを押すか、[実行] メニューを選択して [開始] を選択します。
- これが初めてのデバッグ セッションである場合には、[プロジェクト プロパティ] ダイアログ ボックスに [デバッグ] タブが表示されることがあります。 [コンポーネントが作成されるまで待機する] を選択してください。
- Visual InterDev の Project Explorer で、待機中の Visual Basic コンポーネントを呼び出す ASP ページを右クリックし、[Set As Start Page] を選択します。
- Visual InterDevで、ASPスクリプト内の行にカーソルを置き、[F9]キーを押して、デバッガのブレークポイントを設定します。
- 標準ツールバーの [開始] ボタンを押すか、[デバッグ] メニューの [開始] を選択します。
- ASP スクリプトをステップします。ASP スクリプトが Visual Basic コンポーネントの中のメソッドを呼び出したら、Visual Basic に切り替えて、コードのステップを続けることができます。Visual Basic メソッドが完了したら、Visual InterDev に戻って、ASP スクリプトのステップを続けることができます。
関連情報:
実際のサンプルとウォークスルーについては、KB の記事「Q200998 "HOWTO: Debug a Visual Basic DLL from Visual InterDev" 」を参照してください。
Visual C++ デバッガを使用した Visual Basic および Visual C++ コンポーネントのデバッグ
Visual C++ デバッガは、リッチなデバッグ機能を備えており、Visual C++ コンポーネントのデバッグには最適なツールです。しかし、Visual C++ デバッガは Visual Basic コンポーネントのデバッグにも使用することができます。このテクニックは、ASP の下で Visual Basic コンポーネントと Visual C++ コンポーネントの両方を扱っている場合、または対話ユーザーとは異なるセキュリティ コンテキストで実行されている Visual Basic コンポーネントをデバッグしなくてはならない場合に便利です。このセクションでは、Visual C++デバッガを使って Visual C++ コンポーネントと Visual Basic コンポーネントの両方をデバッグするための方法を説明します。
セットアップ:
Web アプリケーションを隔離されたメモリ空間内で実行します(「Visual Basic デバッガを使用した Visual Basic コンポーネントのデバッグ」のセクションを参照)。
コンポーネントのためのシンボルを作成します。Visual C++コンポーネントについては、DLLのデバッグ バージョンをビルドすることでシンボルを生成できます。Visual C++ の [ビルド] メニューで、[アクティブな構成の設定] を選択し、Win32 プロジェクト構成を選択してください(図 10を参照)。Visual C++ プロジェクトをビルドすると、プロジェクトの下の /Debug ディレクトリにシンボルが生成されます。
図 10. アクティブ プロジェクト構成の設定
Visual Basic コンポーネントについては、[プロジェクト プロパティ] ダイアログ ボックスの [コンパイル] タブのオプションを変更することで、シンボルを生成することができます。Visual Basicで、[プロジェクト] メニューを選択し、[<YourProject> のプロパティ] を選択します。これにより、プロジェクトのプロパティが表示されます。[コンパイル] タブに移動し、[ネイティブ コード コンパイル]、[最適化なし]、および [シンボリック デバック 情報を作成] を選択します (図 11を参照)。コンポーネントをコンパイルすると、シンボル ファイル (PDB) が生成されます。
デバッガの使用方法:
Visual C++ デバッガには、デバッグを開始するためにプロセスにアタッチする機能があります。Visual C++ からプロセスにアタッチするか、特定のプロセスのタスク マネージャからデバッガを起動します。通常、ASP を扱うときには、アタッチ先のプロセスを選択することになります。
Visual C++ デバッガを使って、ASP の下の Visual Basic または Visual C++ コンポーネントをデバッグするためにプロセスにアタッチするには、以下のステップを実行します。
Internet Explorer で、コンポーネントを呼び出す ASP ページをブラウズします。これで親の Web アプリケーションがロードされます。
Visual C++で、[ビルド] メニューの [デバッグの開始] を選択し、[プロセスへアタッチ] を選択します。[プロセスへアタッチ] ダイアログ ボックスが表示されます。IIS 5 では、[システム プロセスを表示] オプションが選択されていることに注意してください(図 12を参照)。これにより、アウト プロセス Web アプリケーションをホストしている dllhost のインスタンスにアタッチできるようになります。IIS 4.0 では、アウト プロセス Web アプリケーションをホストしている mtx のインスタンスが 1 つまたは複数表示されることがあります。[プロセスへアタッチ] ダイアログ ボックスが空の場合は、タスク マネージャからデバッガを起動する必要があります(下記を参照)。
目的のプロセス ID (PID) を確認し、[プロセスへアタッチ] ダイアログ ボックスからそのプロセスにアタッチします。[OK] をクリックします。IIS 5 では、Web アプリケーションの PID はコンポーネント サービス マネージャを使って調べることができます (図 13を参照)。コンポーネント サービス マネージャの [表示] メニューの [状態] を選択することで、実行中のアプリケーションの PID を表示することができます。ただし、[プロセスへアタッチ] ダイアログ ボックスに表示されている PID は 16 進表記になっています。Calc.exe ([スタート] - [ファイル名を指定して実行] - [Calc]) を使って、Component Services Manager で得られた PID を入力し、16 進に切り替えることで、PIDの16進値を調べてください。
図 13. Component Services Manager で PID を調べる
IIS 4.0 では、正しい PID を調べる方法がいくつか存在します。一般的な方法は、タスク マネージャを起動して、Web アプリケーション内の ASP ページに初めてアクセスしたときに現れる MTX.exe のインスタンスを確認するというものです。タスク マネージャで MTX のインスタンスを表示すると、インプロセスの IIS アプリケーションをホストしているインスタンスが少なくとも 1 つはすでに表示されているでしょう。これよりも信頼の置ける方法は、Windows NT 4.0 Service Pack 4 以降をインストールしているという前提で、Microsoft Script Debugger を使用するというものです。Microsoft Script Debugger の [実行中のドキュメント] ウィンドウには、Web アプリケーションの名前とそれに対応する PID が表示されます。もう 1 つの方法として、IIS 4.0 Resource Kit に付属するユーティリティである GETPID を使用するか、EMCMD.EXE の /p オプションを使用することができます。EMCMD.EXE は、WINDBG をダウンロードしたときに入手できる DBG.EXE に含まれています。
正しいプロセスにアタッチしたら、コンポーネントのシンボルをロードする必要があります。Visual C++ の [プロジェクト] メニューで、[設定] を選択します。これにより、[プロジェクトの設定] ダイアログ ボックスが表示されます。[デバッグ] タブに移動して、[カテゴリ] ドロップダウンから [追加する DLL] を選択します。DLL を、[モジュール] の下の [ローカル名] に追加します(図 14を参照)。
Visual C++ で、コンポーネントのソース ファイルを開きます。このためには、[ファイル] メニューから [開く] を選択するか、ツールバーの [開く] ボタンをクリックします。Visual Basic コンポーネントをデバッグしているときには、デバッグする Visual Basic ソースを含んでいる Cls ファイルを開く必要があるので、[ファイルの種類] オプションで [全てのファイル] を選択してください。
[F9] キーを押すか、[ブレークポイントの挿入/削除] ツールバー ボタンをクリックして、ソース ファイルの中にブレークポイントを設定します。ブレークポイントを設定できない場合には、PDB ファイルとソース ファイルの同期が失われていると考えられます。通常は、コンポーネントをリビルドすることで問題が解決されます。
ブラウザの表示を更新します。Visual C++ はブレークポイントで実行を停止します。これで、デバッガを使ってコードをステップできるようになりました。
プロセス リストが空であるような場合には、タスク マネージャからデバッガを起動しなければならないことがあります(「Q235434 "BUG: 'Attach to Process' List Is Empty" を参照)。タスク マネージャから特定のプロセスに対してデバッガを起動するには、以下のステップを実行します。
Internet Explorer で、コンポーネントのメソッドを呼び出す ASP ページをブラウズします。
タスク マネージャを起動します([スタート] - [ファイル名を指定して実行] - [Taskmgr])。
正しい PID を右クリックし(前述のテクニックを使用)、[デバッグ] を選択します(図 15を参照)。警告ダイアログ ボックスが表示され、デバッガをアタッチしてよいかどうかを尋ねてくることがあります。[はい] を選択してください。
4. 前のセクションのステップ 4 ~ 7 を実行します。
Visual C++ デバッガでのデバッグを終了すると、オリジナルのプロセスが破壊されることに注意してください。デバッグしているアウト プロセスの Web アプリケーション (IIS 5 では Dllhost.exe、IIS 4 では MTX.exe) では、次のエラー メッセージが表示されることがあります。
The remote procedure call failed and did not execute.
この場合には、単に ASP ページの表示を更新してください。
関連情報:
以下の KB の記事に関連情報があります。
- Q177182 "HOWTO: Debugging a Visual Basic DLL under Active Server Pages"
- Q183480 "Debug ISAPI and Filter DLL Under IIS 4.0"
- Q98890 "HOWTO: Debugging a Service"
WinDBG を使用した Visual Basic および Visual C++ コンポーネントのデバッグ
WinDBG の使用方法は、プロセスにアタッチし、シンボルとソースをロードし、コードをデバッグするという作業の流れの点では、Visual C++ デバッガに似ています。このプログラムは Visual Studio よりも軽く、マシン上に Visual Studio がインストールされている必要もありません。WinDBG では、ソースのステップを行うことが可能です。
セットアップ:
- WinDBG をインストールします。これは Platform SDK Windows 2000 Debuggers サイトから無償でダウンロードすることができます。このバージョンの WinDBG は、Windows NT 4.0 と Windows 2000 の両方で動作します。
- コンポーネントのためのシンボルを作成します(「Visual C++ デバッガを使用した Visual Basic および Visual C++ コンポーネントのデバッグ」のセクションのステップに従います)。
- ソースとシンボル(Visual Basic の PDB ファイル)を、ターゲット マシン上のコンポーネントと同じディレクトリに格納します。
デバッガの使用方法:
ASP の下のコンポーネントに対して WinDBG デバッガを使用するには、以下のステップを実行します。
Internet Explorer で、コンポーネントのメソッドを呼び出す ASP ページをブラウズします。これにより、Webアプリケーションがまだ実行されていなかった場合には、Dllhost.exe (IIS 5) または MTX.exe (IIS 4.0) のインスタンスが起動されます。
デバッガをアタッチする正しい PID を調べます(「Visual C++ デバッガを使用した Visual Basic および Visual C++ コンポーネントのデバッグ」のセクションのステップに従います)。WinDBG では、プロセスは 16 進で表示されるので、CALC.EXE を使って PID の 16 進値を確認します。
WinDBG を開きます。デフォルトの位置は [Debugging Tools] フォルダ ([スタート] - [プログラム] - [Debugging Tools]) で、ファイル システム上では \Program Files\Debuggers\bin ディレクトリに置かれています。
WinDBG で、[Debug] を選択し、[Attach to Process] を選択します。
[Attach to Process] ウィンドウで、正しいプロセスを選択し、[Select] をクリックします(図 16を参照)。WinDBG は、検索パスの中で発見したシンボルをロードします。
図 16. WinDBG でのプロセスへのアタッチ
ブラウザから、デバッグしているコンポーネントを呼び出している ASP ページの表示を更新します。ページは、WinDBG コマンドを待っているため、実行を停止します。
WinDBG で、コマンド プロンプトで g と入力し、実行を再開します(図 17 を参照)。これで ASP ページが最後まで実行されます。WinDBG のその他のコマンドと目的についての情報は、WinDBG のヘルプで得ることができます。
WinDBG で、デバッグしているソース ファイルを開きます。Visual Basic をデバッグしているときには、[Files of type] ドロップダウン ボックスを [All Files (*. *)] に変更することを忘れないでください(図 18 を参照)。
図 18. Visual Basic ソース ファイルを開く
WinDBG で、[F9] キーを押して、ソース ファイル内にブレークポイントを設定します。ソース行が強調表示されます。
ブラウザで、ASP ページの表示を更新します。
WinDBG に戻ります。ソース コードが強調表示され、デバッグを行う準備ができています(図 19 を参照)。
デバッグを停止すると、初めて ASP ページにアクセスしたときに、次のエラー メッセージが表示されることがあります。
The remote procedure call failed and did not execute.
この場合には、ASP ページの表示を更新してください。このエラー メッセージは、単に IIS 5 の Dllhost.exe または IIS 4.0 の MTX.exe がシャットダウンされたことを示しています。
関連情報:
WinDBG については、以下の BugSlayer コラムを参照してください。
- BugSlayer December 99
- BugSlayer January 2000
関連情報については、以下の KB の記事を参照してください。
- Q192754 "HOWTO: Debug InProc COM Components Inside IIS Using WINDBG"
- Q99953: "WinDbg Message 'Breakpoint Not Instantiated'"
- Q131007 "How to Use Windows NT Windbg with Visual Basic"
まとめ
この記事では、いくつかのデバッガについて、ASP の下での使い方を説明しました。その過程で、ちょっとしたトリックも学ぶことができたでしょう。特に重要なのは、スクリプトとコンポーネントの両方をデバッグする方法についての概要を理解できたということです。ASP の下での効果的なデバッグ方法を学ぶためには、時間と練習が必要ですが、この記事の情報はその出発点となります。
J.D. Meier は米国東海岸で生まれて育ちました。Horace Greeley の助言に従って、MTS および ASP 技術を含むサーバー側コンポーネントと Windows DNA アプリケーションを専門とするデベロッパ サポート エンジニアとして働いています。