zoukankan      html  css  js  c++  java
  • Android:动态库(.so)调试技巧

    一、反汇编定位crash

      ①查看crash log:

        

        上图已标出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:AndroidSdk
    dk-bundle	oolchainsaarch64-linux-android-4.9prebuiltwindows-x86_64aarch64-linux-androidinobjdump.exe -d libdeflicker_gpu.so > objdump_libdeflicker.txt

       从保存的 objdump_libdeflicker.txt 文本中找到 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 xxx.so

    (2)readelf -s xxx.so

  • 相关阅读:
    01Angular开发环境配置
    不再显示广告案例(php操作cookie)
    php操作 cookie
    JPush Android 推送如何区分开发、生产环境
    10 分钟实现一个自己的服务器监控器
    iOS 轻松使用 App 数据统计
    认识本质:黑天鹅、关键时刻与张小龙的产品观
    C# 服务端推送,十步十分钟,从注册到推送成功
    聊天界面-自适应文字
    极光推送的角标问题——让人又爱又恨的小红点
  • 原文地址:https://www.cnblogs.com/blogs-of-lxl/p/11474820.html
Copyright © 2011-2022 走看看