より小さなスタックを持つプラットフォームでスタックオーバーフローが発生する傾向があるOCamlで書かれたプログラムがあります。
スタックオーバーフローを1つずつ見つけて解決するためにプログラムを進める代わりに、一般的なulimit
実行で最も深い(および/または最もスタックを多用する)呼び出しチェーンの順序付けられたリストを取得したいと思います。
perfを使用して呼び出しグラフを記録できます。
perf record -F 99 --call-graph dwarf -- ./a.out input.txt
次に、stackcollapseスクリプトを使用して呼び出しチェーンを取得します。炎グラフ。
perf script > out.perf
FlameGraph/stackcollapse-perf.pl out.perf > out.folded
残念ながら、この方法で得られた呼び出しチェーンは127項目に制限されています。 perf report
より多くの項目を表示するオプションがあります--max-stack n
。しかし、perf script
同様のオプションはないようです。
プログラムの実行を記録し、最も深い呼び出しチェーンを見つける方法は?最も多くのスタックスペースを使用する呼び出しチェーンはどうですか(単純なフレーム数ではなくフレームサイズを考慮してください)。
私はカーネル4.4.0-112-genericでLinux Mint 18.2を使用しています。