NDK native crash 问题分析

常见的错误类型如下:

    初始化错误
    访问错误

    数组索引访问越界
    指针对象访问越界
    访问空指针对象
    访问无效指针对象
    迭代器访问越界

    内存泄露
    参数错误
    堆栈溢出
    类型转换错误
    数字除0错误

 

常用命令:

*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Native Crash TIME: 3875438
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Build fingerprint: ':userdebug/test-keys'
Revision: '0'
ABI: 'arm'
pid: 319, tid: 20699, name: afctrl  >>> /vendor/bin/hw/android.hardware.camera.provider@2.4-service <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x280028
    r0  a6ec4b88  r1  a7c72540  r2  00280029  r3  a724123c
    r4  a76fa000  r5  a7c72e70  r6  a7c771f8  r7  a7c72540
    r8  a6ec5490  r9  a7c72c48  r10 a7c72e70  r11 a6ec5470
    ip  a7253f40  sp  a6ec4b30  lr  a72430e4  pc  00280028

backtrace:
    #00 pc 00280028  <unknown>
    #01 pc 000030e0  /vendor/lib/libspa.so (spa_calculation+92)
    #02 pc 0002d4df  /vendor/lib/libispalg.so (caf_monitor_calc+42)
    #03 pc 00029f9f  /vendor/lib/libispalg.so (sprd_afv1_process+1530)
    #04 pc 0002655b  /vendor/lib/libispalg.so (afctrl_ctrl_thr_proc+394)
    #05 pc 000022e7  /vendor/lib/libcamcommon.so (cmr_common_routine+114)
    #06 pc 00063a55  /system/lib/libc.so (__pthread_start(void*)+22)
    #07 pc 0001df55  /system/lib/libc.so (__start_thread+22)

 

直接定位行号:

toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-addr2line -e ~/armeabi-v7a/libspa.so 30e0

也可马反汇编出来具体看:
toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-objdump -d ~/armeabi-v7a/libspa.so --start-address=0x00001248 --stop-address=0x00003620

arm-linux-androideabi-objdump –S obj/local/armeabi/libhello-jni.so > hello.asm

以上两条命令都可以实现。

系统寄存器的dump信息.

  • rX( X=[0~9] ): 代表整数寄存器
  • dX( X=[0~31]): 是浮点指针寄存器
  • fp (or r11) : 指向当前正在执行的函数的堆栈底.
  • ip (or r12) : 一个寄存器, 我也没弄明白是干啥的.
  • sp (or r13) : 当前正在执行的函数的堆栈顶.(跟fp相对应)
  • lr (or r14) : link register . 简单来说, 当当前指令执行完了, 就会从这个寄存器获取地址, 来知道需要返回到哪里继续执行.
  • pc (or r15) : program counter. 存放下一条指令的地址.
  • cpsr : Current Program Status Register. 表示当前运行环境和状态的一些字节位.

    1. Crash dump还包含PC之前和之后的一些内存字段.
    2. 最后, 是崩溃时的调用堆栈. 如果你执行的是debug版本, 还能还原一些c++代码.

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值