4

我有一个不会停止的 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
4

1 回答 1

2

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

我的建议是改用运行时分析:用ocamlopt -p(或.p.nativeocamlbuild 的目标)编译,运行你的程序,中断它,然后用它gprof <executable>来查看分析信息。它应该突出显示大部分时间花费在哪个函数上,并且使用gprof2dot等可视化工具可以获得合理的调用图。不是最佳的,但仍然可以解决您的问题。

PS:我认为你仍然需要你的信号捕获例程来进行分析工作:如果程序被杀死而不是中断自己,它可能不会吐出分析信息。

于 2012-08-04T12:08:18.600 回答