| dbx コマンドによるデバッグ |
第 4 章
プログラムの実行制御
実行、ステップ、および続行に使用されるコマンド (
run、rerun、next、step、および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を接続するすでに動作中のプログラムをデバッグしなければならないことがあります。動作中のプロセスにデバッグ機能を接続しなければならないのは、次のような場合です。
- 動作中のサーバーをデバッグしたいが、停止させたくない
- 動作中の GUI プログラムをデバッグしたいが、再起動したくない
- プログラムが無限ループに入っているかもしれないので、プログラムを停止させずにデバッグしたい
このような場合は、動作中のプログラムの プロセス ID (pid) を引数として
dbxコマンドに渡せば、そのプログラムにdbxを接続することができます。デバッグを終了すると、
detachコマンドが使用され、プロセスを終了することなくdbxの制御からプログラムを解放することができます。動作中のプロセスに接続されているときに
dbxを終了すると、dbxは終了前に自動的な切り離しを行います。
dbxとは関係なく実行されるプログラムへdbxを接続するには、attachコマンドまたはdebugコマンドを使用します。すでに実行中のプロセスへ
dbxを接続するには、次のように入力します。
(dbx)debugprogram_name process_IDまたは(dbx)attachprogram_name process_IDprogram_name を - (ダッシュ) で置換することができます。
dbxは、process_ID と関連するプログラムを自動的に検索し、ロードします。詳細については、Sun WorkShop オンラインへルプの「dbx コマンドの使い方」の「debug コマンド」および「attach コマンド」を参照してください。
dbxが実行中でない場合は、次のように入力してdbxを開始します。
%dbxprogram_name process_IDプログラムに
dbxを接続すると、そのプログラムは実行を停止します。このプログラムは、dbxに読み込んだプログラムの場合と同様にして調べることができます。任意のイベント管理コマンドまたはプロセス制御コマンドを使用してデバッグできます。「デバッグ」ウィンドウで「デバッグ」
「プロセスを接続」を選択することにより、実行中のプロセスに dbx を接続することもできます。詳細については、Sun WorkShop オンラインへルプの「デバッグウィンドウの使い方」の「実行中のプロセスへの接続」を参照してください。
プロセスから
dbxを切り離すプログラムのデバッグが終了したら、
detachコマンドを使用してdbxをプログラムから切り離してください。プログラムはdbxから独立して動作を再開します。
dbxの制御のもとで、プロセスを実行から切り離すには、次のように入力します。
(dbx)detach詳細については、Sun WorkShop オンラインへルプの「dbx コマンドの使い方」の「detach コマンド」を参照してください。
「デバッグ」ウィンドウで「実行」
「プロセスを切り離す」を選択することにより、プロセスから dbx を切り離すこともできます。詳細については、Sun WorkShop オンラインへルプの「デバッグウィンドウの使い方」の「プロセスからの切り離し」を参照してください。
プログラムのステップ実行
dbxは、next、stepというステップ実行のための基本コマンドに加え、ステップ実行の変形であるstep upをサポートします。nextとstepはともに、プログラムにソースの 1 行を実行させ、停止します。実行される行に関数呼び出しが含まれる場合、
nextコマンドにより、呼び出しは実行され、次の行で停止します (呼び出しを "ステップオーバー")。stepコマンドは、呼び出された関数の最初の行で停止します (呼び出しへの "ステップ")。「デバッグ」ウィンドウで「実行」「ステップオーバー」を選択するか、ツールバーの「ステップオーバー」ボタンをクリックすることにより、関数をステップオーバーすることもできます。「実行」
「ステップイン」を選択するか、ツールバーの「ステップイン」ボタンをクリックすることにより、関数をステップ実行することができます。
step upコマンドは、関数をステップ実行した後、呼び出し元の関数へプログラムを戻します。「デバッグ」ウィンドウで「実行」「ステップアウト」を選択するか、ツールバーの「ステップアウト」ボタンをクリックすることにより、関数をステップアウトすることもできます。
詳細については、Sun WorkShop オンラインへルプの「デバッグウィンドウの使い方」の「プログラムのステップ実行」を参照してください。
シングルステップ
指定された数のコード行をシングルステップするには、実行したいコードの行数 [n] を付けた
dbxコマンド、nextまたはstepを使用します。
(dbx)nextnまたは(dbx)stepn
step_granularity環境変数は、ソース行ステップの細分化、つまり、コード行をステップ実行する必要のあるnextコマンドの数を決定します。詳細については、Sun WorkShop オンラインへルプの「dbx コマンドの使い方」の「step_granularity 環境変数」を参照してください。コマンドについての詳細は、Sun WorkShop オンラインへルプの「dbx コマンドの使い方」の「next コマンド」および「step コマンド」を参照してください。
プログラムを継続する
(dbx)cont「デバッグ」ウィンドウで「実行」
「継続」を選択するか、ツールバーの「継続」 ボタンをクリックすることにより、プログラムの実行を継続することもできます。
contコマンドには、派生関数のcont atline_number があります。これを使用すると、現在のプログラム位置の行以外の行を指定して、プログラムの実行を再開することができます。これにより、再コンパイルすることなく、問題を起こすことがわかっている 1 行または複数行のコードをスキップできます。
(dbx)cont at 124行番号は、プログラムが停止しているファイルから計算される点に注意してください。指定した行番号は、関数のスコープ内になければなりません。
cont atline_number とassignとを組み合わせると、ある変数の値を正しく計算できない関数の呼び出しが含まれている行を実行しないようにすることができます。特定の行からプログラムの実行を再開するには、次のようにします。
1.assignを使用して変数に正しい値を代入します。2.cont atline-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 コマンドについての詳細は、次の節を参照してください。
- 「ソースコードの特定の行に stop ブレークポイントを設定する」
- 「異なるクラスのメンバー関数にブレークポイントを設定する」
- 「同じクラスのメンバー関数にブレークポイントを設定する」
- 「非メンバー関数に複数のブレークポイントを設定する」
- Sun WorkShop オンラインヘルプの「dbx コマンドの使い方」の「when コマンド」
関数を呼び出す
プログラムが停止しているとき、dbxコマンドcallを使用して関数を呼び出すことができます。callコマンドには、被呼び出し側関数に渡す必要のあるパラメータの値を指定することもできます。関数 (手続き) を呼び出すには、 関数の名前を入力し、その引数を指定します。たとえば、次のように入力します。
(dbx)call change_glyph(1,3)引数 parameters は省略できますが、関数名 function_name の後には必ず括弧を入力してください。たとえば、次のように入力します。
(dbx)call type_vehicle()
callコマンドを使用して関数を明示的に呼び出したり、関数呼び出しを含む式を評価するか、stop in glyph -if animate()などの条件付修飾子を使用して、関数を暗示的に呼び出すことができます。C++ 仮想関数は、
callコマンドを使用する (Sun WorkShop オンラインヘルプの「dbx コマンドの使い方」の「print コマンド」または「call コマンド」参照) その他の関数、または関数呼び出しを実行するその他のコマンド同様に呼び出すことができます。関数が定義されているソースファイルが
-gフラグでコンパイルされたものであるか、プロトタイプ宣言が現在のスコープで可視であれば、dbxは引数の数と型をチェックし、不一致があったときはエラーメッセージを出します。それ以外の場合、dbxは引数の数をチェックしません。デフォルトでは、
callコマンドが実行されるたびに、dbxはfflush(stdout)を自動的に呼び出し、入出力バッファに格納されているすべての情報を出力します。自動的なフラッシュをオフにするには、dbxenv output_autoflushを off に設定してください。C++ の場合、
dbxはデフォルト引数と関数の多重定義も処理します。可能であれば、C++ 多重定義関数の自動解析が行われます。関数を特定できない場合は (関数が-gでコンパイルされていない場合など)、多重定義名のリストが表示されます。
callを使用すると、dbxはnextのように動作し、被呼び出し側から戻ります。しかし、プログラムが被呼び出し側関数でブレークポイントにあたると、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. |
ホーム | 目次 | 前ページへ | 次ページへ | 索引 |