如何找到程序中最深且最需要堆栈的调用链?

如何找到程序中最深且最需要堆栈的调用链?

我有一个用 OCaml 编写的程序,在堆栈较小的平台上往往会出现堆栈溢出。

我不想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好像没有类似的选项。

如何记录程序的执行并找到最深的调用链?使用最多堆栈空间的调用链怎么样(考虑帧大小而不仅仅是帧计数)?

我使用的是 Linux Mint 18.2,内核为 4.4.0-112-generic。

相关内容