IDEの「デバッグ」ウィンドウを使用してマルチスレッド・アプリケーションをデバッグする方法を説明します。このチュートリアルでは、IDEを使用してアプリケーションのデッドロックを検出する方法も示します。「デバッグ」ウィンドウは、デバッグ・セッション、アプリケーション・スレッド、およびスレッド・コール・スタックに関する情報を1つのウィンドウにまとめることにより、デバッグ処理を簡素化します。「デバッグ」ウィンドウを使用すると、アプリケーション・スレッドの状態を簡単に確認したり、セッション内の任意のスレッドを一時停止および再開できます。このチュートリアルでは2つのサンプル・プロジェクトを使用し、「デバッグ」ウィンドウの操作方法を示します。このチュートリアルを完了するには、まずGalleryプロジェクトおよびDeadlockプロジェクトをダウンロードして開きます。IDEでのマルチスレッド・アプリケーションのデバッグのビデオをご覧ください。目次サンプル・プロジェクトのダウンロードサンプル・プロジェクトを開くGalleryプロジェクトの実行Deadlockプロジェクトの実行サンプル・プロジェクトのデバッグスレッドの一時停止スレッドの切替えデッドロックの検出このチュートリアルに従うには、次のソフトウェアとリソースが必要です。バージョン7または8GalleryプロジェクトおよびDeadlockプロジェクトサンプル・プロジェクトのダウンロードこのチュートリアルで使用するサンプル・プロジェクトは、次の方法でダウンロードできます。終了したプロジェクトのZIPアーカイブをダウンロードします。次の手順を実行して、プロジェクト・ソースをNetBeansのサンプルからチェックアウトします。メイン・メニューから「チーム」>「Subversion」>「チェックアウト」を選択します。「チェックアウト」ダイアログ・ボックスで次のリポジトリURLを入力します。https://svn.netbeans.org/svn/samples~samples-source-code「次」をクリックします。「参照」をクリックして「リポジトリ・フォルダを参照」ダイアログ・ボックスを開きます。ルート・ノードを展開し、samples/java/debugging-samplesを選択します。「OK」をクリックします。ソースのローカル・フォルダを指定します(ローカル・フォルダは空である必要があります)。「終了」をクリックします。「終了」をクリックすると、IDEではローカル・フォルダがSubversionリポジトリとして初期化され、プロジェクト・ソースがチェックアウトされます。チェックアウトが完了するときに表示されるダイアログで、「プロジェクトを開く」をクリックします。IDEでのSubversionガイドのSubversionの設定の項を参照してください。プロジェクトを開くこのチュートリアルでは、2つのアプリケーションを使用して、マルチスレッド・アプリケーションのデバッグがIDEでどのようにサポートされているかを示します。この課題では、2つのプロジェクトをIDEで開いて、実行します。プロジェクトを実行したら、各プロジェクトのデバッグに進みます。Swingアプリケーションです。このアプリケーションには、アニメーション・イメージを追加および除去するための2つのボタンがあります。この課題では、Galleryアプリケーションを実行します。debugging-samples.zipアーカイブをローカル・システムにダウンロードし、展開します。メイン・メニューから「ファイル」>「開く」を選択します。debugging-samplesディレクトリにあるGalleryプロジェクトを検索し、選択します。「開く」をクリックします。「開く」をクリックすると、IDEによりプロジェクトが「プロジェクト」ウィンドウで開かれ、表示されます。Swingアプリケーションであることがわかります。プロジェクト・ノードを右クリックし、「実行」を選択してGalleryアプリケーションを起動します。Galleryアプリケーションで、「詳細表示」をクリックしてイメージを追加したり、「簡易表示」をクリックしてイメージを除去したりします。Galleryアプリケーションのウィンドウを閉じます。Galleryプロジェクトは、このチュートリアルでデバッグする単純なマルチスレッド・アプリケーションです。Deadlockプロジェクトの実行Deadlockアプリケーションには、500000ミリ秒間実行されるスレッドを開始するmainメソッドが含まれています。mainメソッドは、2つのスレッドを開始し、これらが終了すると「出力」ウィンドウに出力します。メイン・メニューから「ファイル」>「開く」を選択します。debugging-samplesディレクトリにあるDeadlockプロジェクトを検索し、選択します。「開く」をクリックします。「開く」をクリックすると、IDEによりプロジェクトが「プロジェクト」ウィンドウで開かれ、表示されます。「プロジェクト」ウィンドウでプロジェクト・ノードを展開すると、このプロジェクトが単純なJavaアプリケーションであることがわかります。プロジェクト・ノードを右クリックし、「実行」を選択してDeadlockアプリケーションを起動します。「実行」をクリックすると、「出力」ウィンドウが開き、次の出力が表示されます。finishedアプリケーションが通常どおり終了するのを待ちます(5分)。Deadlockアプリケーションが終了したら、次の内容が「出力」ウィンドウに表示されます。finishedDeadlockプロジェクトは、2つのスレッドを持つ単純なJavaアプリケーションです。アプリケーションをデバッグするとき、IDEがデッドロックの検出にどのように役立つかを示すため、デッドロックを作成します。Swingアプリケーションです。アプリケーションのボタンをクリックしてイメージを追加および除去します。「詳細表示」ボタンをクリックすると、イメージを表示してアニメーション化する新しいスレッドが開始されます。「簡易表示」ボタンをクリックすると、直近のスレッドが停止し、アニメーションが停止してイメージが除去されます。スレッドの一時停止この課題では、Galleryアプリケーションのデバッグを開始してイメージをいくつか追加し、一部のアプリケーション・スレッドを開始します。デバッグ・セッションを開始すると、IDEの左ペインに「デバッグ」ウィンドウが表示されます。「デバッグ」ウィンドウには、セッション内のスレッドが一覧表示されます。「プロジェクト」ウィンドウでGalleryプロジェクトを右クリックし、「デバッグ」を選択します。「デバッグ」をクリックすると、IDEでGalleryアプリケーションが起動し、デフォルトのデバッグ用ウィンドウが表示されます。IDEによって、メイン・ウィンドウの左側に「デバッグ」ウィンドウが自動的に表示され、「出力」ウィンドウに「デバッガ・コンソール」が表示されます。Galleryアプリケーションで「詳細表示」を3回クリックし、アニメーション・イメージを表示する3つのスレッドを開始します。「デバッグ」ウィンドウでは、各アニメーションに対して新しいスレッドが開始されたことがわかります。「デバッグ」ウィンドウのスレッドの右にある「スレッドを一時停止」ボタンをクリックして、スレッドのうち2つを一時停止します。スレッドが一時停止されると、スレッドのアイコンが新しい状態に変わります。スレッド・ノードを展開してスレッドのコール・スタックを表示できます。デバッグ・コマンドを使用してポップアップ・メニューを開くには、「デバッグ」ウィンドウの項目を右クリックします。Galleryアプリケーションでは、スレッドを一時停止すると、これらのスレッドのアニメーションが停止することがわかります。「デバッグ」ウィンドウを使用すると、セッション内のスレッドの状態をすばやく表示および変更できます。デフォルトでは、「デバッグ」ウィンドウの右側に「再開」ボタンと「一時停止」ボタンが表示されます。「デバッグ」ウィンドウの下部にあるツールバーを使用すると、これらのボタンを非表示にし、「デバッグ」ウィンドウの表示をさらにカスタマイズすることができます。複数のデバッグ・セッションを実行している場合、「デバッグ」ウィンドウの上部にあるドロップダウン・リストを使用して、ウィンドウに表示するセッションを選択できます。スレッドの切替えこの課題では、アプリケーションをステップ実行した場合、および別のアプリケーション・スレッドがブレークポイントをヒットした場合の動作を説明します。この課題では、メソッド・ブレークポイントを設定し、アプリケーションのステップ実行を開始します。アプリケーションのステップ実行中に、ブレークポイントをヒットする新しいスレッドを開始します。これが発生すると、IDEでは「デバッグ」ウィンドウに通知が表示されます。次にスレッド間を切り替えます。Galleryアプリケーションのウィンドウで、ウィンドウに2つまたは3つのアニメーションしか表示されなくなるまで、「簡易表示」または「詳細表示」をクリックします。IDEの「プロジェクト」ウィンドウでgalleryパッケージを展開し、Gallery.javaをダブルクリックして、ファイルをエディタで開きます。「Gallery.java」で、175行目の左マージンをクリックすることで、runメソッドの最初にメソッド・ブレークポイントを挿入します。Galleryアプリケーションで「詳細表示」をクリックして、メソッド・ブレークポイントをヒットする新しいスレッドを開始します。「ステップ・オーバー」([F8])をクリックし、「プログラム・カウンタ」が行191に達するまでメソッドをステップ実行します。エディタのマージンにある「プログラム・カウンタ」に、メソッドのステップ実行での位置が示されます。Galleryアプリケーションで「詳細表示」をクリックして、メソッド・ブレークポイントをヒットする新しいスレッドを開始します。新しいスレッドがメソッド・ブレークポイントをヒットすると、メソッドのステップ実行中に別のスレッドがブレークポイントをヒットしたことを通知する「新しいブレークポイントのヒット」通知が「デバッグ」ウィンドウに表示されます。スレッドをステップ実行しているときに別のスレッドでブレークポイントがヒットされると、IDEでは、他のスレッドに切り替えるか、または現在のスレッドのステップ実行を続けるかを決めるオプションが提示されます。「新しいブレークポイントのヒット」通知の矢印ボタンをクリックすると、ブレークポイントに遭遇したスレッドに切り替えることができます。通知ウィンドウ内のスレッドを選択すると、いつでも新しいスレッドに切り替えることができます。現在のブレークポイント・スレッドをステップ実行すると、現在のスレッドが再開されますが、他のアプリケーション・スレッドの状態は変わりません。注意:「デバッグ」ウィンドウでは、現在のスレッド(Thread_Jirka)がマージン内の緑色のバーで示されていることがわかります。ブレークポイント(Thread_Roman)のヒットによって通知が呼び出されたスレッドは黄色のバーで示され、ブレークポイントによって一時停止されたスレッドはスレッド・アイコンで示されます。「新しいブレークポイントのヒット」通知内の矢印をクリックして、現在のスレッドを新しいスレッド(Thread_Roman)に切り替えます。新しいスレッドに切り替えるとき、次のことを確認できます。新しい現在のスレッド(Thread_Roman)で、プログラム・カウンタが175行目に移動します。191行目のマージンに一時停止しているスレッドを示す注釈が表示され、スレッド(Thread_Jirka)がその行で一時停止されていることを示します。「ステップ・オーバー」を何回かクリックして、新しい現在のスレッド(Thread_Roman)をステップ実行します。一時停止しているスレッドを示す注釈をエディタのマージンで右クリックし、「現在のスレッドとして設定」>「Thread_Jirka」を選択して、元の一時停止されたスレッドに切り替えます。「現在のスレッド・チューザ」([Alt]+[Shift]+[T]、Macの場合は[Ctrl]+[Shift]+[T])を呼び出して、任意のアプリケーション・スレッドに切り替えることもできます。元のThread_Jirkaに切り替えると、Thread_Romanが一時停止されている行の横に、一時停止しているスレッドを示す注釈が表示されます。「デバッグ」ウィンドウの「再開」をクリックすると、Thread_Romanを再開できます。「デバッグ」ウィンドウを使用すると、スレッドの状態を正確に表示して制御できます。デバッガは、デバッグのワークフローを簡素化し、デバッグ処理でデッドロックが作成されるのを防ぐために、アプリケーション・スレッドを管理します。この課題では、IDEでアプリケーションをデバッグする際に発生する次の動作を確認しました。スレッドがブレークポイントをヒットすると、ブレークポイント・スレッドのみが一時停止されます。アプリケーションをステップ実行しているとき、他のアプリケーション・スレッドがブレークポイントをヒットしても現在のスレッドには影響しません。ステップ実行は現在のスレッドのみを再開します。ステップが完了すると、現在のスレッドのみが一時停止されます。Galleryアプリケーションを終了できます。次の課題では、Deadlockアプリケーションをデバッグし、IDEを使用してデッドロックの検出に役立てます。デッドロックの検出IDEは、一時停止されたすべてのスレッドに対してデッドロックを自動的に検索して、潜在的なデッドロックの状況を特定するのに役立ちます。デッドロックが検出されると、IDEでは「デバッグ」ウィンドウに通知が表示され、関連するスレッドが特定されます。IDEのデッドロック検出を示すために、デバッガにあるサンプルのDeadlockプロジェクトを実行し、デッドロックの状況を作成します。myapplicationパッケージを展開し、ソース・エディタでThread1.javaとThread2.javaを開きます。Thread1.javaの20行目およびThread2.javaの20行目にブレークポイントを設定します。ブレークポイントを設定するには、ブレークポイントを設定する行の横で、ソース・エディタ内のマージンをクリックします。ブレークポイント注釈が、行の横の左マージンに表示されます。「ブレークポイント」ウィンドウ([Alt]+[Shift]+[5]、Macの場合は[Ctrl]+[Shift]+[5])を開くと、2つのブレークポイントが設定され、有効になっていることがわかります。「プロジェクト」ウィンドウでDeadlockプロジェクトを右クリックし、「デバッグ」を選択します。mainメソッドによって2つのスレッドが実行され、これらのスレッドは、ブレークポイントの1つで両方とも一時停止されます。「デバッグ」ウィンドウでは、スレッドがブレークポイントによって一時停止されたことがわかります。「デバッグ」ウィンドウで、「デバッグ」ウィンドウ内の一時停止されたスレッドの右にある「再開」ボタンをクリックすることによって、一時停止されたスレッド(MyThread1およびMyThread2)を再開します。MyThread1スレッドおよびMyThread2スレッドを再開すると、デッドロックの状況が作成されます。メイン・メニューから「デバッグ」-「デッドロックを確認」を選択して、一時停止されたスレッドにデッドロックがないかを確認します。アプリケーションのデッドロックを確認してデッドロックを検出した場合、デッドロックについて知らせるメッセージが「デバッグ」ウィンドウに表示されます。デッドロックのあるスレッドは、「デバッグ」ウィンドウの左マージンに赤色のバーで示されます。このチュートリアルでは、IDEのデバッグ機能の一部に関する基本を紹介しました。「デバッグ」ウィンドウを使用すると、アプリケーションをデバッグするときにスレッドを簡単に一時停止および再開できます。これは、マルチスレッド・アプリケーションをデバッグする際に特に便利です。IDEでのJavaアプリケーションの開発およびテストの詳細は、次のリソースを参照してください。