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

Posted

技术标签:

【中文标题】如何在每个样本中从分析器获取完整的堆栈转储以用于火焰图中?【英文标题】:How to get complete stack dump from profiler in every sample for use in flame graph? 【发布时间】:2012-04-26 12:26:32 【问题描述】:

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

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

【问题讨论】:

可能性:pstackpoor man's profiler 使用 gdb 获取堆栈跟踪。 pstack 看起来很有希望,不过我想要一些比穷人的分析器更自动化的东西。 检查 /proc//stack 是否存在。这将为一个进程提供内核堆栈。一些不同的东西,但可能有用。 gdb 解决方案将只跟踪用户空间。即,您可以看到内核代表您的进程在哪里花费时间。您可能应该删除标签 dtrace 并添加 linux. 【参考方案1】:

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

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

【讨论】:

+ 刚刚对你投了赞成票,因为没有人应该有低代表 :) 我相信墙上的堆栈样本,尽管你可能知道我对火焰图并不感到兴奋。干杯。【参考方案2】:

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

有点慢,但可以。

【讨论】:

以上是关于如何在每个样本中从分析器获取完整的堆栈转储以用于火焰图中?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Ruby 中获取堆栈跟踪对象?

如何获取 Java.exe/jvm.dll 的符号文件以分析崩溃核心转储文件?

如何让android打印掉崩溃系统应用程序的核心转储?

从完整的内存转储中查看托管堆栈

从核心转储中获取堆栈跟踪

“样本”在分析器中代表多少秒?