Вот код, чтобы сделать то, что я предложил.Я рекомендую использовать ocamldebug, если это вообще возможно, этот код слишком сложен.Но это работает на моей системе в этом простом примере.
let print_backtrace () =
match Unix.fork () with
| 0 -> raise Not_found
| pid -> let _ = Unix.waitpid [] pid in ()
let f () =
begin
print_backtrace ();
Printf.printf "after the backtrace\n";
end
;;
f ()
Вот тестовый прогон.
$ /usr/local/ocaml312/bin/ocamlc unix.cma -g test3.ml
$ OCAMLRUNPARAM=b a.out
Fatal error: exception Not_found
Raised at file "test3.ml", line 3, characters 17-26
Called from file "test3.ml", line 8, characters 4-22
Called from file "test3.ml", line 14, characters 0-4
after the backtrace
Я понял, что из-за неперехваченного исключения у вас нетлюбой контроль над выходом дочернего процесса.Это одна из причин, по которой этот код слишком сложен.Пожалуйста, не вините меня, если он не работает для вас, но я надеюсь, что он окажется полезным.
Я протестировал код на Mac OS X 10.6.8, используя OCaml 3.12.0.
С наилучшими пожеланиями,