Android Native crash问题分析

news/2024/11/23 3:02:52/

1、准备材料

  • android-ndk-r21b工具:addr2line和objdump工具。

  • .so库:crash对应的带符号表的共享库

  • 源代码code:crash对应的源码文件

  • tombstone:Android系统产生的墓碑文件

2、 tombstone墓碑文件分析

 关键信息:

  1. crash的进程id(pid)和线程id(tid)

  2. 错误类型是段错误(SIGSEGV)和错误地址(0x0000007172d3a000)

  3. crash的事故现场,即x0-x31寄存器的值

  4. crash的backtrace信息

其中,段错误(SIGSEGV)一般是由于访问无效内存引起,错误地址(0x0000007172d3a000)和 x0-x31 寄存器的值在后续的反汇编分析中有用;backtrace可以看到crash前的调用栈。详细的分析过程如下:

crash时,PC寄存器的值是00000072d376d468,指向代码最后执行的绝对地址,其相对地址是backtrace中的"#00 pc 0000000000138468"的0000000000138468,两个地址相减,得到.so的起始加载地址00000072d376d468-0000000000138468=72d3635000,72d3635000是一个绝对地址。通过查看tombstone文件中的memory map地址映射表,我们可以看到.so的地址映射范围是:

其中的起始地址就是我们刚才计算的00000072d3635000。"rwx"分别表示可读、可写、可执行权限。"---"表示无权限,即无效地址区域。

其次,通过bactrace可以得到crash前的调用栈,如下图所示:

 上述的地址信息看起来并不直观,可以使用ndk-stack工具(在android-ndk/ndk-stack路径下,是对addr2line工具的包装)将地址转换为方便阅读的代码:

ndk-stack -sym /Users/lijian/work/Crash/obj/local/arm64-v8a/libmorpho_Lowlight.so -i /Users/lijian/work/Crash/tombstone_03 > backtrace.txt

由此我们得到crash前完整的调用路径,以及代码最后crash的位置是多少行:

可以从源代码中找到相应的行数。

3、反编译

最后,我们来分析段错误地址0x0000007172d3a000。分析这个地址的产生需要进行反汇编分析,我们可以使用objdump工具得到.so对应的汇编代码:

./bin/aarch64-linux-android-objdump -d /Users/lijian/work/Crash/obj/local/arm64-v8a/libmorpho_Lowlight.so > asm.txt

打开asm.txt,并定位到代码crash的位置,即backtrace中的第一个地址"#00 pc 0000000000138468"中的0000000000138468,如下图所示:

crash对应的汇编代码是"ldrb q1, [x5]#16",该汇编指令从地址x5+16的地方加载一个字节。通过查看tombstone文件中的x24寄存器的值,可以知道x5=0000007172d3a000。如下图所示:

 x5+16 = 0000007172d3a000 +16=7172d3a016,刚好得到段错误的地址7172d3a000。通过进一步查看memory map,可以看到地址是非法的地址区间,如下图所示:

综上,我们可以确认crash产生的原因是出现了地址越界,通过进一步分析代码,进而解决问题。

参考连接:Android Native crash问题分析 (qq.com)


http://www.ppmy.cn/news/223078.html

相关文章

c# 8.0 语法新特性

索引与范围 索引 使用^操作符:^1指向最后一个元素,^2倒数第二个元素: char[] vowels new char[] {a,e,i,o,u}; char lastElement vowels [^1]; // u char secondToLast vowels [^2]; // o 范围 使用..操作符slice一个数组(左闭右开&a…

关于斑马打印机开发的几种方式

最近需要做斑马打印机二次开发,研究了几天发现了几种方式,下写来做个记录。 目前知道的3种方式: 1、tcp开发,直接发送zpl数据 2、调用系统打印机,发送zpl数据 3、调用系统打印机,使用graphics&#xff…

Zebra 斑马打印机如何打印中文参数

要实现ZPL打印中文,首先需要zebra打印机加载SIMSUN.TTF(宋体),然后在ZPL中编码使用UTF-8的encoding来打印,类似如下: ^XA #标签的开始 ^CW1,E:SIMSUN.FNT #绑定字体 ^CI28 #UTF-8编码 ^FO100,300^A1N,40,,E:SIM000.FNT^FR^FD简体中文…

zebra 斑马打印机 打印图片

1、制作好图片(文件名最好用英文) 2、上传到打印机 2.1 打开 ZebraDesigner Fonts and Graphics downloader 上传图片的方法,如果有需要的请留言 2.2 验证是否上传成功 打开软件 Zebra setup utiliites->选中斑马打印机->打开与打印机…

斑马888-TT不认新纸

打印首选项-工具-操作-校正介质-传送-打印机会颤抖出纸3-5张 注意一定设置好对应的标签尺寸,否则一直连续出纸!

el-table 设置斑马纹的效果,改变鼠标移入时和斑马纹的默认颜色

前提条件&#xff0c;引用了预处理&#xff0c;可以使用 /deep/ 或 ::v-deep &#xff0c;没有使用预处理&#xff0c;使用 >>> html 部分 <template><el-table:data"tableData":row-class-name"tableRowClassName":header-cell-style…

斑马打印机wifi连接

安装Zebra Setup Utilities.exe&#xff0c;打开软件 https://www.zebra.cn/cn/zh/support-downloads/printers-cn/zr328.html 点击相应的打印机(如果无打印机设备&#xff0c;请点击右侧的安装打印机安装驱动)配置打印机连接属性 - [ ] 未连接成功时注意IP是否正确

[转]马与斑马

马与斑马 [英]迈尔斯.金顿 从前&#xff0c;非洲的草原上有一群斑马&#xff0c;它们遇到了一匹在野外游荡的马。马想加入它们的队伍。斑马愉快地接纳了它。 马对身边的斑马说&#xff1a;“你们为什么都有黑白条纹&#xff1f;我从没看见过这样糟糕的伪装。别人在几英里以外…