あなたのコードには多くの関数が表示されないため、印刷するスタック トレースがない可能性が高いです。ここで前の回答を参照してください:スタック トレースの印刷
今日、OCAMLRUNPARAM が実際にはプロセスに設定されていないことが問題である可能性が高いことに気づきました。make(1) コマンドで環境変数を取得するのは難しい場合があります。理由の 1 つは、Makefile の各行が異なるシェルによって実行されることです。
バックトレースに影響を与えるもう 1 つのことは、インライン化です。関数が複雑な場合、これはおそらく影響しません。ただし、インライン展開のほとんどすべてを無効にすることができます-inline 0
。これがスタック トレースがない場合とスタック トレースがない場合の違いになるとは考えにくいです。短いスタック トレースと長いスタック トレースに違いが生じる場合があります。
インライン化が違いを生む実験を次に示します。
$ cat m.ml
try
let f () : int = raise Exit
in let g () = f () + 2
in let h () = g () + 3
in let main () = Printf.printf "%d\n" (h () + 4)
in main ()
with
e -> Printf.printf "%s" (Printexc.get_backtrace ())
$ ocamlopt -inline 10 -g -o m m.ml
$ OCAMLRUNPARAM=b m
Raised by primitive operation at file "m.ml", line 3, characters 18-22
$ ocamlopt -inline 0 -g -o m m.ml
$ OCAMLRUNPARAM=b m
Raised at file "m.ml", line 2, characters 27-31
Called from file "m.ml", line 3, characters 18-22
Called from file "m.ml", line 4, characters 18-22
Called from file "m.ml", line 5, characters 43-47
Called from file "m.ml", line 6, characters 7-14