dbx コマンドによるデバッグ ホーム目次前ページへ次ページへ索引


第 4 章

プログラムの実行制御

実行、ステップ、および続行に使用されるコマンド (runrerunnextstep、および cont) は、プロセス制御コマンドと呼ばれます。このマニュアルで後述するイベント管理コマンドとともに使用すると、プログラムが dbx のもとで実行されるときに、その実行時の動作を管理できます。

この章は次の各節から構成されています。

dbx でプログラムを実行する

プログラムを初めて dbx に読み込むと、dbx はそのプログラムの「メイン」ブロック (C, C++, Fortran 90 の場合は main()、FORTRAN 77 の場合は MAIN) におとずれます。dbx は続いて、ユーザーから出されるコマンドを待機します。ここで、別の部分のコードを表示したり、イベント管理コマンドを使用したりすることができます。

プログラムを実行する前に、そのプログラムにブレークポイントを設定することもできます。準備ができたら、run コマンドを使用してプログラムを実行してください。

dbx で引数を指定しないでプログラムを実行するには、次のように入力します。

(dbx) run

任意でコマンド行の引数と入出力の切り替えを追加できます。この場合は、次のように入力します。

(dbx) run [arguments][ < input_file] [ > output_file]

run コマンドの出力は、dbx を実行しているシェルに noclobber を設定した場合でも、既存ファイルを上書きします。

run コマンドそのものは、前の引数とリダイレクトを使用して、プログラムを実行します。rerun コマンドは、元の引数とリダイレクトなしでプログラムを実行します。詳細については、Sun WorkShop オンラインへルプの「dbx コマンドの使い方」の「rerun コマンド」を参照してください。

動作中のプロセスに dbx を接続する

すでに動作中のプログラムをデバッグしなければならないことがあります。動作中のプロセスにデバッグ機能を接続しなければならないのは、次のような場合です。

このような場合は、動作中のプログラムの プロセス ID (pid) を引数として dbx コマンドに渡せば、そのプログラムに dbx を接続することができます。

デバッグを終了すると、detach コマンドが使用され、プロセスを終了することなく dbx の制御からプログラムを解放することができます。

動作中のプロセスに接続されているときに dbx を終了すると、dbx は終了前に自動的な切り離しを行います。

dbx とは関係なく実行されるプログラムへ dbx を接続するには、attach コマンドまたは debug コマンドを使用します。

すでに実行中のプロセスへ dbx を接続するには、次のように入力します。

(dbx) debug program_name process_ID

 
または

 
(dbx) attach program_name process_ID

program_name を - (ダッシュ) で置換することができます。dbx は、process_ID と関連するプログラムを自動的に検索し、ロードします。

詳細については、Sun WorkShop オンラインへルプの「dbx コマンドの使い方」の「debug コマンド」および「attach コマンド」を参照してください。

dbx が実行中でない場合は、次のように入力して dbx を開始します。

% dbx program_name process_ID

プログラムに dbx を接続すると、そのプログラムは実行を停止します。このプログラムは、dbx に読み込んだプログラムの場合と同様にして調べることができます。任意のイベント管理コマンドまたはプロセス制御コマンドを使用してデバッグできます。

「デバッグ」ウィンドウで「デバッグ」 「プロセスを接続」を選択することにより、実行中のプロセスに dbx を接続することもできます。詳細については、Sun WorkShop オンラインへルプの「デバッグウィンドウの使い方」の「実行中のプロセスへの接続」を参照してください。

プロセスから dbx を切り離す

プログラムのデバッグが終了したら、detach コマンドを使用して dbx をプログラムから切り離してください。プログラムは dbx から独立して動作を再開します。

dbx の制御のもとで、プロセスを実行から切り離すには、次のように入力します。

(dbx) detach 

詳細については、Sun WorkShop オンラインへルプの「dbx コマンドの使い方」の「detach コマンド」を参照してください。

「デバッグ」ウィンドウで「実行」 「プロセスを切り離す」を選択することにより、プロセスから dbx を切り離すこともできます。詳細については、Sun WorkShop オンラインへルプの「デバッグウィンドウの使い方」の「プロセスからの切り離し」を参照してください。

プログラムのステップ実行

dbx は、nextstep というステップ実行のための基本コマンドに加え、ステップ実行の変形である step up をサポートします。next step はともに、プログラムにソースの 1 行を実行させ、停止します。

実行される行に関数呼び出しが含まれる場合、next コマンドにより、呼び出しは実行され、次の行で停止します (呼び出しを "ステップオーバー")。step コマンドは、呼び出された関数の最初の行で停止します (呼び出しへの "ステップ")。「デバッグ」ウィンドウで「実行」 「ステップオーバー」を選択するか、ツールバーの「ステップオーバー」ボタンをクリックすることにより、関数をステップオーバーすることもできます。「実行」 「ステップイン」を選択するか、ツールバーの「ステップイン」ボタンをクリックすることにより、関数をステップ実行することができます。

step up コマンドは、関数をステップ実行した後、呼び出し元の関数へプログラムを戻します。「デバッグ」ウィンドウで「実行」 「ステップアウト」を選択するか、ツールバーの「ステップアウト」ボタンをクリックすることにより、関数をステップアウトすることもできます。

詳細については、Sun WorkShop オンラインへルプの「デバッグウィンドウの使い方」の「プログラムのステップ実行」を参照してください。

シングルステップ

指定された数のコード行をシングルステップするには、実行したいコードの行数 [n] を付けた dbx コマンド、next または step を使用します。

(dbx) next n

 
または

 
(dbx) step n

step_granularity 環境変数は、ソース行ステップの細分化、つまり、コード行をステップ実行する必要のある next コマンドの数を決定します。詳細については、Sun WorkShop オンラインへルプの「dbx コマンドの使い方」の「step_granularity 環境変数」を参照してください。

コマンドについての詳細は、Sun WorkShop オンラインへルプの「dbx コマンドの使い方」の「next コマンド」および「step コマンド」を参照してください。

プログラムを継続する

プログラムを継続するには、cont コマンドを使用します。

(dbx) cont

「デバッグ」ウィンドウで「実行」 「継続」を選択するか、ツールバーの「継続」 ボタンをクリックすることにより、プログラムの実行を継続することもできます。

cont コマンドには、派生関数の cont at line_number があります。これを使用すると、現在のプログラム位置の行以外の行を指定して、プログラムの実行を再開することができます。これにより、再コンパイルすることなく、問題を起こすことがわかっている 1 行または複数行のコードをスキップできます。

指定の行でプログラムを継続するには、次のように入力します。

(dbx) cont at 124

行番号は、プログラムが停止しているファイルから計算される点に注意してください。指定した行番号は、関数のスコープ内になければなりません。

cont at line_numberassign とを組み合わせると、ある変数の値を正しく計算できない関数の呼び出しが含まれている行を実行しないようにすることができます。

特定の行からプログラムの実行を再開するには、次のようにします。

1. assign を使用して変数に正しい値を代入します。

2. cont at line-number で、その値を正しく計算できない関数の呼び出しが含まれている行を飛ばします。

プログラムが 123 行目で停止しているものとします。その行では、関数 how_fast() を呼び出しています。この関数は、変数 speed を正しく計算しません。speed の正しい値がわかっているため、speed に値を代入することができます。その後、how_fast() の呼び出しを飛ばして、プログラムの実行を 124 行目から継続します。

(dbx) assign speed = 180; cont at 124;

詳細については、Sun WorkShop オンラインへルプの「dbx コマンドの使い方」の「cont コマンド」を参照してください。

このコマンドを when ブレークポイントコマンドとともに使用すると、プログラムは 123 行目の実行を試みるたびに how_fast() の呼び出しを飛ばします。

(dbx) when at 123 { assign speed = 180; cont at 124;}

when コマンドについての詳細は、次の節を参照してください。

関数を呼び出す

プログラムが停止しているとき、dbx コマンド call を使用して関数を呼び出すことができます。call コマンドには、被呼び出し側関数に渡す必要のあるパラメータの値を指定することもできます。

関数 (手続き) を呼び出すには、 関数の名前を入力し、その引数を指定します。たとえば、次のように入力します。

(dbx) call change_glyph(1,3)

引数 parameters は省略できますが、関数名 function_name の後には必ず括弧を入力してください。たとえば、次のように入力します。

(dbx) call type_vehicle()

call コマンドを使用して関数を明示的に呼び出したり、関数呼び出しを含む式を評価するか、stop in glyph -if animate() などの条件付修飾子を使用して、関数を暗示的に呼び出すことができます。

C++ 仮想関数は、print コマンドや call コマンドを使用する (Sun WorkShop オンラインヘルプの「dbx コマンドの使い方」の「print コマンド」または「call コマンド」参照) その他の関数、または関数呼び出しを実行するその他のコマンド同様に呼び出すことができます。

関数が定義されているソースファイルが -g フラグでコンパイルされたものであるか、プロトタイプ宣言が現在のスコープで可視であれば、dbx は引数の数と型をチェックし、不一致があったときはエラーメッセージを出します。それ以外の場合、dbx は引数の数をチェックしません。

デフォルトでは、call コマンドが実行されるたびに、dbxfflush(stdout) を自動的に呼び出し、入出力バッファに格納されているすべての情報を出力します。自動的なフラッシュをオフにするには、dbxenv output_autoflush を off に設定してください。

C++ の場合、dbx はデフォルト引数と関数の多重定義も処理します。可能であれば、C++ 多重定義関数の自動解析が行われます。関数を特定できない場合は (関数が -g でコンパイルされていない場合など)、多重定義名のリストが表示されます。

call を使用すると、dbxnext のように動作し、被呼び出し側から戻ります。しかし、プログラムが被呼び出し側関数でブレークポイントにあたると、dbx はそのブレークポイントでプログラムを停止し、メッセージを表示します。ここで where コマンドを実行すると、dbx コマンドのレベルを起点として呼び出しが行われたことが示されます。

実行を継続すると、呼び出しは正常に戻ります。強制終了、実行、再実行、デバッグを行おうとすると、dbx は入れ子になったインタプリタから回復しようとするので、コマンドが異常終了します。異常終了したコマンドは再発行することができます。また、pop -c コマンドを使用して、すべてのフレームを最後の呼び出しまでポップ (解放) することもできます。

Control+C によってプロセスを停止する

dbx で実行中のプロセスは、Control +C (^C) を使用して停止できます。^C によってプロセスを停止すると、dbx^C を無視しますが、子プロセスはそれを SIGINT と見なして停止します。このプロセスは、それがブレークポイントによって停止しているときと同じように検査することができます。

^C によってプログラムを停止した後に実行を再開するには、コマンド cont を使用します。実行を再開する場合、cont に修飾語 sig <シグナル名> は必要ありません。cont コマンドは、保留シグナルをキャンセルした後で子プロセスを再開します。


サン・マイクロシステムズ株式会社
Copyright information. All rights reserved.
ホーム   |   目次   |   前ページへ   |   次ページへ   |   索引