我有一个很短的测试文件:打印堆栈跟踪
let print_backtrace() = try raise Not_found with
Not_found -> Printexc.print_backtrace stdout;;
let f() = print_backtrace(); Printf.printf "this is to make f non-tail-recursive\n";;
f();
我编译和运行:
% ocamlc -g test.ml
% OCAMLRUNPARAM=b ./a.out
Raised at file "test.ml", line 1, characters 35-44
this is to make f non-tail-recursive
为什么在堆栈跟踪不f
上市?我该如何编写一个函数来打印它所调用位置的堆栈轨迹?
这回答我的问题的一半,所以谢谢你。我是否应该将另一半的沉默表示为不可能做我想做的事,即打印完整的堆栈跟踪并继续? –
我没有看到一个好的方法来实现它,而不会破坏OCaml运行时。也许在ocamldebug下运行?或者因为您似乎在某种Unix中运行,如果这只是为了快速排除故障,您可以fork()您的进程并在子进程中引发未捕获的异常(这将打印完整的堆栈跟踪),然后退出孩子并继续进入父母程序。我在C年前做过这样的事情,它对我很有帮助。但它很丑,很可能会搞砸了。如果你尝试这样做(很可能是一个坏主意),请在子节点中调用_Exit()以避免刷新缓冲区。问候, –
如果编译为本地代码,您可以尝试使用打印堆栈的标准功能,例如libunwind或从glibc回溯。请注意,结果可能不是很漂亮,但通常足以查明问题。 – ygrek