android - 在 Android 上使用 Instrumentation 进行 Clang 分析
问题描述
我正在为 Android 编译一个共享库,其他人在他们的应用程序中加载该库。我想分析我的库,因为它在 Android 设备上运行,使用 Clang 的分析和 instrumentation。
我在-fprofile-instr-generate
编译和链接中添加了 Clang 选项,虽然在 Linux 上编译和加载库时这会产生原始分析数据,但在 Android 上我收到以下错误:
04-26 20:39:37.559 3313 3313 D AndroidRuntime: 关闭虚拟机
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 Android 运行时:
java.lang.UnsatisfiedLinkError: dlopen failed: 无法定位“/path/to/my.so”引用的符号“__start___llvm_prf_vnds”...
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.loadLibrary(System.java:1657)
跑步时nm -D my.so | grep prf
我得到:
00000000007f1cc8 d __start___llvm_prf_cnts
0000000000827918 d __start___llvm_prf_data
00000000008fb570 d __start___llvm_prf_names
000000000117bf58 d __start___llvm_prf_vnds
0000000000827918 一个 __stop___llvm_prf_cnts
00000000008fb568 a __stop___llvm_prf_data
000000000117bf54 一个 __stop___llvm_prf_names
0000000001181f58 一个 __stop___llvm_prf_vnds
所以看起来符号在那里。
是否可以在 Android 上运行分析工具?
解决方案
分析适用于黄金和 LLD 链接器。此错误仅在使用 BFD 链接器时引起。section的sh_info
条目.dynsym
应该指向第一个非本地符号,但在错误情况下,它设置得太低。
要验证,readelf -aW
请在有问题的共享库上运行。在我的仓库中,sh_info
for.dynsym
是 3,而至少有 11 个 LOCAL 符号。
推荐阅读
- linux - 如何在ansible中重命名文件
- spring-boot - 带有 CompletableFuture 的 Spring-boot AOP 建议
- javascript - 这个 express 变量在做什么?
- php - PHP imagick - 将 eps 转换为 jpg 但质量很差
- python - 从 Python 外部运行 Python 脚本错误:导入 etree 时 DLL 加载失败:找不到指定的模块
- kubernetes - 无法在 Kubernetes 集群上部署简单的“Hello World”应用程序
- amazon-web-services - 如何更改 AWS 安全组的出口规则?
- python - EC2服务器中的Python Geoip2 maxminddb.reader错误
- javascript - Error: write EPIPE while using imagemagick To write a lambda function
- ios - ios,alamofire5:需要相当于 curl --key foo.key --cert foo,pem --location --request GET 'https://bar.baz/foo"