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)
debug
program_name process_IDまたは(dbx)attach
program_name process_IDprogram_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
は、next
、step
というステップ実行のための基本コマンドに加え、ステップ実行の変形である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 コマンド」を参照してください。
プログラムを継続する
(dbx)
cont
「デバッグ」ウィンドウで「実行」
「継続」を選択するか、ツールバーの「継続」 ボタンをクリックすることにより、プログラムの実行を継続することもできます。
cont
コマンドには、派生関数のcont at
line_number があります。これを使用すると、現在のプログラム位置の行以外の行を指定して、プログラムの実行を再開することができます。これにより、再コンパイルすることなく、問題を起こすことがわかっている 1 行または複数行のコードをスキップできます。
(dbx)
cont at 124
行番号は、プログラムが停止しているファイルから計算される点に注意してください。指定した行番号は、関数のスコープ内になければなりません。
cont at
line_number とassign
とを組み合わせると、ある変数の値を正しく計算できない関数の呼び出しが含まれている行を実行しないようにすることができます。特定の行からプログラムの実行を再開するには、次のようにします。
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 コマンドについての詳細は、次の節を参照してください。
- 「ソースコードの特定の行に 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. |
ホーム | 目次 | 前ページへ | 次ページへ | 索引 |