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条)