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 に答える