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:\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

Android:动态库(.so)调试技巧的更多相关文章
- ffmpeg学习笔记-Linux下编译Android动态库
Android平台要使用ffmpeg就需要编译生成动态库,这里采用Ubuntu编译Android动态库 文件准备 要编译生成Android需要以下文件 NDK ffmpeg源代码 NDK下载 NDK可 ...
- android 动态库死机调试方法 .
原地址:http://blog.csdn.net/andyhuabing/article/details/7074979 这两种方法都不是我发明了,都是网上一些高手公共出来的调试方法,无奈找不到出处的 ...
- QtCreator pro中相对路径和debug文件夹下未放动态库时调试报QtCreator:during startup program exited with code 0xc0000135错误
QtCreator pro中相对路径一般是以pro文件(非main函数所在文件)所在的当前目录为起点,用$$PWD表示. 如头文件和库文件 INCLUDEPATH +=$$PWD/inc win32 ...
- android中使用gdbserver调试c程序
先废话两句,这篇文章可能有所缺陷,因为我并没有条件去测试动态库的调试.(主要是因为是自己的手机不想乱放各种so) 所以我只能说有空的话我会去进行下测试,这里就先这样了. 1.测试代码gdb-test. ...
- Linux Debugging(六): 动态库注入、ltrace、strace、Valgrind
实际上,Linux的调试方法非常多,针对不同的问题,不同的场景,不同的应用,都有不同的方法.很难去概括.本篇文章主要涉及本专栏还没有涵盖,但是的确有很重要的方法.本文主要包括动态库注入调试:使用ltr ...
- Android动态调试so库JNI_Onload函数-----基于IDA实现
之前看过吾爱破解论坛一个关于Android'逆向动态调试的经验总结帖,那个帖子写的很好,对Android的脱壳和破解很有帮助,之前我们老师在上课的时候也讲过集中调试的方法,但是现在不太实用.对吾爱破解 ...
- [付费视频]Delphi视频Android开发使用静态库(A)和动态库(SO)
关于本视频:前阵子接到一个委托,解决Delphi开发Android程序中串口通信的问题,厂家那边提供了c文件,需要翻译成delphi可用,翻译倒是比较简单.不过后来翻译读写ic卡单元的时候进行不下去了 ...
- 利用android studio 生成 JNI需要的动态库so文件
JNI: Java Native Interface, 提供了java语言和其他语言(例如c和c++)进行相互调用的方式. 本文是用java调用c生成的so模式.其中,编译so文件过程如下: 1) ...
- 关于Android NDK中调用第三方的动态库
因为最近在整合Android 上RTSP播放器的网络库,因需要调用自己编译的网络库,调用一直出现问题,开始时是直接在Android.mk 中加入LOCAL_SHARED_LIBRARIES := li ...
随机推荐
- DRDA
在谈到分布式DB2数据时,有必要谈谈DRDA. DRDA代表分布式关系数据库体系结构. 它是由IBM开发的一种体系结构,它使关系数据能够在多个平台之间分布. 平台和平台都可以相互通信. 例如,一个DB ...
- [杭电oj][1005]Number Sequence
sky同学在努力地刷题..,在这题卡住了,于是一起研究了一下... 这题本身挺简单的,(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) m ...
- 浅谈sass与less区别优缺点
Sass是一种动态样式语言,Sass语法的缩排语法,比Css比多出很多功能,如变量,嵌套,运算,继承,颜色处理,函数等,易于阅读.Cass的安装需要安装Ruby环境,是服务器端处理的,Less是需要引 ...
- zencart批量更新后台邮箱地址sql
zencart批量更新后台邮箱地址sql UPDATE `configuration` SET `configuration_value` = '新邮箱地址' WHERE `configuration ...
- string::clear
void clear() noexcept;功能:把string对象置为空 #include <iostream>#include <string> using namespa ...
- css选择器学习(一)
1.通用选择器“*”和元素选择器 <!DOCTYPE html> <html lang="en"> <head> <meta charse ...
- 数据结构实验之栈与队列二:一般算术表达式转换成后缀式(SDUT 2132)
题目链接 #include <bits/stdc++.h> using namespace std; typedef long long ll; int ok(char ch, char ...
- postgresql 一些操作
postgresql 对sql语句敏感的. 所以尽量标准化输入 #############查看版本信息 ############ 1.查看客户端版本 psql --version 1 2.查看服务器端 ...
- Java 方法的重写
方法重写规则: 1.子类要重写的方法与父类方法具有完全相同的返回类型+方法名称+参数列表: 2.子类要重写的方法的访问权限大于或者等于父类方法的访问权限: 3.子类要重写的方法不能抛出比父类方法更大的 ...
- ie8 ajax 跨域问题
最近做了个客服端要通过ocx获得初始化数据就是一个html页面镶嵌在一个c++做的程序里面通过c++做的程序的一个按钮来打开我的这个html页面但是页面中的ajax就是用不了又不报错 后来加入了cro ...