ocamldebugの調査
ML言語の一種であるOcamlに付属している、ocamldebugというデバッガについて調べたのでメモ。
かなり間違っている可能性があるので、注意。
- gdbライクなCUI
- breakで停止できるのは、eventと呼ばれる箇所でのみ
- OcamlマニュアルのEventsの項目にeventとなる箇所が書いてある
- debuggerとdebugeeは別プロセス
- 日本語の処理関係は、まだ弱いらしい
- mlコード内のprint_int, print_string等の標準出力への出力用関数の処理は、ocamldebugでステップ実行している間は実際には行われない
- debugeeの実行が終了した段階で出力される
- 出力をバッファしてるのかな?
- おそらく、ファイル出力やTCP等によるデータ送信も同様
- タイムトラベル機能(後述)のためにこのような実装になってる?
- ファイルからの入力がどうなるかはまだ調べてない
- 変数の値等の状態も含めて実行を前の地点まで巻き戻して、そこから再実行する機能がある(タイムトラベル機能)
- ocamldebugが適切なタイミングでcheckpointを取り、それを利用して実行の巻き戻しを行う
- 巻き戻した地点がcheckpointを取った地点と一致しない場合は、最寄のcheckpointからその地点まで再実行して停止?
- checkpointを取るための実装にはforkを使ってる*2
- プロセスIDが巻き戻す前と後で違うなど、完全に状態を巻き戻すことはできないため、いやらしいプログラムの実行を巻き戻すと挙動がおかしくなった
ocamldebugはOcamlで実装されているので、私には読めん・・・
*1:http://caml.inria.fr/pub/docs/manual-ocaml.bak/manual030.htmlの16.7項に書かれているBNF記法を見る限りできないよなあ・・・たぶん
*2:http://caml.inria.fr/pub/docs/manual-ocaml/manual030.htmlのTurning reverse execution on and offの項目に書いてある