ocamldebugの調査

ML言語の一種であるOcamlに付属している、ocamldebugというデバッガについて調べたのでメモ。
かなり間違っている可能性があるので、注意。

  • gdbライクなCUI
    • break,info,helpコマンド等、gdbを知っている人なら何となく使えるようにコマンド名がつけられてます
    • でも、printコマンドで関数呼び出しや代入が行えないなど*1gdbと違う点もあるので注意
  • breakで停止できるのは、eventと呼ばれる箇所でのみ
  • debuggerとdebugeeは別プロセス
    • Unixだと、BSDソケットを使ってプロセス間通信することでdebugee上に存在する変数の値の参照等を行っている。ここらへんは、Javaデバッガの実装に近い
  • 日本語の処理関係は、まだ弱いらしい
  • 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の項目に書いてある