FeaturesPluginsDocs & SupportCommunityPartners

アプリケーションのデバッグ

デバッグとは、アプリケーションにエラーがないかを調べることです。デバッグは、デバッガでコードにブレークポイントやウォッチポイントを設定し、コードを実行することによって行います。コードを 1 行ずつ実行し、アプリケーションの状態を調べることによって問題を検出することができます。

IDE では、Sun Microsystems JPDA デバッガを使用してプログラムをデバッグします。デバッグセッションを開始すると、画面の一番下に、関係するすべてのデバッガウィンドウが自動的に表示されます。プロジェクト全体、任意の実行可能クラス、任意の JUnit テストをデバッグできます。IDE ではまた、リモートマシンで実行されているアプリケーションのプロセスにデバッガを接続することによって、リモートアプリケーションをデバッグすることもできます。

Web アプリケーションや JSP ページ、あるいはサーブレットの実行またはデバッグでは、HTTP モニターを使用してデータの流れを監視することができます。HTTP モニターは、デフォルトで表示され、サーブレットエンジンが処理する HTTP 要求に関するデータを収集します。HTTP モニターは、エンジンが処理するそれぞれの HTTP 要求について、受信要求、サーバーの保有するデータ状態、およびサーブレット環境に関するデータを記録します。この機能によって、データの表示、将来のセッションのためのデータの格納、および以前の要求の再実行を行うことができます。HTTP モニターの詳細は、メインメニューから「ヘルプ」>「ヘルプの目次」を選択することによって見ることができます。

自由形式プロジェクトの場合は、「プロジェクトをデバッグ」コマンド用の Ant ターゲットを作成する必要があります。特定のファイルをデバッグするためのターゲットを作成し、そのターゲットをプロジェクトのコマンドに追加することもできます。

この節では、次のことを学びます。

デバッグの基礎

ここでは、簡単な例を使って、デバッグセッションの開始方法と手動でのコードのステップ実行、変数およびメソッド呼び出しの監視方法を具体的に学びます。そのあとに、ブレークポイントやウォッチポイントの設定などのより高度な機能に関する説明も用意しています。

ここでは例として、「ArrayFill」というアプリケーションを使用します。このアプリケーションは非常に単純です。このアプリケーションは sampleBean からなる配列を作成し、この Bean にはそれぞれ firstNamelastName という 2 つのプロパティーがあります。各 Bean のプロパティーに値を割り当て、その値を出力します。

最初に行うことは、アプリケーションを実行して例外がスローされるかどうかを調べることです。ArrayFill example .zip アーカイブをダウンロードして抽出します (http://www.netbeans.org/files/documents/4/446/ArrayFill.zip)。IDE で ArrayFill プロジェクトを開くには、CTRL-Shift-O キーを押し、抽出された ArrayFill フォルダを選択して「プロジェクトフォルダを開く」をクリックします。ArrayFill プロジェクトが IDE 内で開き、プロジェクトの論理構造が「プロジェクト」ウィンドウに表示されます。

「プロジェクト」ウィンドウで、「ソースパッケージ」の下の arrayfill パッケージを展開します。arrayfill パッケージには、2 つのクラスが含まれます。ArrayFillSampleBean です。ArrayFill.java を右クリックし、「ファイルの実行」を選択するか、Shift-F6 キーを押すと、コードが実行されます。「出力」ウィンドウに、次のような出力が表示されます。

java.lang.NullPointerException
            at arrayfill.ArrayFill.loadNames(arrayFill.java:27)
            at arrayfill.ArrayFill.main(ArrayFill.java:34)
            Exception in thread "main"
            Java Result: 1

デバッグセッションの開始

IDE でデバッグセッションが開始されると、IDE はデバッグするファイルをコンパイルしてデバッグモードで実行し、デバッガウィンドウにデバッガ出力を表示します。デバッグセッションを開始するには、デバッグするファイルを選択し、「実行」メニューから次のコマンドのどれかを選択します。

  • 主プロジェクトをデバッグ (F5)。最初のブレークポイントの位置まで主プロジェクトを実行します。
  • ステップイン (F7)。主プロジェクトの主クラスの実行を開始し、最初の実行可能文の位置で停止します。
  • カーソルまで実行 (F4)。デバッグセッションを開始し、ソースエディタ内のカーソル位置までアプリケーションを実行し、そこでアプリケーションを一時停止します。

IDE で複数のプロジェクトが開いている場合は、ArrayFill が主プロジェクトに設定されていることを確認します。主プロジェクトに設定するには、「プロジェクト」ウィンドウで「ArrayFill」ノードを右クリックし、コンテキストメニューから「主プロジェクトとして設定」を選択します。F7 キーを押して主プロジェクトの主クラスにステップインします。プロジェクトの主クラスが設定されていない場合は、設定するよう求めるメッセージが表示されます。IDE はソースエディタでファイルを開き、「出力」ウィンドウおよびデバッガウィンドウを表示し、main メソッドの中で停止します。

「デバッガ」ウィンドウ

「デバッガ」ウィンドウを少し見てみましょう。「デバッガ」ウィンドウは、デバッグセッションが開始されると自動的に開き、セッションが終了すると閉じます。デフォルトでは IDE は、「ローカル変数」、「ウォッチポイント」、「呼び出しスタック」の 3 つの「デバッガ」ウィンドウを開きます。

「ローカル変数」ウィンドウが前面に表示された「デバッガ」ウィンドウ

ほかの「デバッガ」ウィンドウは、「ウィンドウ」>「デバッグ」メニューを使用して開くことができます。デバッグセッション中に手動で開かれたが「デバッガ」ウィンドウも、セッションが終了すると自動的に閉じます。デバッグセッションが開いていないときに「デバッガ」ウィンドウが開かれた場合、そのウィンドウは手動で閉じない限り、開いたままになります。「デバッガ」ウィンドウは、ドラッグすることによって位置を変更することができます。

次の表は「デバッガ」ウィンドウをまとめたものです。

名前

ショートカット

説明

ローカル変数

Alt-Shift-1

現在の呼び出し内にあるローカル変数の一覧です。

ウォッチポイント

Alt-Shift-2

アプリケーションのデバッグ中に監視するように選択されたすべての変数および式の一覧です。

呼び出しスタック

Alt-Shift-3

現在のメソッドの実行中に行われる一連の呼び出しの一覧です。

クラス

Alt-Shift-4

デバッグしているプロセスによって読み込まれたすべてのクラスを階層形式で表示します。

ブレークポイント

Alt-Shift-5

現在のプロジェクトで設定されているブレークポイントの一覧です。

セッション

Alt-Shift-6

IDE で現在開かれているデバッグセッションの一覧です。

スレッド

Alt-Shift-7

現在のセッション内のスレッドグループの一覧です。

ソース

Alt-Shift-8

プロジェクトのクラスパス内のソースディレクトリの一覧です。ここで、クラスにステップインするか、ソースフォルダの選択を解除することでクラスをステップオーバーするかを設定できます。IDE では、JDK クラスは自動的にステップオーバーされます。ステップインする場合は、このウィンドウで JDK ソースを選択します。

コードのステップ実行

「実行」メニューの次のコマンドを使用し、デバッガにおけるコードの実行方法を制御することができます。

  • ステップオーバー (F8)。ソース 1 行を実行します。ソース行に呼び出しが含まれる場合は、個々の命令を 1 つずつ実行せずに、ルーチン全体を実行します。
  • ステップイン (F7)。ソース 1 行を実行します。ソース行に呼び出しが含まれる場合は、ルーチンの先頭文を実行する前に停止します。
  • ステップアウト (Alt-Shift-F7)。ソース 1 行を実行します。ソース行がルーチンの一部である場合は、ルーチンの残りの行を実行して、ルーチンの呼び出し側に制御を返します。
  • 一時停止。アプリケーションの実行を一時停止します。
  • 継続 (Ctrl-F5)。アプリケーションの実行を継続します。アプリケーションは、次のブレークポイントで停止します。
  • カーソルまで実行 (F4)。現在のセッションを、ソースエディタ内のカーソル位置まで実行し、アプリケーションを一時停止します。

この例では、F7 キーを使用し、コードを 1 行ずつステップ実行します。loadNames 呼び出しで NullPointerException が発生するため、その呼び出しまでステップ実行したら、「ローカル変数」ウィンドウで names 配列の値を監視します。Bean の値はすべて null です。継続して、loadNames メソッドをステップ実行できます。names Bean の値は null のままです。

デバッガでのコードのステップ実行

次の行が問題になります。

SampleBean[] myNames=new SampleBean[fnames.length];

この行は、Bean を保持する配列を開始しますが、Bean 自体をインスタンス化しません。次のコードを追加することによって、個々の Bean を loadNames メソッドでインスタンス化する必要があります。

 
	names[i]=new SampleBean();
 

このコードは、loadNames メソッドの names[i].setLastName(lnames[i]); 行の前に追加します。

ブレークポイントの操作

大部分のアプリケーションはあまりに大きすぎて、1 行ずつ調べることはできません。多くの場合問題が発生すると思われる位置にブレークポイントを設定し、その位置までアプリケーションを実行します。特定の条件が True の場合にのみ実行を停止する条件付きブレークポイントや、特定のスレッドまたはメソッドに対するブレークポイントなどの特化したブレークポイントを設定することもできます。

ここでは、前項で使用した ArrayFill クラスを使用します。追加したコードをコメントアウトすることによって、バグを再作成する必要があります。

ブレークポイントの設定

単純な行ブレークポイントは、目的の行の左マージンをクリックするだけで設定できます。左マージンに行ブレークポイントアイコン () が表示されます。再びその行をクリックすると、行ブレークポイントを削除できます。

ソースエディタでのブレークポイントの設定

もっと複雑なブレークポイントを設定する場合は、「実行」メニューの「新規ブレークポイント」コマンド (Ctrl-Shift-F8) を使用します。「新規ブレークポイント」ダイアログで、作成するブレークポイントの種類を選択し、実行を停止する条件やブレークポイントで「出力」ウィンドウに出力する情報などのブレークポイントオプションを設定することができます。

ブレークポイントの条件設定

条件付きブレークポイントは、指定された boolean 式が True の場合にのみ実行を停止します。条件付きブレークポイントを設定する場合は、「新規ブレークポイント」ダイアログを開き、「条件」フィールドに式を入力します。

たとえば ArrayFill.java を開いて、main メソッドにある loadNames メソッド呼び出しに挿入ポイントを設定し、Ctrl-Shift-F8 キーを押してみます。次に、ダイアログの「条件」フィールドに myNames=null と入力し、「了解」をクリックします。ここで F5 キーを押すと、プロジェクトのデバッグが開始されます。loadNames メソッド呼び出しの位置で実行が停止します。

条件付きブレークポイントの設定

ブレークポイントの出力のカスタマイズ

「新規ブレークポイント」ダイアログでは、ブレークポイントに達したときに出力する情報の内容を指定することもできます。ダイアログの一番下にある「出力テキスト」フィールドに任意のメッセージを入力してください。変数を使用し、特定の種類の情報を表すこともできます。

ブレークポイントの種類

次の表は、使用可能な各種ブレークポイントをまとめています。

種類

説明

行に達するか、行の要素が特定の条件に一致した場合に実行を停止します。

メソッド

メソッド名にブレークポイントを設定すると、そのメソッドが実行されるたびにアプリケーションの実行が停止します。

例外

例外にブレークポイントを設定するオプションはいくつかあります。特定の例外が検出された場合や、ソースコードで特定の例外が処理されなかった場合、あるいはアプリケーションがエラーを処理するかどうかに関係なく何らかの例外が発生した場合に実行を中断します。

変数

特定のクラスやフィールドの変数がアクセスされたり (たとえば、引数として変数を使用してメソッドが呼び出された場合)、変更されたりするたびに、アプリケーションの実行を停止します。

スレッド

スレッドが開始または停止したとき、あるいはその両方で、アプリケーションの実行を中断します。

クラス

クラスへのブレークポイントの設定では、デバッガを停止するタイミング (クラスが仮想マシンに読み込まれたとき、または仮想マシンから読み込み解除するとき、のどちらかまたは両方) を選択できます。

ウォッチポイントの設定

ウォッチポイントを使用すると、アプリケーションの実行中の式または変数の値の変化を追跡することができます。ウォッチポイントを設定するには、ソースエディタでウォッチポイントを設定する変数または式を選択し、その変数または式を右クリックし、「新規ウォッチポイント」(Ctrl-Shift-F7) を選択します。

「ウォッチポイント」ウィンドウで固定ウォッチポイントを作成することもできます。通常のウォッチポイントが変数の内容を示すのに対し、固定ウォッチポイントはその時点で変数に割り当てられているオブジェクトを示します。固定ウォッチポイントを作成するには、「ローカル変数」または「ウォッチポイント」ウィンドウで任意の項目を右クリックし、「固定ウォッチポイントを作成」を選択します。




戻る - 目次 - 次へ

Bookmark this page

del.icio.us furl simpy slashdot technorati digg
Companion
Projects:
MySQL Database Server   Open JDK: an Open SourceJDK   GlassFish Community: an Open Source Application Server    Mobile & Embedded Community    Open Solaris   java.net - The Source for Java Technology Collaboration   Open ESB - The Open Enterprise Service Bus Powered by