如何从每个样本中的探查器获取完整的堆栈转储以用于火焰图?

时间:2012-04-26 12:26:33

标签: linux arm profiling valgrind stack-trace

我非常喜欢Flame Graph用于分析的想法,因为它有助于消除不需要的函数调用。然而,有一个问题是它需要分析器在每次收集样本时执行完整的堆栈转储。这可以通过DTrace或SystemTap轻松完成,但我需要能够在运行ubuntu的ARM设备上执行此操作(这会消除DTrace)。我还想在不重新编译内核的情况下执行此操作(这会消除Sys​​temTap)。

是否有可能获得Valgrind / Callgrind或OProfile(或其他可以在Ubuntu中的ARM设备上运行的分析工具)输出类似于: dtrace -n 'profile-1001 /pid == 12345 && arg1/ { @[ustack()] = count(); }

2 个答案:

答案 0 :(得分:7)

尝试Linux perf_events(又名" perf"命令),它是主线Linux内核的一部分,通常通过linux-tools-common(或类似)软件包安装。我经常用它在Linux上创建火焰图。

我写了一些关于使用perf创建火焰图的说明:http://www.brendangregg.com/perf.html#FlameGraphs

答案 1 :(得分:1)

迈克·邓拉维(Mike Dunlavey)提出了pstack,在我应用ARM补丁并在ARM设备上运行它之后不幸发生了段错误。在我有时间看一下之前,我找到了以下的权宜之计解决方案:

http://www.commandlinefu.com/commands/view/4039/print-stack-trace-of-a-core-file-without-needing-to-enter-gdb-interactively

它使用gdb和以下命令:gdb --q --n --ex bt --batch --pid PID

有点慢,但有效。