如何在每个示例中从探查器获取完整的堆栈转储,以便在火焰图中使用



我真的很喜欢火焰图用于分析的想法,因为它将有助于消除不必要的函数调用。但是,有一个问题,因为它要求探查器在每次收集样本时执行完整的堆栈转储。这可以通过DTrace或SystemTap很容易完成,但是我需要能够在运行ubuntu的ARM设备上执行此操作(这消除了DTrace)。我也想在不重新编译内核的情况下执行此操作(这消除了 SystemTap)。

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

尝试Linux

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

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

pstack 是由 Mike Dunlavey 建议的,不幸的是,在我应用 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

有点慢,但有效。

最新更新