C/C++ プロファイル - NetBeans IDE 6.8/6.9 チュートリアル
執筆: Susan Morgan
2009 年 12 月 [リビジョン番号: V6.8--1]
目次
要件
このチュートリアルに従うには、次のソフトウェアが必要です。
必要な NetBeans ソフトウェアのダウンロードとインストールについては、「NetBeans IDE 6.9 のインストール」および「C/C++/Fortran 向けの NetBeans IDE の構成」
必要なソフトウェアのダウンロードとインストールに役立ててください。
はじめに
C/C++ プラグインを持つ NetBeans IDE 6.9 には、実行中のプロジェクトの状態を監視するためのツールが用意されており、アプリケーションの実行時の問題を検出できます。こうした種類の問題は、コードのデバック時に検出されない場合があります。C/C++ プロファイルツールには次のものがあります。
- CPU 使用
- メモリー使用
- スレッド使用
- 「I/O 使用法」は Solaris プラットフォームでのみ使用できます。
- 「スレッドマイクロステート」は Solaris プラットフォームでのみ使用できます。
このツールでは、使用状況がグラフ形式で表示されます。グラフにあるボタンをクリックすると、アプリケーションで問題がある領域の詳細情報を表示できます。
このチュートリアルでは、NetBeans IDE のプロファイル機能を C/C++ プロジェクトで使用する方法について、CPU 使用、メモリー使用、スレッド使用のそれぞれに重点を置いて説明します。
I/O 使用法ツールについては、「Solaris オペレーティングシステムでの C/C++ プロジェクトの I/O プロファイル」を参照してください。
スレッドマイクロステートツールの詳細については、「Solaris オペレーティングシステムでのスレッドマイクロステートツールの使用」を参照してください。
NetBeans C/C++ プロファイルのプラットフォームサポート
C/C++ プロファイルツールは、NetBeans プロジェクトを Solaris、OpenSolaris、および Linux オペレーティングシステムで実行する際に自動的に動作します。このプロファイルツールでは、プロジェクトの実行元のオペレーティングシステム上で稼動している外部機能を使用することで、プロジェクトの実行時に関する情報が収集されます。詳細情報の収集に必要な機能は、Windows プラットフォームまたは Mac プラットフォームでは使用できません。
このチュートリアルでは、Sun Studio ツールのある Solaris SPARC プロセッサベースシステムで実行されるプロジェクトを使用します。ただし、プロファイルツールは、実行中のプログラムに関する情報の取得に Solaris DTrace ユーティリティーも使用できるため、Sun Studio ツールコレクションは Solaris プラットフォームに必須ではありません。OpenSolaris OS を使用している場合、パッケージマネージャーを使用して、またはターミナルウィンドウで pkg install sunstudio コマンドを使用して、Sun Studio ソフトウェアを簡単にインストールできます。
Linux プラットフォームを使用している場合、C/C+ プロファイルツールを NetBeans IDE で使用するためには、Sun Studio ソフトウェアをダウンロードする必要があります。Sun Studio ツールは http://developers.sun.com/sunstudio から無料でダウンロードできます。
この表に、C/C++ プロファイルツールをサポートするオペレーティングシステムとツールコレクションを示します。
| CPU 使用 |
 |
 |
Linux では Sun Studio ツールが利用可能であることが必要。 |
| メモリー使用 |
 |
 |
Linux では Sun Studio ツールが利用可能であることが必要。 |
| スレッド使用 |
 |
 |
Linux では Sun Studio ツールが利用可能であることが必要。 |
| I/O 使用 |
 |
 |
Sun Studio ツールではなく Solaris DTrace を使用。 |
| スレッドマイクロステート |
 |
 |
Sun Studio ツールではなく Solaris DTrace を使用。 |
Windows ユーザーまたは Mac ユーザーであり、Solaris、OpenSolaris、または Linux が実行されているシステムを使用できる場合、IDE を Windows PC または Mac のローカルで実行し、Solaris、OpenSolaris、または Linux システム上でリモート開発環境を設定できます。Windows 上で IDE を実行している場合でも、リモート開発環境でプロファイルツールを使用できます。リモート開発ホスト上で構築するための設定方法の詳細については、「C/C++ リモート開発のチュートリアル」を参照してください。
NetBeans IDE をインストールしたあと Sun Studio ツールをインストールする場合、または Sun Studio ツールがパスにない場合、次の手順に説明するように、Sun Studio ツールの場所が IDE で認識されるようにする必要があります。Sun Studio ツールを使用しない場合、この手順は省略してかまいません。
- 「ツール」>「オプション」を選択します。
- 「オプション」ダイアログで、ダイアログ上部の「C/C++」をクリックします。
- 「構築ツール」タブをクリックします。このタブの「ツールコレクション」に、現在の開発ホスト上で検出されたツールコレクションが表示されます。デフォルトのコレクションはボールドで表示され、新しく作成するプロジェクトには、このコレクションが使用されます。
- ツールコレクションを追加する「開発ホスト」を選択します。この例では、Solaris ローカルホスト上で IDE を実行しています。
- 「ツールコレクション」リストの下の「追加」をクリックします。
- 「新規ツールコレクションの追加」ダイアログで、「ベースディレクトリ」テキストフィールドに Sun Studio コレクションのベースディレクトリパスを入力するか、「参照」ボタンを使用して Sun Studio の
bin ディレクトリのパスに移動します。ほとんどの場合、Sun Studio は /opt/sunstudio12、/opt/sun/sunstudio12、または /opt/SUNWspro にインストールされています。場所は Sun Studio と OS のバージョンによって異なります。
開発ホストが localhost でない場合、ツールディレクトリに移動する「参照」機能を使用できません。リモートサーバー上にあるツールのベース bin ディレクトリのパスとして、完全パスを入力します。「検査」をクリックし、入力したパスがサポートされているツールコレクションに対して有効であることを IDE で検査します。
- 「ツールコレクションファミリ」と「ツールコレクション名」は自動的に入力されます。必要に応じて、コレクションに別の名前を指定することもできます。
- 「オプション」ダイアログで「了解」をクリックします。
チュートリアル用の C/C++ プロジェクトの作成
C/C++ プロファイル機能を調べるため、IDE に含まれている ProfilingDemo サンプルアプリケーションから新規プロジェクトを作成します。
- 「ファイル」>「新規プロジェクト」を選択して、「新規プロジェクト」ウィザードを開きます。
- ウィザードで「サンプル」カテゴリを選択し、「C/C++」サブカテゴリを選択します。
- 次の図に示すように、「プロファイルのデモ」を選択して「次へ」をクリックします。
-
必要に応じて、プロジェクトの名前と場所を選択できます。ここでは、デフォルトの ProfilingDemo_1 を NetBeansProjects ディレクトリで使用します。
- 「完了」をクリックしてウィザードを終了し、プロジェクトを作成します。
プロジェクトプロパティーの設定
- 「プロジェクト」タブの「ProfilingDemo_1」プロジェクトノードを右クリックし、「プロパティー」を選択します。
- 「カテゴリ」区画で「構築」ノードを選択します。
- 「ツールコレクション」として「SunStudio_12」を選択し、「適用」をクリックします。
- 「カテゴリ」区画で「実行」ノードを選択します。「コンソールタイプ」に「出力ウィンドウ」を選択して、「適用」をクリックします。このチュートリアルで示すように、外部ターミナルウィンドウではなく IDE の出力ウィンドウにプログラムの出力を表示できます。
- 「カテゴリ」区画で「プロファイル」ノードを選択します。「実行時にプロファイルインジケータを表示」を選択します。
- 「プロファイル構成」として、「C/C++ Sun Studio 標準」を選択します。
- 「プロファイル構成」の一覧の横にある「...」ボタンをクリックし、「プロファイラツールマネージャー」ダイアログを開きます。C/C++ SunStudio 標準構成に対して選択されているツールが「スレッド使用」、「メモリー使用」、「CPU 使用」であることを確認します。その他のプロファイル構成を選択した場合、それぞれ別のツールを組み合わせて選択されていることが確認できます。このチュートリアルでは、「C/C++ SunStudio 標準」構成を使用します。
- 「プロファイラツールマネージャー」で「取消し」をクリックし、変更せずに終了します。
- 「プロジェクトプロパティー」ダイアログで「了解」をクリックします。
ProfilingDemo プロジェクトの構築と実行
- ProfilingDemo プロジェクトノードを右クリックし、「構築」を選択します。
- 「出力」タブに、次のような構築の結果が表示されます。
- コンパイラが Sun Studio C コンパイラである cc であることを確認します。変数不一致のコンパイラ警告は、無視してかまいません。
- ProfilingDemo プロジェクトノードを右クリックし、「実行」を選択します。
- 「実行監視」タブが開き、「CPU 使用」、「メモリー使用」、「スレッド使用」の各インジケータと動的グラフが表示されます。
- ProfilingDemo プログラムの出力ウィンドウに実行中の処理が表示されます。それを、IDE がツールにグラフィカルに表示しているデータと照合できます。たとえば、プログラムで割り当て中のメモリー量が表示され、計算が実行され、メモリーが開放されます。こうしたプログラムの動作がグラフに反映されるところを確認できます。
- プログラムが完了するまで、要求されるたびに Enter キーを押します。
- マウスカーソルをインジケータの上に合わせると、各グラフについて説明するツールチップが表示されます。
- 各インジケータには、詳細情報を表示するためのボタンがあります。これについては、このチュートリアルで後述します。最初にインジケータコントロールから見ていきます。
インジケータコントロールの使用
- 「実行監視」ウィンドウの最下部には、グラフのビューを制御するためのビュースライダ、詳細スライダ、および時間スライダの各スライダがあります。次のスクリーンショットに示すように、スライダにはラベルが付いています。スライダに関する情報を表示するには、マウスカーソルをスライダの終了点の上に合わせます。
- 時間スライダ (下部にある水平方向スクロールバー) をクリックし、マウスボタンを押したままスライダを左側にドラッグすると、実行の先頭が表示されます。すべてのグラフが連動してスライドするため、任意の時刻に各領域 (CPU、メモリー、スレッド) がどのような状態になっているかを確認し、それらの領域の関係を見ることができます。
- スライダを左から右にドラッグすると、実行の全体を確認できます。
- マウスポインタをビュースライダ (時間単位で重なったコントロール) に移動します。ビュースライダコントロールを使用すると、インジケータに表示された実行時の特定の部分を選択できます。
- 左側にあるビュースライダのハンドル (開始ポイント) をクリックし、実行の開始時までのすべての過程をドラッグします。インジケータに実行全体が表示されるようになりました。可能なところまで縮小する場合も、同様の結果になります。実行時全体を選択した場合、水平方向スクロールバーは機能しません。データ全体を表示しているため、スクロールする部分がありません。
- 次は詳細を見ていきましょう。ビュースライダの開始ポイントを 40 秒付近、または次の出力ウィンドウに示されているように PTHREAD_MUTEX_DEMO の開始場所にドラッグします。ハンドルをドラッグすると、インジケータは 0:40 の領域から終了ポイントに向かって拡大していきます。スクロールバーは、ふたたび実行時を前後にスクロールできるようになっています。
- スライダの使用方法の説明を表示するため、オレンジ色の詳細スライダーの終了ポイントにマウスカーソルを合わせます。詳細スライダのコントロールを使用すると、実行時の特定の部分を選択し、詳細情報を確認できます。
- 詳細スライダの開始ポイントハンドルを 40 秒付近にドラッグすると、開始ポイントの前のインジケータはグレー表示されます。これにより、グラフの開始ポイントから終了ポイントまでの間が強調表示されます。
インジケータの詳細ボタン (ホットスポット、メモリーリーク、同期の問題) のいずれかをクリックすると、強調表示された領域のデータが詳細タブに表示されます。これらのコントロールは、データにフィルタを適用するために使用します。
- 開始ポイントをドラッグして最初に戻し、すべてのデータを表示します。
CPU の使用状況の調査
「CPU 使用」グラフには、アプリケーションの実行中に使用される合計 CPU 時間がパーセンテージで表示されます。
- 「CPU 使用」の「ホットスポット」ボタンをクリックし、CPU 時間の詳細を表示します。
「関数あたりの CPU 時間」タブが開き、プログラムの関数が各関数で使用されている CPU 時間とともに表示されます。関数は使用されている CPU 時間の順番で一覧表示されるため、使用時間がもっとも長い関数が最初に表示されます。プログラムがまだ実行中の場合、初期状態で表示される時間は、グラフをクリックした時点で消費された時間です。
- 「関数名」列の先頭をクリックし、関数をアルファベット順にソートします。
- 「CPU 時間 (排他的)」をクリックし、個々の関数が使用した時間順に関数をソートします。
- CPU 時間の 2 つの列の違いを確認します。「CPU 時間 (包括的)」には、関数の開始から終了までに使用された CPU の合計時間が表示されます。一覧表示された関数から呼び出された、ほかのすべての関数の時間が含まれます。「CPU 時間 (排他的)」には、特定の関数によって使用された時間のみが表示されます。その関数から呼び出された関数は含まれません。
- 「CPU 時間 (包括的)」列ラベルをクリックし、使用時間がもっとも長い関数を先頭に戻します。
work_run_usrcpu 関数には、5.994 CPU 時間 (排他的) と 6.034 CPU 時間 (包括的) があります。これは、この関数が呼び出すほかの関数によって、少量の CPU 時間が実際に使用されたが、ほとんどの時間は work_run_usrcpu 関数自体が使用したことを意味します。
- 一部の関数はボールドで表示されます。これらの関数を呼び出すソースファイルに移動できます。
work_run_usrcpu 関数をダブルクリックします。
common.c ファイルが開き、work_run_usrcpu 関数がある 59 行目にカーソルが置かれます。この行の左マージンに、いくつかの数が表示されます。
- マウスカーソルを左側のマージンの数字の上に合わせます。これらの数は、「関数あたりの CPU 時間」タブに表示される、その関数の排他的または包括的 CPU 時間と同じメトリックです。これらのメトリックは、表示領域を少なくするために丸められますが、マウスをそれらの上に合わせると、丸められていない値が表示されます。
work_run_usrcpu 関数内で計算を実行する for ループなど、CPU を消費する行のメトリックは、common.c ソースファイルにも示されます。
- 「時間フィルタ」で、時間を入力して Enter キーを押すか、矢印を使用してその時間までスクロールして、開始時間を 0:40 に変更します。グラフィックインジケータが、データフィルタリングコントロール上のハンドルを移動したときの状態に変更されます。ハンドルをドラッグすると、「関数あたりの CPU 時間」タブ内の「時間フィルタ」設定が一致するように更新されます。重要なのは、表内の関数に対して表示されているデータがフィルタを反映して更新されるため、その時間中に使用された CPU 時間のみが表示されることです。
- また、特定のメトリックに一致とするデータを抽出するためにフィルタを適用することもできます。
work_run_usrcpu の「CPU 時間 (排他的)」メトリックを右クリックします。例では 5.994 です。「次の条件の行のみ表示」>「CPU 時間 (排他的) == 5.994」を選択します。すべての行がフィルタで除外され、排他的 CPU 時間が 5.994 と等しい行のみが表示されます。
メモリーの使用状況の調査
「メモリー使用」インジケータには、プロジェクト実行時のメモリーヒープの経時変化が表示されます。これは、プログラム内で不要になったメモリーの開放に失敗した場所を指す、メモリーリークの特定に使用できます。メモリーリークは、プログラムでのメモリー消費が増える原因となります。メモリーリークが発生しているプログラムの実行時間が長くなると、結果的に使用できるメモリーが不足する場合があります。
- 「実行監視」の時間スライダを左右に動かし、時間中にメモリーヒープが増減する様子を確認します。このプロジェクトの実行には、4 回の波があります。最初の 2 回は Sequential Demo 中に発生し、3 回目は Parallel Demo 中に発生し、最後は Pthread Mutex Demo 中に発生しています。
- 「メモリーリーク」ボタンをクリックして「メモリーリークの詳細」ウィンドウを表示します。ここに、メモリーリークを示す関数の詳細が表示されます。
メモリーリークが発生している関数のみが、表の中に一覧表示されます。ボタンのクリック時にプログラムが実行されている場合、表示されたリーク場所は、ボタンをクリックした時点で存在したものです。時間が経つにつれ、メモリーリークは増える可能性があるため、「再表示」ボタンをクリックする必要があります。プログラムの実行終了時までメモリーリークが検出されなかった場合、メモリーリークが検出されなかったことが「メモリーリークの詳細」タブに示されます。
- データをフィルタ処理するため、「開始」および「終了」時間を変更する、またはこのチュートリアルの「関数あたりの CPU 時間」ウィンドウで実行したように、「実行監視」ウィンドウのオレンジ色の詳細スライダを使用できます。
- この実行では、ProfilingDemo プログラムは
work_run_getmem 関数に関連するメモリーリークを示しています。
work_run_getmem 関数をダブルクリックすると、common.c ファイルが開き、この関数でメモリーリークが発生している行が表示されます。
- メモリーリークメトリックがソースエディタの左側のマージンに表示されます。CPU 使用メトリックで実行したときと同様に、マウスをそれらの上に合わせます。
- 表内のメトリックを右クリックし、表内のデータにフィルタを適用します。表内のデータへのフィルタの適用は、すべてのプロファイルツールで可能です。
スレッドの使用状況の調査
「スレッド使用」インジケータには、プログラムで使用されているスレッドの数と、スレッドがタスクを処理するためにロックを取得するのに待機する時点が示されます。このデータは、マルチスレッドアプリケーションで、無駄な待機時間を避けるためにスレッドの同期を行う必要がある場合に役立ちます。
- 「スレッド使用」インジケータには、プロジェクトの実行時に実行されたスレッド数が示されます。時間スライドを開始ポイントに戻し、0:40 秒付近でスレッド数が 3 になるまでスレッド数が 1 であることを確認します。
- ビュースライダを 0:40 秒付近の終了点ハンドルに移動すると、0:00 秒から 0:40 秒までの時点をインジケータで確認できます。
- 0:00 から 0:40 秒の同じ時間の「CPU 使用」インジケータおよび「メモリー使用」インジケータを見て、1 つのスレッドが CPU 時間とメモリーを使用するなんらかのアクティビティーを実行していることを確認します。この時間は、メインスレッドがファイルへの書き込みを行い、いくつかの計算を連続して行う、Sequential Demo の部分に相当します。CPU 使用とメモリー使用は、どちらもユーザーが Enter キーを押すのをプログラムが待機している間に減少し、スレッド数は 1 のままになります。
- 時間スライダを右にスライドすると、スレッドが 3 に増加する 2 つのポイントを確認できます。
- 40 秒付近でのスレッドの増加は、プロジェクトの実行の Parallel Demo 部分に相当します。ここで、メインスレッドがファイルへの書き込みと計算の実行を平行して行うため、2 つの追加のスレッドを開始します。これは 50 秒の時点のすぐあとに完了します。メモリー使用と CPU 使用は、この部分でわずかに増加しますが、2 つのタスクは格段に短い時間で完了します。
- Parallel Demo スレッドの完了後、スレッド数が 1 に戻り、メインスレッドはユーザーが Enter キーを押すのを待機します。
- スレッド数は、プログラムの Pthread Mutex Demo 部分の実行時に 3 に増加します。
- スレッド数が 3 に増加した直後に、ロック待ちがオレンジ色で表示されます。Pthread Mutex Demo では、複数のスレッドによる特定の関数へのアクセス競合を防ぐため、排他ロックを使用します。これが、スレッドがロックの取得を待機する原因です。
- 「同期の問題」ボタンをクリックし、プロジェクトのスレッドロックに関する詳細を表示します。「スレッド同期の詳細」タブが開き、Mutex ロックを取得するために待機する必要がある関数が一覧表示されます。また、関数が待機に費やすミリ秒での秒数のメトリックと、関数がロックを待機する必要のある回数が表示されます。
- プログラムの実行中に「同期の問題」ボタンをクリックした場合、「関数」列の左側にある更新ボタンをクリックして表示を更新し、最新のスレッドロック情報にする必要がある場合があります。
- 「待ち時間」列をクリックし、待機時間が長い順に関数をソートします。
- 「ロック待ち」列をクリックし、関数内でスレッドが待機した回数の順に関数をソートします。
- ロック待ち回数がもっとも多い
mutex_threadfunc 関数をダブルクリックします。エディタで mutex.c ソースファイルが開き、pthread_mutex_lock 関数を呼び出す行が表示されます。この関数は、メモリーの場所が読み取りまたは書き込みされる前にメモリーの場所をロックする役割を担い、そのメモリーにロックを持つスレッドがなくなるまで待機します。
- 「待ち時間」と「ロック待ち」のメトリックがソースファイルの左の列に表示されます。マウスカーソルをメトリックの上に合わせて詳細を表示します。この情報は、「スレッド同期の詳細」タブに表示される情報と一致します。
- メトリックを右クリックし、「プロファイラメトリックを表示」を選択解除します。これで、メトリックはどの C/C++ プロファイルツールのソースエディタにも表示されなくなりました。
- IDE メニューバーの「ビュー」を選択し、「プロファイラメトリックを表示」を選択すると、メトリックが再表示されます。
「CPU 使用」、「メモリー使用」、および「スレッド使用」の各モニターは、プログラムの実行時の状態を確認するために組み合わせて使用できます。ただし、プロジェクトの実行時にこれらのインジケータをいずれも確認しない場合、それらをオフにできます。プロジェクトのプロパティーで、「プロファイル」カテゴリを選択し、「実行時にプロファイルインジケータを表示」オプションを選択解除します。
プロファイル構成の管理
プロジェクトの実行時にどのプロファイルツールを表示するかは、プロファイル構成の管理で選択できます。
次に、独自の構成を設定し、「CPU 使用」と「メモリー使用」のみが C/C++ プロジェクトの実行時に表示されるように構成します。
-
「ツール」>「プロファイラツール」を選択し、「プロファイラツールマネージャー」ダイアログを開きます。
- 「プロファイラ構成」リストで、「構成を管理...」を選択します。
- 「プロファイラ構成マネージャー」ダイアログで、「C/C++ Sun Studio 標準」を選択します。
- 「複製」をクリックします。
- 「名前を変更」をクリックし、「SunStudio CPU/Mem」と入力し、「了解」をクリックします。
- 「プロファイル構成マネージャー」ダイアログで「了解」をクリックします。
- 「プロファイラツールマネージャー」ダイアログで新しい「SunStudio CPU/Mem」構成を選択します。
- ツールの一覧から「スレッド使用」ツールを選択解除し、「了解」をクリックします。
- この構成を使用するには、プロジェクトノードを右クリックし、「プロパティー」を選択します。
- 「プロジェクトプロパティー」ダイアログで、「プロファイル」カテゴリを選択します。
- 「プロファイル構成」の「SunSutdio CPU/Mem」を選択し、「了解」をクリックします。
- プロジェクトを実行すると、「実行監視」ウィンドウに「CPU 使用」ツールと「メモリー使用」ツールが表示されます。
関連項目
I/O 使用法ツールについては、「Solaris オペレーティングシステムでの C/C++ プロジェクトの I/O プロファイル」を参照してください。
スレッドマイクロステートツールの詳細については、「Solaris オペレーティングシステムでのスレッドマイクロステートツールの使用」を参照してください。
まとめ
このチュートリアルでは、C/C++ プロファイルツールに関する次の点を示しました。
- プロファイル情報は、Linux では Sun Studio ソフトウェアで収集され、Solaris プラットフォームでは Sun Studio ソフトウェアまたは Solaris DTrace ユーティリティーから選択して自動的に収集される
- グラフィカルなプロファイルインジケータが「実行監視」タブに表示される
- インジケータ内のボタンをクリックすると、プログラムの関数に関する詳細情報が表示される
- 詳細タブの関数をクリックすると、その関数が格納されたソースファイルが開き、関数の呼び出し元の行にカーソルが置かれる
- プロファイル設定は、「プロファイル」カテゴリのプロジェクトプロパティーにある
- プロファイルはプロジェクトのプロパティーで無効化できる
- プロファイルツールは「プロファイル構成」で選択できる
- Linux オペレーティングシステムまたは Solaris オペレーティングシステムが実行されているシステムをネットワーク上で使用できる場合、Linux または Solaris システムをプロジェクトの構築と実行用のリモート開発ホストとして設定することで、Windows マシまたは Mac マシンからプロファイルツールを使用できる