2012-08-03 71 views
4

我有一个不停止的OUnit测试,我希望能够获得堆栈跟踪。在信号ocaml上转储线程堆栈

我在编译-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 

回答

2

我不认为信号处理程序的情况下,你可以得到回溯执行。自然的选择是使用Printexc.print_backtrace stderr,但是(至少在我的机器上)它不起作用。

我的建议是使用运行时分析来代替:与ocamlopt -p(或.p.native ocamlbuild的目标)编译,运行程序,中断它,并使用gprof <executable>看到剖析信息。它应该突出显示大部分时间花在哪个功能上,并且使用可视化工具(如gprof2dot)可以获得合理的调用图。不是最佳的,但仍可能解决您的问题。 PS:我认为你仍然需要你的信号捕获程序来进行分析工作:如果程序被杀死而不是中断它自己,它可能不会吐出分析信息。