我有一个不停止的OUnit测试,我希望能够获得堆栈跟踪。
我正在使用-g
进行编译,当测试异常完成时,我会得到一个堆栈跟踪。
我尝试捕获信号,但无法弄清楚如何转储活动线程的堆栈
let () = begin
(* Report stacktraces in test failures *)
Printexc.record_backtrace true;
(* Exit on Ctrl-C. *)
let flush_and_abort _ =
prerr_string "aborted by signal\n";
(***** What do I do here to dump stacks for live threads? ****)
flush stderr;
flush stdout;
exit ~-1 in
Sys.set_signal Sys.sigint (Sys.Signal_handle flush_and_abort);
Sys.set_signal Sys.sigquit (Sys.Signal_handle flush_and_abort);
end
答案 0 :(得分:2)
我不认为信号处理程序是在可以获得回溯的上下文中执行的。自然的选择是使用Printexc.print_backtrace stderr
,但(至少在我的机器上)它不起作用。
我的建议是使用运行时分析:使用ocamlopt -p
(或.p.native
ocamlbuild的目标)编译,运行程序,中断它,并使用gprof <executable>
查看分析信息。它应该突出显示大部分时间花费在哪个函数上,并且使用gprof2dot这样的可视化工具,您可以获得合理的调用图。不是最佳的,但仍可以解决您的问题。
PS:我认为你仍然需要你的信号捕获程序来进行分析工作:如果程序被杀死而不是中断自身,它可能不会吐出分析信息。