ブレークポイント
ブレークポイント(英: breakpoint)は、ソフトウェア開発のデバッグ作業において実行中のプログラムを意図的に一時停止させる箇所である。ENIACのプログラマであるベティ・ホルバートンが考案した[1]。
概要
[編集]ブレークポイントの指定機能は多くのデバッガに備えられており、これを用いることでプログラムの任意箇所への到達を自動的に捕捉できる。ブレークポイントでの停止後、プログラマは通常のデバッグ作業同様に実行環境(メモリ、レジスタ、ログ、ファイルなど)を観察し、プログラムが期待通りに機能しているかどうかを判断する。
通常、ブレークポイントにはプログラムの実行を中断させるかどうかを決定する1つ以上の条件を設定できる。
最も一般的なブレークポイントは、指定した命令を実行する前にプログラムの実行を停止する。これを「命令ブレークポイント」などと呼ぶ。
また、メモリの特定領域の読み込み、書き込み、更新をトリガーとして停止させる場合もある。これを「データブレークポイント」あるいは「ウォッチポイント」などと呼ぶ。
他にも時刻を指定する方式のブレークポイント、キー入力などをトリガーとするブレークポイントがある。
CPUの多くはブレークポイントをハードウェアでサポートしている。このハードウェアには、分岐遅延スロットにある命令にはブレークポイントを設定できないなどといった制限がある場合もある。そのような制限はマイクロアーキテクチャに起因するもので、プロセッサによって様々である。大まかに言えば、ブレークポイントに到達すると例外を発生し、それによってデバッグ対象プロセスを実行できない状態に遷移させ、デバッガプロセスに制御を移す。
ハードウェアがサポートしていない場合、デバッガでソフトウェア的にブレークポイントを実装する必要がある。命令ブレークポイントの場合、単にブレークポイントを設定したい命令を別の命令(例、x86の場合、ブレークポイント用途の INT3 命令)に置換すればよい[2]。一方、データブレークポイントを純粋にソフトウェアで実現しようとすると、デバッグ対象アプリケーションの性能が大幅に低下することがある[3]。ただし、性能の極端な低下はCPUのシングルステップ実行によりデータブレークポイントにおけるデータ書き換えを一命令の実行ごとに検出する実装の場合に生じる。ページング方式の仮想記憶をサポートしているOSであれば、データ書き換えの検出は対象データを含むページを書き込み禁止にしてトラップを発生させることによっても実装可能である。仮想記憶自身でも同様の機能が必要なことから、この方式は性能低下が少ない。
プログラミング言語の実装によっては、デバッグ機能を他のプログラムに公開している場合もある。例えば、FORTRANの一部の方言には AT
文があるが、これは元々は命令ブレークポイントのためのものだった。Pythonには Python プログラムからアクセス可能なデバッガが実装されている[4]。このような機能を乱用するとcomefrom文のような機能が実装できる[5]。
脚注・出典
[編集]- ^ Abbate, Janet (2012), Recoding Gender: Women's Changing Participation in Computing, MIT Press, p. 32, ISBN 9780262018067
- ^ 田辺 1983, p. 82.
- ^ GDB Internals -- Watchpoints
- ^ Python Library Reference: The Python Debugger
- ^ entrian.com - goto and comefrom for Python
参考文献
[編集]- 田辺皓正編著『マイクロコンピュータシリーズ15 8086マイクロコンピュータ』丸善株式会社、1983年4月30日。