Android Native crash问题分析

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)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Android原生崩溃(android native crash)是指在Android平台上,由于代码执行错误或者资源耗尽等原因,导致应用程序无法正常运行而崩溃或者闪退的现象。原生崩溃产生的原因可能是由于C或者C++代码编写错误、内存溢出、线程竞争等。针对原生崩溃问题,开发人员需要使用调试工具进行定位和修复。 ### 回答2: Android Native Crash发生在安卓应用程序运行时,由于C或C++库的错误或者其他原因导致应用程序崩溃。有时候Native Crash可能会影响整个设备,尤其是当Native Crash发生在系统级别的代码中时。 产生Native Crash的原因通常包括以下几个方面: 1. 内存管理问题Native Crash通常与内存管理问题相关,这可能是由于访问未初始化的内存,使用错误的指针或释放已释放的内存等原因引起的。 2. 硬件问题Native Crash也可能与设备相关的硬件问题有关,例如访问不可用的硬件资源或硬件设备故障。 3. 应用程序代码问题Native Crash可能发生在应用程序代码的错误、资源泄漏、堆栈溢出等问题引起的。 4. 第三方库问题Native Crash也可能由第三方库中的错误或bug引起。这些库可能没有经过充分的测试,或者与设备硬件不兼容。 为了更好地解决Native Crash问题,开发者可以通过日志或崩溃报告(Crash Report)来检测和分析崩溃日志,并查看堆栈跟踪信息来确定导致Native Crash的来源。在开发过程中,经常使用除了自己编写的代码之外的第三方库时,还可以考虑使用崩溃的回溯工具,如Firebase Crashlytics等。 总之,Native CrashAndroid应用程序开发过程中经常遇到的问题,它可能会对用户体验和开发进度产生重大影响,因此开发者需要强化对Native Crash的理解和分析能力,以更好地解决Native Crash问题。 ### 回答3: Android Native Crash,指的是在 Android 系统中发生的本地崩溃。本地崩溃是指应用程序使用本地代码,而不是 Java 代码,导致应用程序崩溃的问题。本地代码可以是编写在 C/C++ 等语言中的库,或是应用程序本身所编写的 Native 代码。 本地代码崩溃后,会在应用程序崩溃的同时发生。本地崩溃可发生在 Android 应用程序中的任何部分,比如,应用程序本地库、Android 系统库等等。大多数情况下,本地崩溃是由于访问无效内存、访问不合法指针、数组越界等问题引起的。 为了解决本地崩溃问题Android 提供了一些工具和技术。比如,使用 ndk-stack 工具可以解析本地崩溃日志。Android Studio 也提供了一些工具来分析应用程序崩溃的原因。同时,我们也可以在应用程序中添加自定义的日志跟踪信息,以便更好地了解应用程序的崩溃原因。 还有一些其他的技术可以使用,如使用 Google 的 Crashlytics 来跟踪应用程序的崩溃问题。这个平台可以帮助开发者收集和分析应用程序在用户设备上的崩溃信息,并彻底解决这些问题。此外,Android 还提供了一些实用工具和技术,如 ANR(Application Not Responding)错误处理器、Tracer for OpenGL ES 和 Traceview 示例等。 总之,Android Native CrashAndroid 系统中常见的崩溃问题之一。了解它的原因并采用适当的解决方案可以使得我们更好地保持我们的应用程序的稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

岁月蹉跎的一杯酒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值