Perf 在 Android 上无法正确显示调用图

Posted

技术标签:

【中文标题】Perf 在 Android 上无法正确显示调用图【英文标题】:Perf does not display call graph properly on Android 【发布时间】:2015-09-08 01:22:01 【问题描述】:

我正在尝试使用 perf 来分析我的 android 应用程序。

在fplutil项目的帮助下,我设法在Android设备上安装了perf,在主机上运行perf record然后perf report

通常当我运行perf report -g 时,我希望看到类似于此的调用图:

47.91%    a.out  a.out              [.] f5()
          |
          --- f5()
             |
             |--53.82%-- f4()
             |          |
             |          |--56.16%-- f3()
             |          |          |
             |          |          |--49.14%-- f2()
             |          |          |          |
             |          |          |          |--52.92%-- f1()
             |          |          |          |          a()
             |          |          |          |          main
             |          |          |          |          __libc_start_main
             |          |          |          |
             |          |          |           --47.08%-- a()
             |          |          |                     main
             |          |          |                     __libc_start_main

但是,当我为在 Android 设备上收集的数据执行 perf report 时,我看不到正确的调用图,例如堆栈未正确展开:

4.98%  app_name  my_lib.so  [.] void quat_apply<double>(double*, double const*, double const*, int, double)
            |                                                                                              
            --- 0xbee75fe4                                                                                 

            |                                                                                              
            --- 0xbee760c4                                                                                 

            |                                                                                              
            --- 0xbee75c0c 

如何将这些十六进制地址替换为函数名?

我已经在使用-g-fno-omit-frame-pointer 构建我的代码,我还缺少什么吗?

【问题讨论】:

【参考方案1】:

宾果游戏!

-mapcs-frame

生成符合 ARM 过程调用的堆栈帧 所有功能的标准,即使这不是严格必要的 正确执行代码。指定 -fomit-frame-pointer 与 此选项导致不为叶子生成堆栈帧 职能。默认值为 -mno-apcs-frame。此选项已弃用。

虽然选项被标记为已弃用,但它为我修复了调用图。

【讨论】:

幸运的是,我看到其他人也尝试在 Android 上使用 perf。我遇到了几个问题。如果您能给我一些建议,将不胜感激。 基本上我放弃了 perf,似乎它在任何地方都不起作用,但在 fplutil 源代码中列出的几个设备上。现在,我使用“poor man profiler”的变体来分析 C++ Android 应用程序。您可能知道这个想法:您启动算法并使用调试器定期停止执行并查看执行了哪些代码。手动执行此操作非常麻烦,但您可以自动化该过程。我写了一些脚本来做到这一点,虽然我还没有准备好分享它们。如果您对这种方法感兴趣,我可能会为您提供帮助。至少它有效。 谢谢。我想我的目的和你的有点不同。我希望做的是自动捕获Android应用程序的本机调用的执行序列,无需源代码。我认为最好的方法是从 CPU 端执行此操作,例如分支跟踪,这是 Intel CPU 最初的设计。但是在我的 Nexus 5x 上,我没有测试它。所以我转向表演另一种方式。 Android NDK 性能不受支持。 Google 引入了 simpleperf。而且它一直在不断发展。但到目前为止 simpleperf 无法完全满足我的需求。我还在尝试,有点卡住了。

以上是关于Perf 在 Android 上无法正确显示调用图的主要内容,如果未能解决你的问题,请参考以下文章

[转]perf + 火焰图分析程序性能

从 Android 应用程序调用 PHP REST API 无法正确显示变音符号 (äüö)

simpleperf 火焰图

Android Camera Preview 无法在 Google Glass 上正确显示?

如何使用 linux perf 工具进行代码理解

Linux利器之perf(火焰图)