一、反汇编定位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:\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 函数:

   

   可看到函数起始地址为 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

最新文章

  1. 简单实用的Log4net帮助类
  2. Django~NewProject and APP
  3. MongoDB与Mysql常用命令解释
  4. unity3d进行脚本资源打包加载
  5. eclipse中输入@符号自动提示Annotation
  6. postgresql 入门(含java、scala连接代码)
  7. socket 怎么设置心跳判断连接
  8. 深入MySQL源码 学习方法 何登成专家
  9. JavaScript学习总结【5】、JS DOM
  10. [No0000B7]If else 与 三元表达式? : 效率对比
  11. HTK语音识别示例(Ubuntu)
  12. Recycleview实现复杂布局
  13. Windows 10创意者更新ISO发布!官方下载
  14. FIFO深度计算
  15. [ZJOI2016]旅行者
  16. C++ 第二次实验
  17. 使用Docker for Windows初体验
  18. python基础之 编码进阶,文件操作和深浅copy
  19. 通过AOP自定义注解实现日志管理
  20. Android MaterialDesign之水波点击效果的几种实现方法

热门文章

  1. web容器(weblogic、resin、tomcat、jboss对比)
  2. 有关linux中出现systemctl status network.service" and "journalctl -xe" for details.
  3. springbatch
  4. hi 北京
  5. [Visual Studio] 自定义项目模板(.vsix扩展)
  6. JAVA遇见HTML——JSP篇(JSP内置对象上)
  7. FineAdmin.Mvc 使用ok-admin+ASP.NET MVC搭建的通用权限后台管理系统
  8. springboot项目上有个红叉,且ecplise没有自动编译项目,运行提示“错误: 找不到或无法加载主类”
  9. Java锁--LockSupport
  10. Vue -- element-ui el-table 点击tr项页面跳转,返回后缓存回显点击项