android 动态库调试,Android:动态库(.so)调试技巧

博客介绍了Android动态库调试方法。一是反汇编定位crash,先查看crash log,若第三方动态库无法分析代码则从外层调用代码查找;使用ndk objdump工具反汇编库,分析dump文件定位问题,可先找特殊指令大致定位范围再精确查找。二是介绍查看动态库符号表的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、反汇编定位crash

①查看crash log:

83d79550e6007dcc5f1df9a7e2ece3b4.png

上图已标出crash发生在 libdeflicker_gpu.so 库中的 default_fail_func() 函数,但是 libdeflicker_gpu.so 是第三方动态库,无法分析代码,所以退一步到外层的调用代码查找问题。

链接  libdeflicker_gpu.so 的动态库是 com.arcsoft.node.deflickergpu.so,由自己封装层代码生成,从代码查找到调用了 libdeflicker_gpu.so 的接口函数 ADF_Preview_Process_FD,crash的时候寄存器的值保存了下来,上图黄框所示。

②使用ndk objdump工具反汇编libdeflicker_gpu.so库(注意32/64位库的工具版本不同):

D:\Android\Sdk\ndk-bundle\toolchains\aarch64-linux-android-4.9\prebuilt\windows-x86_64\aarch64-linux-android\bin\objdump.exe -d libdeflicker_gpu.so > objdump_libdeflicker.txt

从保存的 objdump_libdeflicker.txt 文本中找到 ADF_Preview_Process_FD 函数:

a9600c9c2795e31aec2cca6d05a44397.png

可看到函数起始地址为 056188(十六进制),crash地址为 = 056188(十六进制) + 12(十进制) = 0x056194

接着分析dump 文件可知,0056194处的指令是 stp    x29, x30, [sp,#176],即把一对值x29和x30放到SP+176的地址,从函数的入口取值就发生了crash,说明传入的参数有问题,一般是指针为空或指向了非法内存导致。

所以在调用层检测传入参数即可,比如是结构体,就把其中指针变量都打印出来确认一下是否有效。如果外层参数都没问题,就说明第三方库内部的bug,需要找提供库的人进行排查。

技巧总结:先在crash汇编指令附近找特殊指令,如mla 乘加指令、64位乘法、移位等出现次数较少的指令,大致定位下crash范围,然后逐行分析汇编找到精确的c/c++代码位置。

二、查看动态库符号表

(1)nm -D xxx.so

13491fd70428cd151954a4721a6f6178.png

(2)readelf -s xxx.so

07038f724c54451d0177b0a0b7163cc8.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值