常见的错误类型如下:
初始化错误
访问错误
数组索引访问越界
指针对象访问越界
访问空指针对象
访问无效指针对象
迭代器访问越界
内存泄露
参数错误
堆栈溢出
类型转换错误
数字除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. 表示当前运行环境和状态的一些字节位.
- Crash dump还包含PC之前和之后的一些内存字段.
- 最后, 是崩溃时的调用堆栈. 如果你执行的是debug版本, 还能还原一些c++代码.