我正在尝试使用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
构建了我的代码,我是否遗漏了其他内容?
答案 0 :(得分:1)
宾果!
-mapcs-frame
生成符合ARM Procedure Call的堆栈帧 所有功能的标准,即使这不是绝对必要的 正确执行代码。使用指定-fomit-frame-pointer 此选项导致不为叶生成堆栈帧 功能。默认值为-mno-apcs-frame。不推荐使用此选项。
虽然选项被标记为已弃用,但它为我修复了调用图。