2

次のようなコードブロックがあります。

try
   raise Exit (* body *)
with
| e ->
  Printexc.record_backtrace true;
  printf "Unexpected exception : %s\n" (Printexc.to_string e);
  let x = Printexc.get_backtrace () in
  print_string x;
  Printexc.print_backtrace stdout

のコードはbody例外を発生させ、 を示しUnexpected exception : Pervasives.Exitていますが、バックトレースは出力されません。

-gandでファイルをコンパイルしましたexport OCAMLRUNPARAM=bが、バックトレースを出力できない理由を知っている人はいますか?

4

1 に答える 1

1

あなたのコードには多くの関数が表示されないため、印刷するスタック トレースがない可能性が高いです。ここで前の回答を参照してください:スタック トレースの印刷

今日、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
于 2013-08-24T16:53:12.440 に答える