5. 停止と継続
あなたがプログラムを普通に実行したならば、それは終了するまで動作した
ままです。デバッガを使う主な目的は、あるポイントの前で
プログラムの実行を止め; プログラムがトラブルに巻き込まれた内容を調査し、
なぜそうなったのかを見つけ出すことができるようにすることにあります。
シグナルは、プログラムにとっていつ発生するかわからない、非同期の
イベントです。オペレーティング・システムは、シグナルとして利用可能な
種類を定義し、それぞれに名前と番号を割り振っています。
例えば、SIGINT
は、あなたが Ctrl-c を入力した時に
プログラムが得るシグナルであり; SIGSEGV
はプログラムが利用
可能なメモリ領域を逸脱して参照した時に発生し; SIGALRM
は
(プログラムがアラームを要求した時にのみ発生するのですが)
アラームクロック・タイマの時間が来た時に発生します。
SIGALRM
を含むあるシグナルは、プログラムの機能として正常な
ものです。反面、SIGSEGV
のようなものはエラーを含んでいます;
これらのシグナルは、プログラムが前もってなんらかの方法でシグナルを
処理するように記述されていない限り、(プログラムが即座に kill される
ような) 致命的なものです。
SIGINT
はプログラムのエラーには含まれませんが、Ctrl-c の
結果としてプログラムが kill されるので、普通、致命的です。
GDB には、GDB のコントロールの下で動作するプログラムが発生させる
シグナルをキャッチする能力があります。あなたは、GDB に対して、
前もって各々のシグナルをどう処理するのかを指示することができます。
通常、GDB は SIGALRM
のような (そのインタフェースにより
プログラムの機能として働く) エラーでないシグナルを無視するように
設定されています。しかし、エラーシグナルが発生した場合は、即座に
プログラムを停止させます。あなたは、これらの設定を `handle'
コマンドによって変更することができます。この場合、対象となるシグナルを
番号によって指示しなければなりません。
- info signal
-
シグナルの種類の一覧表を表示し、GDB が、各々をどう処理するのかを
示します。あなたは、このコマンドを使うことによって、
シグナルの型として定義されている番号を知ることができます。
- handle signalnum keywords...
-
GDB が signalnum で表されるシグナルを処理する方法を変更します。
keywords はどのような変更なのかを指示します。
`handle' コマンドを使う場合、あなたは、関心のあるシグナルの
コードナンバーを知っておかなければなりません。コードナンバーを知る
には、シグナル名と番号の一覧表を表示する `info signal' コマンドを
入力して下さい。
handle コマンドに許可されているキーワードは、短く省略できるように
なっています。それらのフルネームは以下の通りです。
- stop
-
シグナルが発生した場合、GDB はプログラムを停止します。
このキーワードは、`print' キーワードとともに良く指定されます。
- print
-
GDB は、シグナルが発生した場合、メッセージを表示するようになります。
- nostop
-
シグナルが発生した場合、GDB はプログラムを停止させません。これは、
シグナルが起こったというメッセージをあなたに知らせるだけです。
- noprint
-
GDB は、シグナルの発生を報告しません。
これは、`nostop' キーワードとともに利用されます。
- pass
-
GDB は、そのシグナルをプログラムが受け取ることを許可します;
プログラムはシグナルを処理できるようになりますが、致命的なシグナルを
処理していない場合は停止させられます。
- nopass
-
GDB は、プログラムがシグナルを受け取ることを許可しません。
シグナルがプログラムを停止させるように設定されていたならば、
あなたが処理を継続させない限り、プログラムはシグナルを受け取る
ことができません。また、問題のシグナルに対して、その時 `pass' が
有効であれば初めて、プログラムはシグナルを受け取ることができます。
言い換えれば、GDB がシグナルを報告した後で、あなたは `pass' や
`nopass' を記述した `handle' コマンドを使って、その直後に
プログラムが継続された時にシグナルを見ることができるかどうかを
コントロールすることができます。
あなたはまた、`signal' コマンドを使って、プログラムがシグナルを
受け取ることを妨げたり、通常見ることのできないシグナルを見れるように
したり、また、いつでも好きなときに好きなシグナルを送ることができます。
“10.3 プログラムへのシグナルの送信”を参照して下さい。
ブレークポイントは、指定した位置にプログラムが来た場合に
プログラムを停止させるためのものです。あなたは、ブレークポイントを、
プログラムが停止すべき行番号、関数名、または実際のプログラムアドレス
を用いて、GDB のコマンドとして系統立てて設定することが可能です。
あなたはまた、プログラムが停止する時の様々な条件を追加設定することも
できます。
各々のブレークポイントは、設定された時に数字が割り当てられます;
これらの数字は、1からはじまる連続する整数です。様々なコマンドを
ブレークポイントに対して作用させる時、あなたが変更したいブレーク
ポイントがどれなのかを、ブレークポイント番号を用いて指定する必要が
あります。それぞれのブレークポイントは有効にしたり、
無効に
したりすることができ; もし無効にしたならば、あなたが再び有効に
するまではプログラムに対して何の効果も与えません。
`info break' というコマンドは、設定済みのまだ削除されていない
ブレークポイントの一覧表を表示し、それらの番号と、それらがプログラムの
どこに設定されており、どのような特性が設定されているかどうかも表示
します。無効なブレークポイントも一覧表の中に含まれますが、それには
無効を表すマークがつきます。`info break' にブレークポイント番号を
付加すると、そのブレークポイントのみを表示します。簡易変数 $_
と、
`x' コマンドのデフォルトの調査先アドレスは、一覧表の最後の
ブレークポイントのアドレスに設定されます(“8.5.1 メモリの調査”をご覧下さい)。
ブレークポイントは `break' コマンドで設定されます(省略形は `b')。
あなたは、ブレークポイントを様々な方法で設定することができます。
- break function
-
function のエントリにブレークポイントを設定します。
- break +offset
- break -offset
-
現在選択されているフレーム上で実行を一時停止している場所の offset
の行数分だけ、前方、後方にブレークポイントを設定します。
- break linenum
-
カレントのソースファイルの linenum の位置にブレークポイントを
設定します。この場合のソースファイルは、ソース上のテキストが
最後に表示されたものです。このブレークポイントは、その行にある
何らかのコードが実行された時に、プログラムを停止させます。
- break filename:linenum
-
filename というソースファイルの linenum で指定される行に
ブレークポイントを設定します。
- break filename:function
-
filename で示されるソースファイルの中にある function に
ブレークポイントを設定します。ファイル名とともに関数を指定するのは、
複数のファイルが同一名称の関数を含む場合以外は不要です。
- break *address
-
ブレークポイントを address で示されるアドレスに設定します。
プログラムがデバッギング情報や、ソースファイルを持たない場合などに、
このブレークポイントを設定します。
- break
-
ブレークポイントを、現在選択されているスタックフレーム (“6. スタックの調査”をご覧下さい)
上の次の実行命令に設定します。最深部でない任意の選択されたフレームでは、
このブレークはそのフレームからリターンする時にプログラムを停止させます。
これは、選択されたフレームの内部のフレームにおいて `finish'
コマンドを使ったのと同等です。もし、これが最深部のフレームで実行された
時は、GDB は現在の位置の次に達するであろう位置でプログラムを停止
させます;
これは、ループの中で使うと便利な機能です。
GDB は、通常、実行が再開された場合は、少なくとも1つの命令が実行される
まで、ブレークポイントを無視します。もし、そうなっていないならば、
あなたは最初のブレークポイントを無効にしないと、最後のブレーク
ポイントから抜けることができなくなってしまいます。このルールは、
いずれにせよ、プログラムが停止した時、ブレークポイントを設定したまま
にしておくことを可能にしています。
- break ... if cond
-
cond という条件でブレークポイントを設定します; cond の式の
評価はブレークポイントに達した時に行われ、cond の値が非ゼロの時に
停止します。`...' はどこで停止するのかを記述したブレーク
ポイントとして記述可能な引数(又は引数なし)を表します。ブレーク
ポイントの条件の更に詳しい説明は、“5.2.4 ブレーク条件”を参照して下さい。
- tbreak args
-
1回だけ停止するブレークポイントを設定します。args は `break'
コマンドで設定するものと同じであり、ブレークポイントも同一の方法で設定
されますが、最初にヒットした時に、そのブレークポイントは自動的に無効に
なります。“5.2.3 ブレークポイントの無効化”を参照して下さい。
GDB は、プログラムの同一箇所での複数のブレークポイントの設定を許可して
います。このことは、バカなことでも無意味なことでもありません。ブレーク
ポイントに条件が設定されていた場合に有効な機能です(“5.2.4 ブレーク条件”を参照して下さい)。
ひとたびその役目を果たし、もうプログラムのその部分では停止して欲しく
ないブレークポイントを削除することは重要です。これは、ブレークポイントの
削除と呼ばれています。削除された結果、もはやどこにも存在しないブレーク
ポイントは忘れ去られます。
`clear' コマンドを使うことによって、あなたはプログラムのその部分に
一致するブレークポイントを削除することができます。`delete' コマンドを
使うことによって、あなたはブレークポイント番号で示される単一のブレーク
ポイントを削除することができます。
直前のブレークポイントで停止した場所から更に先に進むために、ブレーク
ポイントを削除する必要はありません。 GDB は、あなたが実行アドレスを
変更して継続しなくても、自動的に、実行された最初の命令にかかっている
ブレークポイントを無視します。
- clear
-
選択されたスタックフレーム (“6.3 フレームの選択”をご覧下さい) 上の、次に起動される
命令に設定されている何らかのブレークポイントを削除します。最深部の
フレームが選択されていた場合は、プログラムが正に停止している部分の
ブレークポイントを削除する、最もよい方法です。
- clear function
- clear filename:function
-
function のエントリに設定されている全てのブレークポイントを
削除します。
- clear linenum
- clear filename:linenum
-
指定された行のコードに設定されている全てのブレークポイントを削除
します。
- delete bnums...
-
引数として指定された番号に対するブレークポイントを削除します。
通常は、ブレークポイントを削除することよりむしろ、それを無効に
した方がいいでしょう。これはブレークポイントをそれが削除されたのと
同様な状態にしますが、後で再びあなたが有効にすることができるように
ブレークポイントに関する情報を記憶しています。
あなたは、`disable' と `enable' コマンドを使って、1つか
それ以上のブレークポイント番号を引数とすることで、ブレークポイントを
無効にしたり有効にしたりすることができます。もし、あなたがブレーク
ポイント番号を知らない場合は、`info break' コマンドを使って
ブレークポイントの一覧表を表示して下さい。
ブレークポイントは、実行許可条件に対して4つの状態を持っています。
-
許可状態。ブレークポイントはプログラムを停止させます。
`break' コマンドによって設定されるブレークポイントは、
この状態にあります。
-
無効状態。ブレークポイントはプログラムに何の影響も与えません。
-
1回だけ有効な状態。ブレークポイントはプログラムを停止させますが、
直後に無効状態となります。`tbreak' コマンドによって設定される
ブレークポイントは、この状態にあります。
-
削除許可状態。ブレークポイントはプログラムを停止させますが、その後、
ただちに削除されてしまいます。
あなたは、次のコマンドによってブレークポイントの実行許可条件を変更
することができます:
- disable breakpoints bnums...
- disable bnums...
-
指定されたブレークポイントを無効にします。無効になったブレーク
ポイントは何の影響も持ちませんが、忘れ去られたわけではありません。
無視した回数、ブレーク条件、コマンド等のオプションは、再びブレークを
許可される時のために記憶されます。
- enable breakpoints bnums...
- enable bnums...
-
指定されたブレークポイントを有効にします。これらは、あなたが別の
指定をするまでは、プログラムを再び停止させる効果を持つように
なります。
- enable breakpoints once bnums...
- enable once bnums...
-
指定されたブレークポイントをテンポラリなものとして有効にします。
それぞれは、次にプログラムが停止した時に、再び無効となります
(このことは、その場所に達するまでに、ここに述べたコマンドの中の
どれかを使って異なった状態にするまで有効です)。
- enable breakpoints delete bnums...
- enable delete bnums...
-
指定されたブレークポイントが一旦有効になったあと、消えてなくなる
ようにします。各々のブレークポイントは、プログラムが停止した時に
削除されます(このことは、その場所に達するまでに、ここに述べた
コマンドの中のどれかを使って異なった状態にするまで有効です)。
自動的に無効になったり削除されたりするブレークポイントがプログラムを
停止した場合は別として、唯一発生する確実な状態として、ブレークポイントの
実行許可状態は、上に述べたコマンドのうちのいずれかを指定した場合にのみ
変更されます。
最も単純なブレークポイントは、プログラムが指定された場所に達した
ときに直ちに停止させるというものです。あなたは、それ以外にも、ブレーク
ポイントの条件を記述することができます。条件は、あなたの
プログラミング言語における論理式と同一になっています(“8.1 式”を参照して下さい)。
条件付きのブレークポイントは、プログラムがそこに達した時に式を
評価します。そして、条件が真のときにのみ、プログラムが停止します。
ブレーク条件には副作用があり、あなたのプログラム内の関数をコールする
かもしれません。これは妙に思えるかもしれませんが、これらの効果によって、
同一アドレスの異なったブレークポイントを有効にすることなしに完璧に
断定できるのです(このケースにおいて、GDB は最初に異なったブレーク
ポイントを見て、その条件をチェックすることなくプログラムを停止します)。
ブレークポイントのコマンドは、通常、より簡単なものであり、ブレーク
ポイントに達した時の結果として副作用が起こるのはフレキシブルなことで
あることに注意して下さい(“5.2.5 ブレーク時のコマンドの起動”をご覧下さい)。
ブレーク条件は、ブレークポイントが設定された時に、`break' コマンドの
`if' という引数を指定することによって記述できます。“5.2.1 ブレークポイントの設定方法”を参照して下さい。
これらは、いつでも好きなときに `condition' コマンドを使って
変更することができます:
- condition bnum expression
-
expression を bnum で表されるブレークポイントの条件として
指定します。これより、このブレークポイントは expression が真
(C言語のように非ゼロ) になった時にのみプログラムを停止させます。
expression は `condition' コマンドが与えられた時には
評価されません。“8.1 式”を参照して下さい。
- condition bnum
-
bnum で表されるブレークポイントの条件を削除します。
普通の、条件なしのブレークポイントになります。
ブレークポイントの条件の特別なケースとして、ブレークポイントが指定
された回数に達した時に停止するというものがあります。これは便利な
機能であり、それを実現するには、ブレークポイントを無視する回数
という特別な方法を用います。それぞれのブレークポイントには、整数である
無視する回数が存在します。たいていの場合無視する回数はゼロであり、
従って何の効果もありません。しかし、もし、無視する回数が正の数で
あるような場合にプログラムがブレークポイントに達した場合、停止する
かわりに、無視する回数から1を引いて処理を継続します。結果として、無視
する回数の値が n の場合、ブレークポイントは、次の n 回
そこに達する間、停止しないことになります。
- ignore bnum count
-
bnum で表されるブレークポイントの無視する回数を、count に
設定します。次の count の回数だけブレークポイントに達しても、
プログラムは停止しません。
次のブレークポイントに達した時必ず停止させるには、count に
ゼロを指定して下さい。
- cont count
-
プログラムの実行を継続し、現在プログラムが停止している箇所の
ブレークポイントの無視する回数に、count から1引いた値を設定します。
従って、プログラムは、そのブレークポイントに対して count 分の
通過がなければ停止しません。
このコマンドは、ブレークポイントのせいでプログラムが停止している時に
のみ許可されます。他の場合、`cont' は無視されます。
もし、ブレークポイントが正の無視する回数と条件を持っている場合、
条件の方はチェックされません。ひとたび無視する回数がゼロになったならば、
条件がチェックされるようになります。
あなたは、条件付きの無視する回数を、いついかなる時でも宣言することが
できる `$foo-- <= 0' のようなデバッガ上の簡易変数を使って、
記録を保管することができることを覚えておいて下さい。
“8.8 簡易変数”を参照して下さい。
あなたは、ブレークポイントによってプログラムが停止した時、ブレーク
ポイントに対して一連のコマンドの起動を指定することができます。例えば、
あなたは変数値を式を使って表示したいかもしれませんし、他のブレーク
ポイントを無効にしたくなるかもしれません。
- commands bnum
-
bnum で表されるブレークポイントに対するコマンドを指定します。
コマンド自身は、続く行に記述します。`end' という行を入力
することで、コマンドの入力を終了します。
ブレークポイントに対する全てのコマンドを無効にするには、`commands'
コマンドを使い、続けてただちに `end' と入力します;
これは、何もコマンドを与えないことになります。
引き数がない場合、`commands' は最後に設定されたブレークポイントを
参照します。
ブレークポイントのコマンドはプログラムの再実行が可能です。
単に、`cont' や `step' や、そういったコマンドを使った場合は
実行を再開しますが、ブレークポイント上のコマンドは無視されたままです。
再びプログラムが停止した時、GDB は停止の原因に従って動作します。
もし、最初のコマンドとして `silent' が記述されていたならば、
ブレークポイントで停止した時に普通表示されるメッセージは表示されません。
これは、特別なメッセージを表示して継続するようなブレークポイントに
対して好ましいことです。もし、継続するコマンドが何も表示しないのなら、
あなたは、ブレークポイントに達したのかどうかを知るためのサインを、
何も見ることができなくなります。`silent' は実際のコマンドでは
ありません;
これは、ブレークポイント用のコマンドの最初においてのみ意味のあるもの
です。
`echo' と `output' コマンドは、`silent' なブレーク
ポイントにおいて、メッセージの出力内容を正確に指定する時にしばしば
便利なものです。“11.3 出力調整用のコマンド”を参照して下さい。
例えば、ここに、エントリ foo
で変数 x
が正の時にその値を
表示するブレークポイントのコマンドをお見せしましょう。
-
break foo if x>0
commands
silent
echo x is\040
output x
echo \n
cont
end
ブレークポイント・コマンドの別なアプリケーション例は、一つのバグを
修整し、次のバグをテストできるようにするというものでしょう。ブレーク
ポイントを間違いのあるコード上の行に設定し、何かエラーが発生した場合の
ケースを想定し、そして、それぞれの変数が正しい値になるように修整する
コマンドを割り当てます。`cont' コマンドによる終了はプログラムを
停止させず、`silent' コマンドによる開始は何も出力を生成しません。
ここに、一つの例を示します:
-
break 403
commands
silent
set x = y + 4
cont
end
Unix の下でのブレークポイントの自動的な継続処理の1つの欠点は、
あなたのプログラムが端末の raw モードを使っている時に発生します。GDB は、
コマンドを起動する前に、自分自身の端末モードを (raw モード以外に) 切り
替えます。
そして、あなたのプログラムの実行が継続される時に raw モードに戻します。
このことは、端末の入力として保留されていたいくつかのデータを失わせて
しまいます。
GNU システムにおいては、これは端末モードにおける振る舞いを変えることで
修整されることになるでしょう。
Unix の下であなたがこの問題に直面した時、あなたはコマンドのかわりに
ブレークポイントの条件の方にアクションを設定することで、問題を回避する
ことができます。例えば、
-
condition 5 (x = y + 4), 0
は条件式 (“8.1 式”を参照して下さい) に x
を望む値に変更するように
指示し、0値を持たせることで、プログラムが停止しないように指定した
ことになります。ここでは、ブレーク条件は端末モードを変更することなく
評価されるという理由によって、入力の消失を回避することができます。
あなたが副作用が引き起こすような普通でない条件を望む場合は、
`&&'、`||' そして `?...:' オペレータが役に立つ
でしょう。
あるオペレーティング・システムの下では、そのプログラムとして別の
プロセスが走っているため、そのプログラムにおいてブレークポイントが
利用できない場合があります。このようなケースにおいて、ブレーク
ポイントとともにプログラムを実行したり継続したりしようとすると、
GDB はそれを停止させます。
この現象が発生した場合、あなたは継続させるための3通りの方法を選ぶ
ことができます:
-
ブレークポイントを削除したり無効にしたりして、継続する。
-
GDB を一時停止 (Suspend) し、プログラムを含むファイルを新しい名称で
コピーする。GDB を再開し、`exec-file' コマンドを使って GDB が
実行するプログラムをその名称で指定する。そして、プログラムを再び
スタートさせる。
-
リンカの `-N' オプションを使って、プログラムのテキストセグメントが
共有されないように、プログラムを再リンクする。オペレーティング・
システムの制限は、共有されていない実行テキストに対しては適用されない。
あなたのプログラムが停止した後、もし、あなたが探しているバグがまだ
発生していないならば、あなたが次に最もやりたいことは、プログラムの
実行の更なる継続でしょう。
- cont
-
停止した場所からプログラムの実行を継続します。
もし、プログラムがブレークポイントに停止していたならば、継続して実行
される場所はブレークポイントのアドレスです。あなたは、もしかしたら
同一のブレークポイントに直ちに停止してしまうと思ってしまうかも
しれません。実は、`cont' はそのようなハプニングが発生しないように、
特別な配慮を行っています。あなたは、プログラムが停止しているブレーク
ポイントの先へと進みたい場合、そのブレークポイントを削除する必要は
ありません。
あなたはまた、`cont' コマンドの引数として、そのブレークポイントに
おいてプログラムが停止するのを無視する回数を指定することができます。
“5.2.4 ブレーク条件”を参照して下さい。
もし、プログラムが SIGINT
や SIGTRAP
以外のシグナルに
よって停止させられたならば、処理の継続によって、プログラムはその
シグナルを見てしまうことになります。あなたは多分、このようなことを
望まないでしょう。例えば、プログラムがある種のメモリ参照エラーに
よって停止した場合、あなたは、エラー原因の変数に正しい値を設定して
処理を継続させ、更により多くの実行結果を見てみたいはずです;
しかし、プログラムが致命的なシグナルを受け取ってしまったならば、
即座に全ての処理を終了させられてしまうことになります。このことを
回避するために、あなたは `signal 0' で処理を継続させることが
できます。“10.3 プログラムへのシグナルの送信”を参照して下さい。
あなたは、また、`handle' コマンドを使うことによって、
プログラムが正しい種類のシグナルを見ることを防止することが
できます(“5.1 シグナル”を参照して下さい)。
ステップ実行とは、あなたのプログラムの動作における最小時間を
設定することを意味し、制御はデバッガが1行分のマシン命令を実行した後に、
自動的に返ってきます。ステップ実行時にブレークポイントは有効であり、
プログラムはステップ処理用のコマンドがどのように遠くまで処理するよう
指定していても、そこで停止します。
- step
-
異なった行にプログラムが達するまで処理を継続し、プログラムを停止
させた後にデバッガに制御を戻します。このコマンドの省略形は `s'
です。
このコマンドは、デバッギング情報がない関数へ制御が移る時にも利用
することができます。そのようなケースでは、処理の実行は、制御が
異なった関数へと移る時か、その関数からリターンするまでの間、先に
進みます。引数に示される回数だけ、この動作を繰り返します。
- step count
-
`step' として処理を継続しますが、count 回数だけそれを
繰り返します。もし、ブレークポイントに達したり、count 分の
ステップ処理中にシグナルが発生した場合、ステップ実行はただちに
停止します。
- next
-
`step' に似ていますが、行にあるコード上の関数コールは停止しないで
実行されます。実行が停止するのは、`next' コマンドが与えられた同一
スタックレベルの、異なった行にあるコードに達した時です。このコマンドの
省略形は `n' です。
引数は、`step' と同様リピート回数を表します。
デバッギング情報がない関数への `next' は `step' と同じように
動作しますが、その関数のコードに表れる任意の関数コールは停止すること
なく実行されます。
- finish
-
選択されているスタックフレームからリターンするまで (又は、致命的な
シグナルやブレークポイントのような、他の要因によって停止するまで)、
処理を継続します。(もし、存在するのなら) 選択されていたスタック
フレームからのリターン値を表示します。
このコマンドを `return' コマンドと対比してみて
下さい(“10.4 関数からのリターン”をご覧下さい)。
- until
-
このコマンドは、ループ内での単一ステップ処理の多くの繰り返しを回避
するために使われます。このコマンドは、`until' がジャンプに
出会った時、プログラムカウンタがジャンプアドレスより大きくなるまで
自動的にプログラムの実行を継続するという部分を除けば
`next' コマンドに似ています。
これは、あなたがこのコマンドを使ってステップ実行した後で、ループの
終端に達したとき、`until' はループから抜け出すまで実行を継続
させるということを意味します。それとは対照的に、`next' コマンドは
ループの終端に達したならば、単にループの開始に戻り、あなたに次の巡回を
ステップ処理させることを強制します。
`until' はまた、カレントのスタックフレームから抜け出そうと
試みられた時にもプログラムを停止させます。
`until' は、ソース上の行の順番が実際の実行順番とマッチしない時に、
何か直感に反する結果を生み出してしまいます。例えば、典型的なC言語の
for
-ループでは、for
-文の3番目の
ステートメント (ループステップ式) は
ループ本体のステートメントの後に実行されますが、記述上では、ループ
本体の前に書かれています。従って `until' コマンドは、この式へと
至った場合、ループの開始部分へとステップバックするでしょう。
しかしながら、それは実際そのように動作していないので、実際のマシン
コードに置き換えないように。
引数なしの `until' は単一命令のステップ実行を意味することに注意
して下さい。このため、引数を指定した `until' より遅くなります。
- until location
-
指定された位置にプログラムが達するか、カレント (最深部) のスタック
フレームからリターンするまで、実行を継続します。この形態のコマンドは
ブレークポイントを使っているので、引数なしの `until' よりも高速
です。
- stepi
- si
-
単一マシン命令を実行し、プログラムを停止させてデバッガに戻ります。
マシン命令をステップ実行中に `display/i $pc' を使うと、
しばしば便利です。これは停止後、次に実行される命令を
自動的に表示します。“8.6 自動的な表示”を参照して下さい。
引数は、`step' のように繰り返し回数を表します。
- nexti
- ni
-
単一マシン命令を実行しますが、サブルーチンがコールされた場合、
サブルーチンからリターンするまで実行を継続します。
引数は、`next' 同様、繰り返し回数を表します。
ステップ実行に使われる典型的なテクニックとして、
ブレークポイント (“5.2 ブレークポイント”をご覧下さい) を誤りがあると思われるような
問題のある関数の先頭やプログラムのセクションに設定し、怪しいと思う
エリアを1ステップずつ実行し、問題が発生するまで、興味のある変数を
調査する、というものがあります。
`cont' コマンドは、ステップ実行後、次のブレークポイントやシグナル
まで処理を再実行させるために使うことができます。
目次に戻る