一、反汇编定位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-bundleoolchainsaarch64-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

android动态32位so,Android:动态库(.so)调试技巧相关推荐

  1. VS2015编译32位Opencv310(动态库+静态库,文末有下载链接)

    VS2015编译32位Opencv310(动态库+静态库 编译过得,可以直接用的: http://download.csdn.net/download/longzaihuaxia/9802510 之前 ...

  2. linux 静态编译多媒体框架,Go编译32位GNU静态链接库的方法

    Go链接库系统的难用可谓是人尽皆知,不同Go版本编译出来的不兼容,而且只支持GNU的,不能编译出Windows上的dll和lib. 本次有需求是将Go代码编译成32位GNU静态链接库. Go代码 编写 ...

  3. 一步一步学ROP之Android ARM 32位篇

    蒸米 · 2015/12/17 9:41 0x00 序 ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术,可以用来绕过现代操作系统的各种 ...

  4. Android APK 32位和64位 的区别

    现在我们或者运营人员在更新应用市场的是时候会被要求上传 32位 的安装包和 64位 的安装包 32位 对应的就是32位的操作系统,那么 64位 就是对应64位的操作系统. 64位的操作系统运行起来比3 ...

  5. 【VS 2017 C语言 汇编语言】如何使用VS 2017,通过反汇编查看C语言代码对应的32位x86汇编语言 VS 2017单步调试的使用

    0 前言 本文适用于VS的大多数版本,本文以VS 2017为例进行讲解. 1 编辑C语言代码 首先,在VS编译器中,创建项目,敲一段C语言代码,这个过程不解释了,如果不会请百度. #include & ...

  6. 【conda】——新建32位python环境,vscode无法调试

    1. 新建32位 conda 环境 激活一个conda A环境,将其设置成32位,然后再新建一个conda B环境,这样在 conda B 中用pip 安装的软件就都是32bit的了. 设置成32bi ...

  7. android 32位crc,android arm64硬件实现加速crc32算法

    在android arm64平台下,crc32,aes等常用算法有指令集实现.故在android下,可借助这些指令实现代码加速. 如何判断自己的手机是否支持crc32呢? 有三个方法: 方法1,直接查 ...

  8. Android 打包32位和64位兼容包

    在app下的build.gradle android {defaultConfig {ndk {abiFilters "armeabi", "armeabi-v7a&qu ...

  9. android模拟器32位下载,【天天安卓模拟器和Internet Explorer 10(32位)哪个好用】天天安卓模拟器和Internet Explorer 10(32位)对比-ZOL下载...

    ie10浏览器是为全世界所广泛使用的 Windows Internet Explorer浏览器系列的最新版本,ie10浏览器集成了更多个性化.智能化.隐私保护的新功能,为您的网络生活注入新体验,让您每 ...

最新文章

  1. iOS项目工程及目录结构
  2. 6、Hive的特殊分隔符处理
  3. HttpApplication IHttpAsyncHandler, IHttpHandler, IComponent, IDisposable ps url System.Web.dll
  4. QTcreator 多线程(生产者消费者)
  5. C#多线程学习之(五)使用定时器进行多线程的自动管理
  6. java orika_常见Bean映射工具分析评测及Orika介绍
  7. 西方餐厅的顶级食材,被中国人干到了“白菜价”
  8. Apache工作模式详解
  9. mysql 1415 function_mysql error 1415:not allowed to return a result set from a function
  10. 分别使用多线程\多进程\协程+paramiko在华为交换机批量快速进行配置(eNSP模拟器)
  11. java-循环变量定义问题
  12. Gradle全版本资源下载
  13. 苹果屏蔽更新描述文件_安装iOS屏蔽更新描述文件教程方法
  14. Linux文件许可权764意味着,chmod 777意味着什么
  15. Android中HorizontalScrollView的使用总结
  16. Wireshark协议分析之DHCP
  17. 【分布式系统篇】链路追踪之Jaeger安装使用入门
  18. 【electron】打开离线包-读本地文件
  19. 宅急送项目的第九天笔记!( 角色--权限管理)
  20. 产品需求报告文档模板

热门文章

  1. 来首都初次就医的感受
  2. 从n个数中随机选取m个
  3. CVS代码库管理安装配置
  4. jquery订阅发布插件代码草稿,为jquery扩展jquery.publish,jquery.subscribe方法
  5. 企业c语言的编程风格,c语言优秀编程风格.docx
  6. ☆ 10个小技巧,让你的 Python 代码更加优雅~ ☆
  7. 2014/School_C_C++_A/5/勾股定理
  8. 学计算机,怎么入门?
  9. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1079:计算分数加减表达式的值
  10. 简单粗暴的入门机器学习