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 上无法正确显示调用图的主要内容,如果未能解决你的问题,请参考以下文章
从 Android 应用程序调用 PHP REST API 无法正确显示变音符号 (äüö)