Sun WorkShop の概要 | ![]() ![]() ![]() ![]() ![]() |
第 4 章
プログラムのデバッグ
Sun WorkShop には、プログラムの実行を制御し、停止したプログラムの状態を検査する統合デバッグサービスが用意されています。プログラムを動的に実行して完全に制御し、パフォーマンスデータを収集できます。
「デバッグ」ウィンドウ (「デバッグ」
「デバッグウィンドウの表示」を選択して開きます) と、その下位のデバッグウィンドウから次のことを行えます。
- デバッグセッションの開始 (一度に複数セッションの開始が可能)
- プログラムを実行停止位置の指定
- プログラムの実行制御
- ブレークポイントの利用
- プロセスへの接続
- コードのトレース
- 式と変数の評価
- 呼び出しスタックの利用
- プログラムの修正
- マルチスレッドプログラムのデバッグ
- パフォーマンスデータの収集
- 実行時検査機能の利用
- 配列のグラフ表示
- デバッグ環境の設定
- カスタムボタンの作成
また、Sun WorkShop には、コードのデバッグに役立つマシンレベルのコマンドやその他のコマンドも用意されています。「
dbx
コマンド」ウィンドウから標準のdbx
コマンドを利用することもできます。デバッグ方法とデバッグの概念、デバッグウィンドウ、
dbx
コマンドについては、オンラインヘルプを参照してください (オンラインヘルプには、Sun WorkShop のどのウィンドウからでも「ヘルプ」メニューまたは「ヘルプ」ボタンでアクセスできます)。デバッグの準備
デバッグを行うには、ソースファイルをコンパイルしたときのデバッグ情報が必要になります。デバッグ情報を作成するには、次のいずれかを行います。
- プロジェクトのソースファイルをコンパイルするときに、デバッグ情報を作成するよう指定する。このためには、WorkShop のメインウィンドウから「プロジェクト」
「プロジェクトの編集」を選択して、「プロジェクトの設定の変更」をクリックします。必要な選択を終了したら、「了解」をクリックして、プロジェクトを構築します。詳しくは、「現在のプロジェクトを編集」ウィンドウから「ヘルプ」をクリックするか、オンラインヘルプを参照してください。
-g
または-g0
(0
は数字のゼロ) オプションを使用してコンパイルする。これらのオプションは、コンパイル中にデバッグ情報を生成するようコンパイラに指示します (メークファイル内にこれらのオプションを指定する方法については、付録 B を参照)。プログラムのデバッグの準備についての詳細は、『dbx コマンドによるデバッグ』を参照してください。デバッグの開始
プログラムのデバッグを開始するには、次の手順に従ってください。
1. デバッグの状態を選択します。
- 「デバッグ」
「高速実行モード」: プログラムを普通に実行しますが、デバッガはプログラムが異常終了した場合、プログラムを救出できるようにバックグラウンドで動作します。すでにプログラムのデバッグ作業が終了していて、シンボル情報の読み込みを行う必要がなく、プログラムに対して修正した内容が正しく動作するかをテストするだけのテストをする場合には、このモードを使用してください。
- 「デバッグ」
「デバッグモード」(または Sun WorkShop のメインウィンドウのツールバーから「デバッグ」ボタンをクリック) : デバッグサービスの全機能を使用してプログラムをデバッグする場合は、このモードを選択します。
2. デバッグするプログラムを選択します。
- 現在のプログラムをデバッグするには、Sun WorkShop メインウィンドウのツールバーから「デバッグ」ボタンをクリックします。別のプログラムをデバッグするには、次のいずれかの操作を行います。
- 以前に Sun WorkShop で実行またはデバッグしたプログラムをデバッグする場合
- ピックリストにないプログラムをデバッグする場合
- 実行中の別のプロセスを接続する場合
- プログラム実行の失敗が原因で生成されたコアダンプファイルをデバッグする場合
- 「デバッグ」
「コアファイルの読み込み」を選択します。
- プログラムが読み込まれると、「デバッグ」ウィンドウ (図 4-1 を参照) とテキストエディタのウィンドウが開きます。Sun WorkShop では、テキストエディタのウィンドウにプログラムのソースコードを表示して、編集や基本的なデバッグ操作を行うことができます。エディタウィンドウのツールバーには、よく使用するデバッグ機能、特にソースのコンポーネントを引数として使用する機能のボタンと、Sun WorkShop の他のコンポーネントのボタンがあります。
- デフォルトのテキストエディタの変更と、テキストエディタのオプションの設定については、「テキストエディタの選択とテキストエディタのオプション」を参照してください。
3. 「デバッグ」ウィンドウから次のいずれかの操作を行い、プログラムを実行します。
- F6 キーを押す。
- 「デバッグ」ウィンドウのツールバーから「開始」をクリックする。
- 「デバッグ」ウィンドウから「実行」
「開始」を選択する。
- 「デバッグ」ウィンドウのツールバーから「継続」をクリックする。
- 「デバッグ」ウィンドウから「実行」
「継続」を選択する。
![]()
図 4-1 Sun Workshop の「デバッグ」ウィンドウデバッグセッションのカスタマイズ
次のオプションのデフォルト値を変更することによって、デバッグセッションをカスタマイズできます。
- デバッグの出力
- デバッグの動作
- ウィンドウのレイアウト
- ウィンドウの動作
- 「データ表示」ウィンドウ
- 言語とスコープ
- 実行時検査
- データグラファ
- デバッグのパフォーマンス
- フォークとスレッド
- コマンド行のみ
- 上級オプション
デバッグオプションを表示するには、「デバッグ」ウィンドウから「デバッグ」
「デバッグオプション」を選択します。「デバッグオプション」ダイアログボックスでは、特定のデバッグセッションだけカスタマイズすることも、デバッガ全体のデフォルト値を変更することもできます。
dbxenv
コマンドを使用して、dbx
の環境変数を設定することによって、デフォルト値の多くを変更することもできます (詳細はオンラインヘルプを参照)。デバッグオプションの設定についての詳細は、次を参照してください。
コードのステップ実行
コードを 1 行ずつ移動して、ステップごとに表示しながら実行できます。ステップ実行すると、プログラム内の現在の位置が緑色で強調表示されます。これをプログラムカウンタ (PC) と呼びます。PC は、各ステップごとに次に実行されるソース行に移動します。
コードのステップ実行についての詳細は、オンラインヘルプを参照してください。
ブレークポイントの設定
ブレークポイントを設定することによって、強制的にデバッガの実行を停止できます。単純なブレークポイント設定では、実行を停止する特定のコード行位置や手続き、関数を指定できます。詳細なブレークポイント設定では、C++ クラス内や特定の条件、特殊なイベントでの停止を指定したり、データの変化を追跡するように指定したり、独自のブレークポイントを作成したりできます。
ブレークポイントの設定と解除は、エディタのウィンドウまたは「ブレークポイント」ウィンドウで行うことができます。エディタのウィンドウでは、コード行位置や関数に対するブレークポイントを設定、解除できます。「ブレークポイント」ウィンドウでは、 シグナルが発生したときなどの、より複雑なブレークポイントを設定できます (「デバッグ」ウィンドウの「ブレークポイント」タブには、すでに設定されているブレークポイントが表示されます) 。
ブレークポイントの設定と使用方法については、オンラインヘルプを参照してください。
値とデータの検査
評価とは、式の値に対して一度だけ行われる無作為抽出検査です。エディタウィンドウまたは「デバッグ」ウィンドウから、いつでも式を評価できます。「デバッグ」ウィンドウの「データ表示」タブまたは独立した別の「データ表示」ウィンドウを使用して、プログラム停止時の値の変化を追跡できます。
評価結果は、「デバッグ」ウィンドウの「データ履歴」タブに一覧表示されます。点線は、前回の評価から評価コンテキストに変化があったことを示します。「データ履歴」タブの履歴リストは、以前に評価された式のリストです。「データ履歴」タブの履歴リストは、「データ」
「履歴消去」を選択することによっていつでも消去できます。
エディタのウィンドウから式を評価するには、次のいずれかを行います。
- 式のバルーン評価機能を利用する。エディタの現在のマウスカーソル位置にある式の現在値がただちに表示されます。詳細は、オンラインヘルプを参照してください。
- ソース表示から評価する変数または式を選択して、次のいずれかを行う。
値は「データ履歴」タブに表示されるか、エディタのウィンドウ最下部のメッセージ表示領域に表示されます (評価結果が短い場合)。評価コンテキストに変化があると、必ず、「データ履歴」タブのリストに区切り線が挿入されます。詳細は、オンラインヘルプを参照してください。
データ値の監視
デフォルトでは、「データ表示」は「デバッグ」ウィンドウのタブとして表示されますが、独立したウィンドウとして表示されるように設定することもできます。詳細は、オンラインヘルプを参照してください。
「デバッグ」ウィンドウの「データ表示」タブから、プログラム実行中の式の値の変化を観察できます。選択した一群の式は、ブレークポイント位置やステップ実行位置、プログラムの実行が中断されたときなどの、プログラムの実行停止のたびに、自動的に評価されます。式の値が変化すると、その値が太字で強調表示されます。
「データ表示」には、実行を中止するたびに値の変化が表示されます。プログラムの実行中に値の変化を観察する必要がある場合は、「アクセス時」ブレークポイント機能を使用してください (詳細は、オンラインヘルプを参照)。このブレークポイント機能を使用して、特定のメモリー位置に対する読み取りまたは書き込みが行われるたびにプログラムの実行を中止するように指示できます。
「データ表示」タブまたはウィンドウから、ポップアップウィンドウを開いて、式に関する追加情報を表示して管理できます。
パフォーマンスデータの収集
デバッガでのプログラムの実行中に、標本コレクタを使用して、パフォーマンスデータを収集し、標本アナライザで利用できる実験ファイルに出力できます。標本コレクタは、クロックに基づくプロファイルデータやスレッド同期の待ち状態トレースデータ、ハードウェアカウンタのオーバーフローに関するプロファイルデータ、アドレス空間データを収集できます。コレクタは、ページフォルトや入出力データ、コンテキストスイッチ、ワークセットやページング統計情報などの、グローバル実行の統計情報を自動的に記録します。
パフォーマンスデータの収集と解析については、次を参照してください。
- このマニュアルの第 6 章
- 『プログラムのパフォーマンス解析』
- オンラインヘルプ
実行時エラーの検出
実行時検査 (RTC) では、開発段階におけるアプリケーションの実行時エラーを自動検出できるほか、次のことを行えます。
実行時検査を行う場合は、プログラムを実行する前に検査の種類を選択しておく必要があります。その後、プログラムを実行すると、メモリーの使用状況に関するレポートが作成されます。
コードのトレース
トレース機能は、プログラムで発生するイベントに関する情報を収集して、収集したデータを「dbx コマンド」ウィンドウに表示します。このとき、プログラムの実行は停止しません。
トレースにフィルタを設定しないと、実行直前のソースコードの各行が表示されるため、単純なプログラム以外では大量の情報が出力されます。トレースにフィルタを設定して、トレースするプログラムのイベントを限定すると、特定の種類のデータを表示できます。たとえば、特定の関数呼び出しや特定の名前のメンバー関数、クラス内の関数、または関数からの終了をトレースできます。変数の値の変化をトレースすることもできます。
イベントは、デバッグ対象に設定されたプログラムのイベントです。代表的なイベントとしては、特定の変数の値の変化があります。ハンドラはデバッグイベントを管理します。「ブレークポイント」ウィンドウのトレースリストは、イベントの一種であるトレースを管理するため、トレースハンドラと呼ばれます。
呼び出しスタックの検査
呼び出しスタックは、現在アクティブなすべてのルーチン、すなわち、呼び出されたが、まだそれぞれの呼び出し元には復帰していないすべてのルーチンを表します。スタック区画には、関数とその引数が、呼び出された順序で一覧表示されます。初期関数 (C および C++ プログラムでは
main()
) はスタック区画の先頭、プログラムが停止した時点で実行されていた関数はスタック区画の最後に示されます。後者の関数を「停止位置関数」と呼びます。停止位置関数のソースコードは、エディタのウィンドウに表示され、次に実行される行は緑色で強調表示されます。
呼び出しスタックでは、次のいずれかの操作を行うことができます。
- 「上へ」ボタンをクリックするか「スタック」
「上へ」を選択して、スタック内を 1 レベル上に移動する。
- 「下へ」ボタンをクリックするか「スタック」
「下へ」を選択して、スタック内を 1 レベル下に移動する。
- 戻りたいフレームの横にカーソルを置いて「スタック」
「現フレームまでポップ」を選択し、複数のフレームを削除する。
- 「スタック」
「ポップ」を選択して、停止した関数をスタックから削除する
- 戻りたいフレームの横にポインタを置き、「スタック」
「現フレームまでポップ」を選択し、複数のフレームを削除する。
「ポップ」は、制限付きの元に戻す機能です。再び現在の関数の先頭から実行を開始するには、親スタックフレームまでポップし、その関数にステップインします。これで、関数の先頭に戻ります。
呼び出しスタックの使用方法については、オンラインヘルプを参照してください。
マルチスレッドプログラムのデバッグ
マルチスレッドプログラムであることが検出されると、「デバッグ」ウィンドウの「スレッド」タブが開きます。この状態から、「セッション」タブをクリックすることによって、セッションを表示できます。マルチスレッドプログラムの場合、「セッション」タブには、現在の選択されているプロセス内のスレッドに関する情報が一覧表示されます。現在のスレッドには、緑色の矢印が付きます。
複数プロセスの同時デバッグ
各プログラムをそれぞれ独立したデバッグセッションに接続し、一度に複数のプログラムをデバッグできます。この機能は、たとえば次のような場合に使用します。
1 つのプログラムをデバッグしているときに、別のプログラムをデバッグしようとすると、プログラムのデバッグ中であることを示すメッセージが表示され、現在のセッションを終了または切り離して、新しいデバッグセッションを読み込むか、または現在のセッションを再利用するか、あるいは両方のセッションをデバッグするか選択するよう求められます。両方のプログラムを同時にデバッグする場合にだけ両方のセッションのデバッグを選択してください。
セッションの管理
「デバッグ」ウィンドウの「セッション」タブおよび「活動状態セッション」ダイアログボックスは、現在アクティブな、すべてのデバッグセッションの一覧です。「活動状態セッション」ダイアログボックスを開くには、「デバッグ」ウィンドウから「デバッグ」
「セッション管理」を選択します。現在のプログラムには、矢印が付きます。
複数のセッションをデバッグするとリソースが消費され、システムの処理速度が低下することがあります。「デバッグ」ウィンドウには、現在アクティブなセッション数が表示されます。不要になったセッションは、「活動状態セッション」ダイアログボックスにある「切り離す」または「セッション終了」ボタンをクリックして、セッションを削除してください。
複数のセッションをデバッグすることはできますが、同時に複数のセッションのコンテキストを表示することはできません。別のセッションに切り替えると、「デバッグ」ウィンドウ、エディタウィンドウ、「dbx コマンド」ウィンドウなどはすべて、切り替え先のセッションのコンテキストを反映した内容になります。
2 つのプログラムを横に並べて表示する (それぞれのプログラムにエディタのウィンドウと「デバッグ」ウィンドウを表示する) には、2 つの WorkShop アプリケーションを実行する必要があります。2 つの WorkShop アプリケーションが同じエディタを使用しないようにするには、両方の WorkShop アプリケーションを次のコマンドを使用して起動します。
%workshop -s
editsessionnameたとえば、最初の WorkShop アプリケーションは
workshop -s 1
、2 つ目の WorkShop アプリケーションはworkshop -s 2
のようにします。詳細は、workshop
(1) のマニュアルページを参照してください。セッションの管理については、オンラインヘルプを参照してください。
子プロセスのデバッグ
プロセスが子プロセスをフォークした場合は、親または子プロセスのみ、またはその両方をデバッグするかを選択できます。通常、フォークされたプロセスからはすべてのブレークポイントが削除されますが、この設定を無効にすることもできます。
デバッグの終了
現在 Sun WorkShop の制御下にあるプロセスを終了しないで「デバッグ」ウィンドウを閉じるには、「デバッグ」
「閉じる」を選択します。この場合、Sun WorkShop の制御下にあるプロセスは、メモリーと CPU 時間を消費しながら、動作を継続します。Sun WorkShop は、それらプロセスに関するデータの記録を継続します。
Sun WorkShop の制御下にあるすべてのプロセスを終了して、すべてのデバッグウィンドウを閉じるには、「デバッグ」ウィンドウから「デバッグ」
「デバッグを終了」を選択します。
サン・マイクロシステムズ株式会社 Copyright information. All rights reserved. |
ホーム | 目次 | 前ページへ | 次ページへ | 索引 |