次: , 前: Breakpoints, 上: Breakpoints


5.1.1 ブレイクポイントの設定

ブレイクポイントは、 breakコマンド (省略形はb) によって設定されます。 デバッガのコンビニエンス変数`$bpnum'に、 最後に設定されたブレイクポイントの番号が記録されます。 コンビニエンス変数の使用方法については、 See Convenience variables

ブレイクポイントの設定箇所を指定する方法はいくつかあります。

break function
関数functionのエントリにブレイクポイントを設定します。 ソース言語が (例えばC++のように) シンボルのオーバーロード機能を持つ場合、 functionは、 プログラムを停止させる可能性を持つ1つ以上の箇所を指すことがあります。 このような状況に関する説明については、 See Breakpoint menus
break +offset
break -offset
その時点において選択されているフレームにおいて実行が停止している箇所から、 指定された行数だけ先または手前にブレイクポイントを設定します。
break linenum
カレントなソース・ファイル内のlinenumで指定される行番号を持つ行に、 ブレイクポイントを設定します。 ここで「カレントなソース・ファイル」とは、 最後にソース・コードが表示されたファイルを指します。 このブレイクポイントは、 その行に対応するコードが実行される直前に、 ユーザ・プログラムを停止させます。
break filename:linenum
filenameで指定されるソース・ファイルのlinenumで指定される番号の行に、 ブレイクポイントを設定します。
break filename:function
filenameで指定されるソース・ファイル内のfunctionで指定される関数エントリにブレイクポイントを設定します。 同じ名前の関数が複数のファイルに存在する場合以外は、 ファイル名と関数名を同時に指定する必要はありません。
break *address
addressで指定されるアドレスにブレイクポイントを設定します。 これは、 プログラムの中の、 デバッグ情報やソース・ファイルが手に入らない部分にブレイクポイントを設定するのに使用できます。
break
引数なしで実行されると、 breakコマンドは、 選択されたスタック・フレーム内において次に実行される命令にブレイクポイントを設定します (see Examining the Stack)。 最下位にあるスタック・フレーム以外のフレームが選択されていると、 このブレイクポイントは、 制御がそのフレームに戻ってきた時点で、 ユーザ・プログラムを停止させます。 これが持つ効果は、 選択されたフレームの下位にあるフレームにおいて finishコマンドを実行するのと似ています。 ただし、 1つ異なるのは、 finishコマンドがアクティブなブレイクポイントを残さないという点です。 最下位のスタック・フレームにおいて引数なしで breakコマンドを実行した場合、 そのときに停止していた箇所に次に到達したときに、 GDBはユーザ・プログラムを停止させます。 これは、 ループの内部では便利でしょう。

GDBは通常、 実行を再開したときに、 最低でも1命令が実行されるまでの間は、 ブレイクポイントの存在を無視します。 そうでなければ、 ブレイクポイントで停止した後、 そのブレイクポイントを無効にしない限り、 先へ進めないことになってしまいます。 この規則は、 ユーザ・プログラムが停止したときに、 既にそのブレイクポイントが存在したか否かにかかわらず、 適用されます。

break ... if cond
condで指定される条件式付きでブレイクポイントを設定します。 そのブレイクポイントに達すると、 必ず条件式condが評価されます。 評価結果がゼロでない場合、 すなわち、 評価結果が真である場合のみ、 ユーザ・プログラムを停止します。 `...'の部分には、 これまでに説明してきた停止箇所を指定するための引数のいずれかが入ります (`...'は省略も可能です)。 ブレイクポイントの条件式の詳細については、 See Break conditions


tbreak args
プログラムを1回だけ停止させるブレイクポイントを設定します。 argsの部分はbreakコマンドと同様であり、 ブレイクポイントも同じように設定されますが、 tbreakにより設定されたブレイクポイントは、 プログラムが最初にそこで停止した後に自動的に削除されます。 See Disabling breakpoints


hbreak args
ハードウェアの持つ機能を利用したブレイクポイントを設定します。 argsの部分はbreakコマンドと同様であり、 ブレイクポイントも同じように設定されますが、 hbreakにより設定されるブレイクポイントは、 ハードウェアによるサポートを必要とします。 ターゲット・ハードウェアによっては、 このような機能を持たないものもあるでしょう。 これの主な目的は、 EPROM/ROMコードのデバッグであり、 ユーザはある命令にブレイクポイントを設定するのに、 その命令を変更する必要がありません。 これは、 SPARClite DSUの提供するトラップ発生機能と組み合わせて使用することができます。 DSUは、 デバッグ・レジスタに割り当てられた データ・アドレスまたは命令アドレスをプログラムがアクセスすると、 トラップを発生させます。 ハードウェアの提供するブレイクポイント・レジスタは、 データ・ブレイクポイントを2つまでしか取れないので、 3つ以上使用しようとすると、 GDBはそれを拒絶します。 このような場合、 不要になったハードウェア・ブレイクポイントを削除または無効化してから、 新しいハードウェア・ブレイクポイントを設定してください。 See Break conditions


thbreak args
ハードウェアの機能を利用して、 プログラムを1回だけ停止させるブレイクポイントを設定します。 argsの部分はhbreakコマンドと同様であり、 ブレイクポイントも同じように設定されます。 しかし、 tbreakコマンドの場合と同様、 最初にプログラムがそこで停止した後に、 このブレイクポイントは自動的に削除されます。 また、 hbreakコマンドの場合と同様、 このブレイクポイントはハードウェアによるサポートを必要とするものであり、 ターゲット・ハードウェアによっては、 そのような機能がないこともあるでしょう。 See Disabling breakpoints。 また、 See Break conditions


rbreak regex
regexで指定される正規表現にマッチするすべての関数にブレイクポイントを設定します。 このコマンドは、 正規表現にマッチしたすべての関数に無条件ブレイクポイントを設定し、 設定されたすべてのブレイクポイントの一覧を表示します。 設定されたブレイクポイントは、 breakコマンドで設定されたブレイクポイントと同様に扱われます。 他のすべてのブレイクポイントと同様の方法で、 削除、 無効化、 および条件の設定が可能です。

C++プログラムのデバッグにおいて、 あるオーバーロードされたメンバ関数が、 特別なクラスだけが持つメンバ関数というわけではない場合、 そのメンバ関数にブレイクポイントを設定するのに、 rbreakコマンドは便利です。


info breakpoints [n]
info break [n]
info watchpoints [n]
設定された後、 削除されていない、 すべてのブレイクポイント、 ウォッチポイント、 キャッチポイントの一覧を表示します。 個々のブレイクポイントについて、 以下の情報が表示されます。
ブレイクポイント番号
タイプ
ブレイクポイント、 ウォッチポイント、 または、 キャッチポイント
廃棄
ブレイクポイントに次に到達したときに、 無効化または削除されるべくマークされているか否かを示します。
有効/無効
有効なブレイクポイントを`y'、 有効でないブレイクポイントを`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
`info breakpoints'コマンドと同様の形式で呼び出され、 ユーザが明示的に設定したブレイクポイントと、 GDBが内部的な目的で使用しているブレイクポイントの両方を表示します。 内部的なブレイクポイントは、 負のブレイクポイント番号で示されます。 タイプ欄にブレイクポイントの種類が表示されます。
breakpoint
明示的に設定された普通のブレイクポイント
watchpoint
明示的に設定された普通のウォッチポイント
longjmp
longjmpが呼び出されたときに正しくステップ処理ができるように、 内部的に設定されたブレイクポイント
longjmp resume
longjmpのターゲットとなる箇所に内部的に設定されたブレイクポイント
until
GDBのuntilコマンドで一時的に使用される内部的なブレイクポイント
finish
GDBのfinishコマンドで一時的に使用される内部的なブレイクポイント