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

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

2023年7月7日发(作者:)

Android:动态库(.so)调试技巧⼀、反汇编定位crash  ①查看crash log:    

    上图已标出crash发⽣在 libdeflicker_ 库中的 default_fail_func() 函数,但是 libdeflicker_ 是第三⽅动态库,⽆法分析代码,所以退⼀步到外层的调⽤代码查找问题。    链接 libdeflicker_ 的动态库是 ,由⾃⼰封装层代码⽣成,从代码查找到调⽤了 libdeflicker_ 的接⼝函数ADF_Preview_Process_FD,crash的时候寄存器的值保存了下来,上图黄框所⽰。

  ②使⽤ndk objdump⼯具反汇编libdeflicker_库(注意32/64位库的⼯具版本不同):D:AndroidSdkndk-bundletoolchainsaarch64-linux-android-4.9prebuiltwindows-x86_ -d libdeflicker_ > objdump_   从保存的 objdump_ ⽂本中找到 ADF_Preview_Process_FD 函数:   

   可看到函数起始地址为 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 (2)readelf -s

发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1688677649a161780.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信