次: Set Watchpoints, 前: Breakpoints, 上: Breakpoints
ブレイクポイントは、
break
コマンド
(省略形はb
)
によって設定されます。
デバッガのコンビニエンス変数`$bpnum'に、
最後に設定されたブレイクポイントの番号が記録されます。
コンビニエンス変数の使用方法については、
See Convenience variables。
ブレイクポイントの設定箇所を指定する方法はいくつかあります。
break
functionbreak +
offsetbreak -
offsetbreak
linenumbreak
filename:
linenumbreak
filename:
functionbreak *
addressbreak
break
コマンドは、
選択されたスタック・フレーム内において次に実行される命令にブレイクポイントを設定します
(see Examining the Stack)。
最下位にあるスタック・フレーム以外のフレームが選択されていると、
このブレイクポイントは、
制御がそのフレームに戻ってきた時点で、
ユーザ・プログラムを停止させます。
これが持つ効果は、
選択されたフレームの下位にあるフレームにおいて
finish
コマンドを実行するのと似ています。
ただし、
1つ異なるのは、
finish
コマンドがアクティブなブレイクポイントを残さないという点です。
最下位のスタック・フレームにおいて引数なしで
break
コマンドを実行した場合、
そのときに停止していた箇所に次に到達したときに、
GDBはユーザ・プログラムを停止させます。
これは、
ループの内部では便利でしょう。
GDBは通常、
実行を再開したときに、
最低でも1命令が実行されるまでの間は、
ブレイクポイントの存在を無視します。
そうでなければ、
ブレイクポイントで停止した後、
そのブレイクポイントを無効にしない限り、
先へ進めないことになってしまいます。
この規則は、
ユーザ・プログラムが停止したときに、
既にそのブレイクポイントが存在したか否かにかかわらず、
適用されます。
break ... if
condtbreak
argsbreak
コマンドと同様であり、
ブレイクポイントも同じように設定されますが、
tbreak
により設定されたブレイクポイントは、
プログラムが最初にそこで停止した後に自動的に削除されます。
See Disabling breakpoints。
hbreak
argsbreak
コマンドと同様であり、
ブレイクポイントも同じように設定されますが、
hbreak
により設定されるブレイクポイントは、
ハードウェアによるサポートを必要とします。
ターゲット・ハードウェアによっては、
このような機能を持たないものもあるでしょう。
これの主な目的は、
EPROM/ROMコードのデバッグであり、
ユーザはある命令にブレイクポイントを設定するのに、
その命令を変更する必要がありません。
これは、
SPARClite DSUの提供するトラップ発生機能と組み合わせて使用することができます。
DSUは、
デバッグ・レジスタに割り当てられた
データ・アドレスまたは命令アドレスをプログラムがアクセスすると、
トラップを発生させます。
ハードウェアの提供するブレイクポイント・レジスタは、
データ・ブレイクポイントを2つまでしか取れないので、
3つ以上使用しようとすると、
GDBはそれを拒絶します。
このような場合、
不要になったハードウェア・ブレイクポイントを削除または無効化してから、
新しいハードウェア・ブレイクポイントを設定してください。
See Break conditions。
thbreak
argshbreak
コマンドと同様であり、
ブレイクポイントも同じように設定されます。
しかし、
tbreak
コマンドの場合と同様、
最初にプログラムがそこで停止した後に、
このブレイクポイントは自動的に削除されます。
また、
hbreak
コマンドの場合と同様、
このブレイクポイントはハードウェアによるサポートを必要とするものであり、
ターゲット・ハードウェアによっては、
そのような機能がないこともあるでしょう。
See Disabling breakpoints。
また、
See Break conditions。
rbreak
regexbreak
コマンドで設定されたブレイクポイントと同様に扱われます。
他のすべてのブレイクポイントと同様の方法で、
削除、
無効化、
および条件の設定が可能です。
C++プログラムのデバッグにおいて、
あるオーバーロードされたメンバ関数が、
特別なクラスだけが持つメンバ関数というわけではない場合、
そのメンバ関数にブレイクポイントを設定するのに、
rbreak
コマンドは便利です。
info breakpoints
[n]info break
[n]info watchpoints
[n]ブレイクポイントが条件付きのものである場合、
info break
コマンドは、
そのブレイクポイントに関する情報の次の行に、
その条件を表示します。
ブレイクポイント・コマンドがあれば、
続いてそれが表示されます。
info break
コマンドに引数としてブレイクポイント番号nが指定されると、
その番号に対応するブレイクポイントだけが表示されます。
コンビニエンス変数$_
、
および、
x
コマンドのデフォルトの参照アドレスには、
一覧の中で最後に表示されたブレイクポイントのアドレスが設定されます
(see Examining memory)。
info break
コマンドは、
ブレイクポイントに到達した回数を表示します。
これは、
ignore
コマンドと組み合わせると便利です。
まず、
ignore
コマンドによってブレイクポイントへの到達をかなりの回数無視するよう設定します。
プログラムを実行し、
info break
コマンドの出力結果から何回ブレイクポイントに到達したかを調べます。
再度プログラムを実行し、
今度は前回の実行時に到達した回数より1だけ少ない回数だけ無視するように設定します。
こうすることで、
前回の実行時にそのブレイクポイントに最後に到達したときと同じ状態でプログラムを停止させることが簡単にできます。
GDBでは、 ユーザ・プログラム内の同一箇所に何度でもブレイクポイントを設定することができます。 これは、 くだらないことでも、 無意味なことでもありません。 設定されるブレイクポイントが条件付きのものである場合、 これはむしろ有用です (see Break conditions)。
GDB自身が、
特別な目的でユーザ・プログラム内部にブレイクポイントを設定することがあります。
例えば、
(Cプログラムにおける)
longjmp
を適切に処理するためなどです。
これらの内部的なブレイクポイントには-1
から始まる負の番号が割り当てられます。
`info breakpoints'コマンドは、
このようなブレイクポイントを表示しません。
これらのブレイクポイントは、 GDBの保守コマンド`maint info breakpoints'で表示することができます。
maint info breakpoints
breakpoint
watchpoint
longjmp
longjmp
が呼び出されたときに正しくステップ処理ができるように、
内部的に設定されたブレイクポイント
longjmp resume
longjmp
のターゲットとなる箇所に内部的に設定されたブレイクポイント
until
until
コマンドで一時的に使用される内部的なブレイクポイント
finish
finish
コマンドで一時的に使用される内部的なブレイクポイント