dbx は、next と step という 2 つのシングルステップ実行のための基本コマンドに加え、step up と step to という名前の step コマンドの 2 つの関連コマンドをサポートしています。 next コマンドと step コマンドはどちらも、再度停止する前に 1 ソース行を実行します。
実行される行に関数呼び出しが含まれる場合、next コマンドにより、呼び出しは実行され、次の行で停止します (呼び出しを「ステップオーバー」)。step コマンドは、呼び出された関数の最初の行で停止します (呼び出しへの「ステップ」)。
step up コマンドは、ユーザーが関数にステップ実行したあと、そのプログラムを呼び出し側の関数に返します。
step to コマンドは、現在のソース行内の指定された関数か、または関数が指定されていない場合は、現在のソース行のアセンブリコードによって特定される最後に呼び出された関数へのステップインを試みます。条件付き分岐のために関数呼び出しが実行されなかったり、現在のソース行ではどの関数も呼び出されなかったりする可能性があります。このような場合、step to は現在のソース行をステップオーバーします。
next および step コマンドの詳細については、next コマンドと step コマンドを参照してください。
指定された行数のコードをシングルステップで実行するには、dbx コマンド next または step を使用し、そのあとに実行したいコードの行数 [n] を指定します。
(dbx) next n
または
(dbx) step n
step_granularity dbxenv 変数によって、step コマンドや next コマンドがコードをステップ実行する単位が決定されます。この単位は statement または line のどちらかです。
step_events 環境変数は、ステップ実行中にブレークポイントを有効にするかどうかを制御します。
step_abflow 環境変数は、dbx が、異常な制御フロー変更が実行されようとしていることを検出したときに停止するかどうかを制御します。このタイプの制御フロー変更は、siglongjmp() または longjmp() の呼び出し、あるいは例外のスローが原因で発生することがあります。
詳細については、dbxenv 変数の設定を参照してください。
現在のソースコード行から呼び出された関数にステップインするには、step to コマンドを使用します。
(dbx) step to function
最後に呼び出された関数にステップインするには、次のように入力します。
(dbx) step to
次の 2 つの例では、step to を単独で使用すると foo にステップインします。
foo(bar(baz(4)));
baz()->bar()-> foo()
プログラムがブレークポイントに達したか、または何らかのイベントが発生したあとにそのプログラムの実行を継続するには、cont コマンドを使用します。
(dbx) cont
その変形である cont at line-number を使用すると、現在のプログラムの場所以外の行からプログラムの実行を再開するように指定できます。このオプションを使用すると、再コンパイルしなくても、問題の原因であることがわかっている 1 行以上のコードをスキップできます。
指定された行でプログラムの実行を継続するには、次のように入力します。
(dbx) cont at 124
この行番号は、プログラムが停止されたファイルを基準にして評価されます。指定された行番号は、現在の関数のスコープ内にある必要があります。
cont at line-number コマンドを assign コマンドとともに使用すると、ある変数の値を誤って計算している可能性のある関数の呼び出しを含むコード行の実行を回避できます。誤って計算された値をすばやく調整するには、assign コマンドを使用してその変数に正しい値を割り当てます。その値を誤って計算することになる関数呼び出しを含む行をスキップするには、cont at line-number を使用します。
たとえば、プログラムが行 123 で停止したとします。行 123 は関数 how_fast() を呼び出します。この関数が変数 speed を正しく計算していません。speed の正しい値がわかっているため、speed に値を代入することができます。次に、how_fast() の呼び出しをスキップして、行 124 でプログラムの実行を継続します。
(dbx) assign speed = 180; cont at 124;
cont コマンドを when ブレークポイントコマンドとともに使用すると、プログラムは 123 行目の実行を試みるたびに how_fast() の呼び出しを飛ばします。
(dbx) when at 123 { assign speed = 180; cont at 124;}
詳細については、次を参照してください。
プログラムが停止された場合は、dbx の call コマンドを使用して関数を呼び出すことができます。このコマンドは、呼び出された関数に渡す必要のあるパラメータの値を受け入れます。
手続きを呼び出すには、関数の名前を入力し、そのパラメータを指定します。 例:
(dbx) call change_glyph(1,3)
パラメータはオプションですが、関数名のあとに括弧を入力する必要があります。例:
(dbx) call type_vehicle()
call コマンドを使用して関数を明示的に呼び出したり、関数呼び出しを含む式を評価するか、または stop in glyph -if animate() などの条件付き修飾子を使用することによって関数を暗黙的に呼び出したりすることができます。
C++ 仮想機能は、print コマンドか call コマンド、または関数呼び出しを実行するその他の任意のコマンドを使用することにより、ほかのすべての関数と同様に呼び出すことができます。
C++ の場合、dbx はデフォルト引数と関数の多重定義も処理します。可能であれば、C++ 多重定義関数の自動解析が行われます。何らかのあいまいさが残る (たとえば、関数が –g でコンパイルされていない) 場合は、dbx によって、多重定義された名前のリストが表示されます。
関数が定義されているソースファイルが –g オプションでコンパイルされた場合、またはプロトタイプ宣言が現在のスコープで可視である場合、dbx は引数の数と型をチェックし、不一致があればエラーメッセージを発行します。それ以外の場合、dbx はパラメータの数をチェックせずに呼び出しを続行します。
デフォルトでは、call コマンドが実行されるたびに、dbx は fflush(stdout) を自動的に呼び出して、入出力バッファー内に格納されているすべての情報が確実に出力されるようにします。 自動的なフラッシュを無効にするには、dbxenv 変数 output_auto_flush を off に設定します。
call を使用すると、dbx は next のように動作し、被呼び出し側から戻ります。しかし、プログラムが被呼び出し側関数でブレークポイントにあたると、dbx はそのブレークポイントでプログラムを停止し、メッセージを表示します。次に、where コマンドを入力すると、スタックトレースに dbx コマンドのレベルから発生した呼び出しが示されます。
実行を継続すると、呼び出しは正常に戻ります。強制終了、実行、再実行、デバッグを行おうとすると、dbx は入れ子になったインタプリタから回復しようとするので、コマンドが異常終了します。そのあと、そのコマンドを再発行できます。あるいは、pop –c コマンドを使用して、すべてのフレームをデバッガから実行された最新の呼び出しまでポップすることもできます。
call コマンドを使用するか、または呼び出しを含む式を出力することによってデバッグ対象のプロセスを呼び出すと、すぐには現れない重大な障害が発生する可能性があります。例:
呼び出しが無限ループに入る可能性があります。これは中断できますが、中断しないと、セグメント例外が発生します。多くの場合は、pop –c コマンドを使用して、呼び出しの場所に戻ることができます。
マルチスレッドアプリケーションで呼び出しを行うと、デッドロックを回避するためにすべてのスレッドが再開されるため、呼び出しを行なったスレッド以外のスレッドで副作用が現れる可能性があります。
ブレークポイント条件で使用された呼び出しによって、イベント管理が混乱する可能性があります (実行の再開を参照)。
dbx によって行われる一部の呼び出しは、安全に実行されます。通常の Stopped with call to ... ではなく問題 (通常はセグメント例外) が検出された場合、dbx は次のいずれかのアクションを実行します。
メモリーアクセスエラーの検出によって発生したコマンドを含む、すべての stop コマンドを無視します。
pop -c コマンドを自動的に発行して、呼び出しの場所に戻ります。
実行を継続します。
dbx は、次の状況では安全な呼び出しを使用します。
display コマンドによって出力される式の中で発生した呼び出し。失敗した呼び出しは、ic0->get _data() = <call failed> と表示されます。
このような失敗を診断するには、print コマンドを使用して、式を出力します。
print -p コマンドを使用する場合を除く、db_pretty_print() 関数の呼び出し。
イベント条件式で使用する呼び出し。呼び出しが失敗した条件は false と評価されます。
pop コマンドの実行時にデストラクタを呼び出すための呼び出し。
すべての内部呼び出し。