在Android上使用仪器进行Clang分析

问题描述 投票:4回答:1

我正在为Android编译一个共享库,别人在他们的应用中加载。我想在我的库在Android设备上运行的时候,使用Clang的 仪表测绘.

我已经添加了Clang选项 -fprofile-instr-generate 到编译和链接,虽然这在Linux上编译和加载库时产生了原始剖析数据,但在Android上我得到了以下错误。

04-26 20:39:37.559 3313 3313 D AndroidRuntime: 关闭虚拟机

04-26 20:39:37.559 3313 3313 E AndroidRuntime: FATAL EXCEPTION: 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 failed: cannot locate symbol "__start___llvm_prf_vnds" referenced by "pathtomy.so":

java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "__start___llvm_prf_vnds" referenced by "pathtomy.so"...。

04-26 20:39:37.559 3313 3313 E AndroidRuntime: at java.lang.Runtime.loadLibrary0(Runtime.java:1016)

04-26 20:39:37.559 3313 3313 E AndroidRuntime: at 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 a __stop___llvm_prf_cnts

00000000008fb568 a __stop___llvm_prf_data

000000000117bf54 a __stop___llvm_prf_names

0000000001181F58 A __stop___llvm_prf_vnds

所以看起来符号是有的。

能否在安卓系统上运行剖析仪器?

android c++ clang profiling
1个回答
0
投票

剖析与gold和LD连接器一起工作。只有在使用BFD链接器时才会出现这个错误。. 该 sh_info 参赛 .dynsym 部分应该指向第一个非LOCAL符号,但在错误情况下,它被设置得太低。

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

© www.soinside.com 2019 - 2024. All rights reserved.