OCamlDebugが熱い

30分プログラム、その445。ふと思いついてOCamlDebugを試してみたら、予想以上に熱かった。

ステップ実行や変数表示、ブレイクポイントなど普通の機能があるのはもちろんのこと、1ステップ戻るなんてことができる。逆方向に実行って、熱すぎるだろ・・・。

デバッグするコード

let rec fact n m =
  if n = 0 then
    m
  else
    let m' =
      n * m in
    fact n m'

let _ =
  Printf.printf "%d\n" (fact 1 10)

今回デバッグするのは、末尾再帰で会場を計算するやつ。
この段階でバグを見つけても、気にしてはいけません。

コンパイル

ocamlcでコンパイルする。-gを付けるのを忘れずに。

$ ocamlc -g -o fact fact.ml

デバッガ起動

ocamldebugコマンドを使ってもいいんだけど、Emacs上で実行すると今どこに居るかが分かりやすいので、今回はEmacs上で実行する。
ソースコードを読み込んだ状態で、おもむろにM-x camldebugを入力する。"Run camldebug on file"にはfactを指定する。


ステップ実行

(odb) break @ Fact 1

として1行目にブレイクポイントを仕掛けたあと

(odb) run

実行する。

すると、1行目で停止する。

C-c C-sでステップ実行ができる。もしくはstepと入力してもいい。

ついでに、もう1ステップ実行してみる。

ここで

(odb) backstep

と入力すると、1ステップ戻れる。

変数の表示

printを使えば変数の中身を表示できる。

(odb) print m
m : int = 10