ASP スクリプトをデバッグする

プログラミングの経験がどんなに長くても、プログラム エラー、つまり "バグ" によってサーバー側のスクリプトが正しく動作しないという状況に遭遇します。このため、スクリプト エラーを発見して修正するプロセスであるデバッグは、信頼性の高い優れた ASP アプリケーションを開発するために不可欠です。特に、アプリケーションが複雑になるほど、デバッグの重要性が増します。

Microsoft Script Debugger ツール

Microsoft® Script Debugger は、バグを速やかに特定し、サーバー側のスクリプトの対話的なテストを行う強力なデバッグ ツールです。Script Debugger は、Windows Internet Explorer Version 3.0 以降でも動作します。 Script Debugger を使用すると、次の項目が可能になります。

   デバッガでは、スクリプトを表示してバグを特定することはできますが、スクリプトを直接編集することはできません。バグを解消するには、編集用プログラムを使用してスクリプトを編集し、変更内容を保存した後に再度スクリプトを実行する必要があります。

デバッグを有効にする

サーバー側のスクリプトのデバッグを開始する前に、ASP のデバッグをサポートするように Web サーバーを構成する必要があります。詳細については、「ASP のデバッグを有効にする」を参照してください。

Web サーバーのデバッグを有効にした後は、次のいずれかの方法を使用してスクリプトをデバッグできます。

スクリプトのエラー

サーバー側のスクリプトのデバッグで見つかるエラーには、いくつかの種類があります。エラーによっては、スクリプトを正しく実行できなかったり、プログラムの実行を止めたり、不正な結果を返したりすることがあります。

構文エラー

"構文" エラーは、不正なスクリプト構文が原因で発生する一般的なエラーです。たとえば、コマンドの綴りが間違っている場合や、関数に渡す引数の数が適切でない場合などに、エラーが発生します。構文エラーがあると、スクリプトを実行できない場合があります。

実行時エラー

"実行時" エラーは、スクリプトの実行開始後、実際には実行できない操作をスクリプトが実行を試みるために発生します。たとえば、次のスクリプトは、変数を 0 で除算する関数 (不正な算術演算を実行する関数) を含んでいるため、実行時エラーが発生します。

<SCRIPT LANGUAGE=VBScript RUNAT=SERVER>
  Result = Findanswer(15)
  Document.Write ("The answer is " &Result)

  Function Findanswer(x) 
  'This statement generates a run-time error.
   Findanswer = x/0      
  End Function
</SCRIPT>

スクリプトを中断することなく実行できるようにするには、実行時エラーの原因となるバグを取り除く必要があります。

論理エラー

"論理" エラーは、検出が最も難しいバグです。論理エラーは、入力ミスやプログラムの論理構造の欠陥が原因で発生します。論理エラーがあると、スクリプトの実行は正しく行われますが、実行結果は期待どおりになりません。 たとえば、値の一覧を並べ替えるサーバー側のスクリプトで、小なり記号 (<) の代わりに誤って大なり記号 (>) を使用して値の比較を行うと、返される並べ替えの順序は誤ったものになります。

エラーのデバッグ方法

バグの発生箇所を特定し、アプリケーションをテストするには、さまざまなデバッグの方法があります。

ジャストインタイム (JIT) デバッグ

実行時エラーによってサーバー側のスクリプトの実行が中断されると、Microsoft Script Debugger が自動的に起動します。Script Debugger は、.asp ファイルを表示し、ステートメント ポインタによってエラーが発生した行を示すと共に、エラー メッセージを表示します。この種のデバッグは、"ジャストインタイム" (JIT) デバッグと呼ばれ、コンピュータは以後のプログラムの実行を中断します。この場合、スクリプトの実行を再開するには、編集用プログラムを使用してエラーを修正し、変更内容を保存する必要があります。

ブレークポイントを使用したデバッグ

エラーが発生していて、エラーの発生箇所を簡単に特定することができない場合は、あらかじめ "ブレークポイント" を設定しておくと便利です。ブレークポイントは、特定の行でスクリプトの実行を中断します。ブレークポイントを使用する場合は、エラーが発生している可能性のある行よりも前に、1 つまたは複数のブレークポイントを設定し、スクリプトの中で設定されている変数やプロパティの値をデバッガを使用して調べます。エラーを修正した後は、スクリプトを中断することなく実行できるように、ブレークポイントを解除します。

ブレークポイントを設定するには、Script Debugger で目的のスクリプトを開き、実行を中断するスクリプトの行を選択し、[Debug] メニューの [Toggle Breakpoint] をクリックします。次に、Web ブラウザを使用してスクリプトを再び要求します。スクリプトの、ブレークポイントが設定された行までが実行されると、コンピュータは Script Debugger を起動します。Script Debugger はスクリプトを表示し、ブレークポイントが設定された行をステートメント ポインタで示します。

次のステートメントでの中断

実行する次のステートメントが、操作中の .asp ファイルの中にないときなど、場合によっては Script Debugger の [Break at Next Statement] を有効にすることができます。たとえば、Sales というアプリケーションの中の .asp ファイルに [Break at Next Statement] を設定した場合、Sales アプリケーションの任意のファイルのスクリプト、またはデバッグの実行が有効になっている任意のアプリケーションのスクリプトを実行すると、デバッガが起動されます。このため、[Break at Next Statement] を設定するときは、次に実行するスクリプト ステートメントの種類にかかわらずデバッガが起動されることに注意してください。

VBScript の Stop ステートメントを使用したデバッグ

VBScript で記述されたサーバー側のスクリプトにブレークポイントを設定するには、サーバー側のスクリプトのバグと疑われる部分よりも前に Stop ステートメントを挿入する方法もあります。たとえば、次のサーバー側のスクリプトの Stop ステートメントは、スクリプトがカスタム関数を呼び出す前にスクリプトの実行を中断します。

<%	
  intDay = Day(Now())
  lngAccount = Request.Form("AccountNumber")
  dtmExpires = Request.Form("ExpirationDate")
   	  
  strCustomerID  =  "RETAIL" & intDay & lngAccount & dtmExpires

  'Set breakpoint here.
  Stop

  'Call registration component.				
  RegisterUser(strCustomerID)
%>

このスクリプトを要求すると、デバッガが起動して自動的に .asp ファイルを表示し、Stop ステートメントが挿入された場所をステートメント ポインタで示します。この時点で、変数がコンポーネントに渡される前に、それらの変数に割り当てられた値を調べることができます。

重要   Stop ステートメントは、デバッグを終えた .asp ファイルから忘れずに削除してください。

JScript の Debugger ステートメントを使用したデバッグ

JScript で記述されたサーバー側のスクリプトにブレークポイントを設定するには、スクリプトのバグと疑われる部分よりも前に debugger ステートメントを挿入します。たとえば、次のスクリプトの debugger ステートメントは、ループで新しい値を処理するたびに、スクリプトの実行を中断し、Script Debugger を自動的に起動します。

<%@ LANGUAGE=JScript %>
<%
  for (var count = 1; count <= 10; count++)
  {        
    var eventest = count%2
    //Set breakpoint so that user can step through execution of script.
    debugger						    
    if (eventest == 0)
          Response.Write("Even value is " + count + "<br>")
   }
%>

debugger ステートメントを使用する場合、デバッグを終えたら、忘れずに .asp ファイルから debugger ステートメントを削除してください。

   debugger ステートメントを JScript の break ステートメントと混同しないでください。break ステートメントは現在実行中のループを抜けるためのステートメントであり、Microsoft Script Debugger を起動したり、スクリプトの実行を中断したりするためのステートメントではありません。

スクリプトをデバッグするときのヒント

Script Debugger を使用する際に、いくつかのデバッグのヒントを活用すると、スクリプトのエラーを検出する時間を大幅に短縮できます。バグの多くは、コマンドの綴りの間違いや変数の欠如など、ソースを見るとすぐにわかるものですが、一部の論理エラーや実行時エラーはソースを見ても簡単に原因を特定できない場合があります。

Microsoft Script Debugger の詳細については、「Microsoft Scripting Technologies」を参照してください。

© 1997-2001 Microsoft Corporation.All rights reserved.