首页 > 解决方案 > 在 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 上运行分析工具?

标签: androidc++clangprofiling

解决方案


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

要验证,readelf -aW请在有问题的共享库上运行。在我的仓库中,sh_infofor.dynsym是 3,而至少有 11 个 LOCAL 符号。


推荐阅读