用Android上的仪器分析

Clang Profiling with Instrumentation on Android

本文关键字:仪器 Android      更新时间:2023-10-16

我正在为Android编译一个共享库,其他人将加载其应用程序。我想使用clang的谱图在Android设备上运行时介绍我的库。

我添加了CLANG选项-fprofile-instr-generate中的汇编和链接,尽管在linux上编译并加载库时,这会产生原始分析数据,但在Android上,我会收到以下错误:

04-26 20:39:37.559 3313 3313 D androidruntime:关闭VM

04-26 20:39:37.559 3313 3313 E Androidruntime:致命例外:Main

04-26 20:39:37.559 3313 3313 E AndroidRuntime:过程:com.my.process,PID:3313

04-26 20:39:37.559 3313 3313 E androidruntime:

java.lang.unsatisfiedlinkerror:dlopen失败:无法找到符号&quot'__ start _____ llvm_prf_vnds;由"/path/to/my.so" ...

引用

04-26 20:39:37.559 3313 3313 e androidruntime:在java.lang.runtime.loadlibrary0(runtime.java:1016(

>

04-26 20:39:37.559 3313 3313 E androidruntime:在java.lang.system.system.loadlibrary(system.java:1657(

运行nm -D my.so | grep prf时,我会得到:

00000000007F1CC8 D __ start ___ llvm_prf_cnts

0000000000827918 D __ start ___ llvm_prf_data

00000000008FB570 D __ _________ llvm_prf_names

000000000117bf58 d __ start ___ llvm_prf_vnds

0000000000827918 A __STOP ___ llvm_prf_cnts

00000000008FB568 A __STOP ___ llvm_prf_data

000000000117BF54 A __ stop ___ llvm_prf_names

0000000001181F58 A __STOP ___ llvm_prf_vnds

所以看起来像符号。

是否可以在Android上运行分析仪器?

分析与黄金和LLD连接器一起使用。此错误仅在使用BFD链接器时引起。.dynsym节的sh_info条目应指向第一个非本地符号,但在错误情况下,它设置了太低。

要验证,在有问题的共享库上运行readelf -aW。在我的存储库中,.dynsymsh_info为3,而至少有11个本地符号。