corner imagecorner image
IDEPlatformPluginsDocs & SupportCommunityPartners

NetBeans IDE でのマルチスレッドアプリケーションのデバッグ

ここでは、NetBeans IDE の「デバッグ」ウィンドウを使用してマルチスレッドアプリケーションをデバッグする方法を説明します。このチュートリアルでは、IDE を使用してアプリケーションのデッドロックを検出する方法も示します。

「デバッグ」ウィンドウは、デバッグセッション、アプリケーションスレッド、およびスレッド呼び出しスタックに関する情報を 1 つのウィンドウにまとめることにより、デバッグ処理を簡素化します。「デバッグ」ウィンドウを使用すると、アプリケーションスレッドの状態を簡単に確認したり、セッション内の任意のスレッドを中断および再開できます。

このチュートリアルでは 2 つのサンプルプロジェクトを使用し、「デバッグ」ウィンドウの操作方法を示します。このチュートリアルを完了するには、まず Gallery プロジェクトおよび Deadlock プロジェクトをダウンロードして開きます。

NetBeans IDE でのマルチスレッドアプリケーションのデバッグのビデオをご覧ください。

目次

このページの内容は NetBeans IDE 6.8、6.9、7.0、および 7.1 が対象です

このチュートリアルに従うには、次のソフトウェアとリソースが必要です。

ソフトウェアまたはリソース 必須バージョン
NetBeans IDE 6.8, 6.9, 7.0, 7.1
Java Development Kit (JDK) version 6
Gallery プロジェクトおよび Deadlock プロジェクト  

サンプルプロジェクトのダウンロード

このチュートリアルで使用するサンプルプロジェクトは、次の方法でダウンロードできます。

  • 完了したプロジェクトの ZIP アーカイブをダウンロードします。
  • 次の手順を実行して、プロジェクトソースを NetBeans のサンプルからチェックアウトします。
    1. メインメニューから「チーム」>「Subversion」>「チェックアウト」を選択します。
    2. 「チェックアウト」ダイアログで次のリポジトリ URL を入力します。
      https://svn.netbeans.org/svn/samples~samples-source-code
      「次へ」をクリックします。
    3. 「参照」をクリックして「リポジトリフォルダを参照」ダイアログボックスを開きます。
    4. ルートノードを展開し、samples/java/debugging-samples を選択します。「了解」をクリックします。
    5. ソースのローカルフォルダを指定します。ローカルフォルダは空である必要があります。
    6. 「完了」をクリックします。

      「完了」をクリックすると、IDE はローカルフォルダを Subversion リポジトリとして初期化し、プロジェクトソースをチェックアウトします。

    7. チェックアウトが完了するときに表示されるダイアログで、「プロジェクトを開く」をクリックします。

    注: Subversion を使用したソースのチェックアウトについての詳細は、「NetBeans IDE での Subversion ガイド」の「Subversion の設定」を参照してください。

プロジェクトを開く

このチュートリアルでは、2 つのアプリケーションを使用して、マルチスレッドアプリケーションのデバッグが IDE でどのようにサポートされているかを示します。この課題では、2 つのプロジェクトを IDE で開いて、実行します。プロジェクトを実行したら、各プロジェクトのデバッグに進みます。

Gallery プロジェクトの実行

Gallery アプリケーションは、アニメーション画像を再生する単純な Java Swing アプリケーションです。このアプリケーションには、アニメーション画像を追加および削除するための 2 つのボタンがあります。この課題では、Gallery アプリケーションを実行します。

  1. debugging-samples.zip アーカイブをローカルシステムにダウンロードし、展開します。
  2. メインメニューから「ファイル」>「開く」を選択します。
  3. debugging-samples ディレクトリにある Gallery プロジェクトを検索し、選択します。「開く」をクリックします。

    「開く」をクリックすると、IDE によりプロジェクトが「プロジェクト」ウィンドウで開かれ、表示されます。「プロジェクト」ウィンドウでプロジェクトノードを展開すると、このプロジェクトが単純な Java Swing アプリケーションであることがわかります。

  4. プロジェクトノードを右クリックし、「実行」を選択して Gallery アプリケーションを起動します。
  5. Gallery アプリケーションで、「詳細表示」をクリックして画像を追加したり、「簡易表示」をクリックして画像を削除したりします。
    Gallery アプリケーションのスクリーンショット
  6. Gallery アプリケーションのウィンドウを閉じます。

Gallery プロジェクトは、このチュートリアルでデバッグする単純なマルチスレッドアプリケーションです。

Deadlock プロジェクトの実行

Deadlock アプリケーションには、500000 ミリ秒間実行されるスレッドを開始する main メソッドが含まれています。main メソッドは、2 つのスレッドを開始し、これらが終了すると「出力」ウィンドウに出力します。

  1. メインメニューから「ファイル」>「開く」を選択します。
  2. debugging-samples ディレクトリにある Deadlock プロジェクトを検索し、選択します。「開く」をクリックします。

    「開く」をクリックすると、IDE によりプロジェクトが「プロジェクト」ウィンドウで開かれ、表示されます。「プロジェクト」ウィンドウでプロジェクトノードを展開すると、このプロジェクトが単純な Java アプリケーションであることがわかります。

  3. プロジェクトノードを右クリックし、「実行」を選択して Deadlock アプリケーションを起動します。

    「実行」をクリックすると、「出力」ウィンドウが開き、次の出力が表示されます。

    run:
    Application started
    MyThread2 successfully finished.
    MyThread1 successfully finished
  4. アプリケーションが通常どおり終了するのを待ちます (5 分)。

    Deadlock アプリケーションが終了したら、次の内容が「出力」ウィンドウに表示されます。

    Main thread finished

Deadlock プロジェクトは、2 つのスレッドを持つ単純な Java アプリケーションです。アプリケーションをデバッグする場合は、IDE がデッドロックの検出にどのように役立つかを示すため、デッドロックを作成します。

サンプルプロジェクトのデバッグ

Gallery プロジェクトは、アニメーション画像を表示する単純な Java Swing アプリケーションです。アプリケーションのボタンをクリックして画像を追加および削除します。「詳細表示」ボタンをクリックすると、画像を表示してアニメーション化する、新しいスレッドが開始されます。「簡易表示」ボタンをクリックすると、もっとも最近のスレッドが停止され、アニメーションが停止し、画像が削除されます。

スレッドの中断

この課題では、Gallery アプリケーションのデバッグを開始して画像をいくつか追加し、一部のアプリケーションスレッドを開始します。デバッグセッションを開始すると、IDE の左区画に「デバッグ」ウィンドウが表示されます。「デバッグ」ウィンドウには、セッションのスレッドが一覧表示されます。

  1. 「プロジェクト」ウィンドウで Gallery プロジェクトを右クリックし、「デバッグ」を選択します。

    「デバッグ」をクリックすると、Gallery アプリケーションが起動し、デフォルトのデバッグ用ウィンドウが表示されます。メインウィンドウの左区画に「デバッグ」ウィンドウが自動的に表示され、「出力」ウィンドウに「デバッガコンソール」が表示されます。

  2. Gallery アプリケーションで「詳細表示」を 3 回クリックし、アニメーション画像を表示する 3 つのスレッドを開始します。

    「デバッグ」ウィンドウでは、各アニメーションに対して新しいスレッドが開始されたことがわかります。

    「デバッグ」ウィンドウのスクリーンショット
  3. 「デバッグ」ウィンドウのスレッドの右にある「スレッドを中断」ボタンをクリックして、スレッドのうち 2 つを中断します。

    スレッドが中断されると、スレッドのアイコンが新しい状態に変わります。スレッドノードを展開してスレッドの呼び出しスタックを表示できます。デバッグコマンドを使ってポップアップメニューを開くには、「デバッグ」ウィンドウの項目を右クリックします。

    中断された 2 つのスレッドが表示された「デバッグ」ウィンドウのスクリーンショット

    Gallery アプリケーションでは、スレッドを中断すると、これらのスレッドのアニメーションが停止することが分かります。

「デバッグ」ウィンドウを使用すると、セッション内のスレッドの状態をすばやく表示および変更できます。デフォルトでは、「デバッグ」ウィンドウの右側に「再開」ボタンと「中断」ボタンが表示されます。「デバッグ」ウィンドウの下部にあるツールバーを使用すると、これらのボタンを非表示にし、「デバッグ」ウィンドウの表示をさらにカスタマイズすることができます。複数のデバッグセッションを実行している場合、「デバッグ」ウィンドウの上部にあるドロップダウンリストを使用して、ウィンドウに表示するセッションを選択できます。

「デバッグ」ウィンドウのツールバーのスクリーンショット

スレッドの切り替え

この課題では、アプリケーションをステップ実行した場合、および別のアプリケーションスレッドがブレークポイントをヒットした場合の動作を説明します。この課題では、メソッドブレークポイントを設定し、アプリケーションのステップ実行を開始します。アプリケーションのステップ実行中に、ブレークポイントをヒットする新しいスレッドを開始します。これが発生すると、「デバッグ」ウィンドウに通知が表示されます。次にスレッド間を切り替えます。

  1. 「プロジェクト」ウィンドウで「gallery」パッケージを展開し、「Gallery.java」をダブルクリックして、ファイルをエディタで開きます。
  2. Gallery.java」で、174 行目の左マージンをクリックすることで、run メソッドの最初にメソッドブレークポイントを挿入します。
  3. Gallery アプリケーションで「詳細表示」をクリックして、メソッドブレークポイントをヒットする新しいスレッドを開始します。
  4. 「ステップオーバー」(F8) をクリックし、「プログラムカウンタ」が行 191 に達するまでメソッドを段階的に実行します。

    エディタのマージンにある「プログラムカウンタ」に、メソッドのステップ実行での位置が示されます。

  5. Gallery アプリケーションで「詳細表示」をクリックして、メソッドブレークポイントをヒットする新しいスレッドを開始します。

    新しいスレッドがメソッドブレークポイントをヒットすると、「新しいブレークポイントのヒット」通知が「デバッグ」ウィンドウに表示されます。これは、メソッドのステップ実行中に、別のスレッドがブレークポイントをヒットしたこと通知します。

    「新しいブレークポイントのヒット」通知のスクリーンショット

    スレッドをステップ実行しているときに別のスレッドでブレークポイントがヒットされると、ほかのスレッドに切り替えるか、または現在のスレッドのステップ実行を続けるかを決めるオプションが提示されます。「新しいブレークポイントのヒット」通知の矢印ボタンをクリックすると、ブレークポイントに遭遇したスレッドに切り替えることができます。通知ウィンドウ内のスレッドを選択することで、いつでも新しいスレッドに切り替えられます。現在のブレークポイントスレッドをステップ実行すると、現在のスレッドが再開されますが、ほかのアプリケーションスレッドの状態は変わりません。

    注: 「デバッグ」ウィンドウを見ると、現在のスレッド (Thread_Jirka) がマージン内に緑のバーで示されていることがわかります。ブレークポイント (Thread_Roman) のヒットによって通知が呼び出されるスレッドは黄色いバーで示され、ブレークポイントによって中断されたスレッドはスレッドアイコンで示されます。

    「新しいブレークポイントのヒット」通知のスクリーンショット
  6. 「新しいブレークポイントのヒット」通知内の矢印をクリックして、現在のスレッドを新しいスレッド (Thread_Roman) に切り替えます。

    新しいスレッドに切り替えるとき、次を確認できます。

    • 新しい現在のスレッド (Thread_Roman) で、プログラムカウンタが 175 行目に移動します。
    • 191 行目のマージンに、中断しているスレッドを示す注釈が表示されます。これはスレッド (Thread_Jirka) がその行で中断されていることを示します。
    デバッグ注釈を示すエディタのスクリーンショット
  7. 「ステップオーバー」を何回かクリックして、新しい現在のスレッド (Thread_Roman) をステップ実行します。
  8. 中断しているスレッドを示す注釈をエディタのマージンで右クリックし、「現在のスレッドとして設定」>「Thread_Jirka」を選択して、元の中断されたスレッドに切り替えます。
    「現在のスレッドとして設定」ポップアップを示すエディタのスクリーンショット

    または、「現在のスレッドの選択」 (Alt-Shift-T) を呼び出して、任意のアプリケーションスクリーンショットに切り替えることもできます。

    Gallery アプリケーションのスクリーンショット

元の Thread_Jirka に切り替えると、中断されたスレッドの注釈が、Thread_Roman が中断されている行の横に表示されます。「デバッグ」ウィンドウの「再開」をクリックすると、Thread_Roman を再開できます。

デバッグ注釈を示すエディタのスクリーンショット

「デバッグ」ウィンドウを使用すると、スレッドの状態を正確に表示および制御できます。デバッガは、デバッグのワークフローを簡素化し、デバッグ処理がデッドロックを作らないようにするためアプリケーションのスレッドを管理します。この課題では、IDE でアプリケーションをデバッグする際に発生する次の動作を確認しました。

  • スレッドがブレークポイントにヒットすると、ブレークポイントスレッドのみが中断されます。
  • アプリケーションをステップ実行しているとき、ほかのアプリケーションスレッドがブレークポイントをヒットしても現在のスレッドには影響しません。
  • ステップ実行は現在のスレッドのみを開始します。ステップが完了すると、現在のスレッドだけが中断されます。

Gallery アプリケーションを終了できます。次の課題では Deadlock アプリケーションをデバッグし、IDE を使用してデッドロックの検出に役立てます。

デッドロックの検出

IDE は、中断されたすべてのスレッドに対してデッドロックを自動的に検索して、潜在的なデッドロックの状況を特定するのに役立ちます。デッドロックが検出されると、IDE では「デバッグ」ウィンドウに通知が表示され、関連するスレッドが特定されます。

IDE のデッドロック検出を示すには、デバッガにあるサンプルの Deadlock プロジェクトを実行し、デッドロック状況を作成します。

  1. myapplication パッケージを展開し、ソースエディタで Thread1.javaThread2.java を開きます。
  2. Thread1.java の 20 行目および Thread2.java の 20 行目にブレークポイントを設定します。

    ブレークポイントを設定するには、ブレークポイントを設定する行の次にある、ソースエディタ内のマージンをクリックします。ブレークポイント注釈が、行の隣にある左マージンに表示されます。「ブレークポイント」ウィンドウ (Alt-Shift-5) を開くと、2 つのブレークポイントが設定され、有効になっていることがわかります。

    20 行目にブレークポイントが設定されていることを示すエディタのスクリーンショット
  3. 「プロジェクト」ウィンドウで Deadlock プロジェクトを右クリックし、「デバッグ」を選択します。

    main メソッドによって 2 つのメソッドが実行され、これらのスレッドは、ブレークポイントの 1 つで両方とも中断されます。「デバッグ」ウィンドウで、スレッドがブレークポイントによって中断されたことがわかります。

  4. 「デバッグ」ウィンドウでは、中断されたスレッド (MyThread1 および MyThread2) を再開します。これは「デバッグ」ウィンドウ内の中断されたスレッドの右にある「再開」ボタンをクリックすることによって行われます。
    「デバッグウィンドウで中断されたスレッドを再開することを示すスクリーンショット

    MyThread1 スレッドおよび MyThread2 スレッドを再開すると、デッドロックの状態が作成されます。

  5. メインメニューから Debug\Check for Deadlock を選択して、中断されたスレッドにデッドロックがないかを確認します。
    「デバッグ」ウィンドウで中断されたスレッドを再開することを示すスクリーンショット

    アプリケーションのデッドロックを検査してデッドロックを検出した場合、デッドロックについて知らせるメッセージが「デバッガ」ウィンドウに表示されます。デッドロックのあるスレッドは、「デバッグ」ウィンドウの左マージンに赤いバーで示されます。

このチュートリアルでは、IDE のデバッグ機能の一部に関する基本を紹介しました。「デバッグ」ウィンドウを使用すると、アプリケーションをデバッグするときにスレッドを簡単に中断および再開できます。これは、マルチスレッドアプリケーションをデバッグする際に特に便利です。



関連項目

NetBeans IDE での Java アプリケーションの開発およびテストついての詳細は、次のリソースを参照してください。