Linux/Android系统开发 利用addr2line工具定位错误

Windows系统+Android环境:

        在Android真机开发时经常遇到crash错误,现crash_log中的内容如下:

----- timezone:GMT
10-26 10:32:19.299460  2022 12829 F libc    : Fatal signal 11 (SIGSEGV), code 1, fault addr 0xb657f754 in tid 12829 (com.test.demo)
10-26 10:32:19.391742 12836 12836 I AEE_AED : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
10-26 10:32:19.391989 12836 12836 I AEE_AED : Build fingerprint: 'alps/full_joyasz8735b_3tb_n/joyasz8735b_3tb_n:7.0/NRD90M/1539150817:userdebug/dev-keys'
10-26 10:32:19.392084 12836 12836 I AEE_AED : Revision: '0'
10-26 10:32:19.392162 12836 12836 I AEE_AED : ABI: 'arm'
10-26 10:32:19.392454 12836 12836 I AEE_AED : pid: 2022, tid: 12829, name: com.test.demo  >>> com.test.demo <<<
10-26 10:32:19.392570 12836 12836 I AEE_AED : signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xb657f754
10-26 10:32:19.392650 12836 12836 I AEE_AED :     r0 00000000  r1 1ffffffc  r2 00000000  r3 0000001f
10-26 10:32:19.392733 12836 12836 I AEE_AED :     r4 9657f758  r5 00000000  r6 0000ffff  r7 97e715d2
10-26 10:32:19.392785 12836 12836 I AEE_AED :     r8 97e65698  r9 97e36824  sl 00000001  fp 9657f8f8
10-26 10:32:19.392835 12836 12836 I AEE_AED :     ip 00000000  sp 9657f6f0  lr 97e27cc8  pc 97e27ce0  cpsr 40010010
10-26 10:32:19.402208 12836 12836 I AEE_AED : 
10-26 10:32:19.402208 12836 12836 I AEE_AED : backtrace:
10-26 10:32:19.402367 12836 12836 I AEE_AED :     #00 pc 00008ce0  /data/app/com.test.demo-1/lib/arm/libdemo.so (_Z11demo_taskv+428)
10-26 10:32:19.402543 12836 12836 I AEE_AED :     #01 pc 000057fc  /data/app/com.test.demo-1/lib/arm/libdemo.so (_Z14pthread_demoPv+8)
10-26 10:32:19.402705 12836 12836 I AEE_AED :     #02 pc 00047fa3  /system/lib/libc.so (_ZL15__pthread_startPv+22)
10-26 10:32:19.402829 12836 12836 I AEE_AED :     #03 pc 00019a0d  /system/lib/libc.so (__start_thread+6)

        其中“pid: 2022, tid: 12829, name: com.test.demo  >>> com.test.demo <<<”可以确认错误发生在哪个线程(主线程or子线程)中,判断依据是:若pid等于tid,问题出在主线程;若pid不等于tid,问题出在子线程。

        backtrace后面的内容可以追踪错误,#00 --> #03显示的是程序的执行流程,但要注意的是执行顺序是从下往上的,即实际执行顺序为#03 --> #00。

        接下来就可以使用addr2line工具了,用法如下:

        addr2line -e -f xxx.so addr

        -e 输出错误代码行数和文件路径

        -f 输出函数名

        xxx.so 对应出错的so文件

        addr 是具体的地址

       在windows下打开cmd,输入指令addr2line -e -f xxx.so addr,会提示“addr2line 不是内部或外部命令......”等信息,找到NDK的安装路径,我的是C:\android-ndk-r14b\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin\,在该目录下找到arm-linux-androideabi-addr2line.exe,重新在cmd窗口输入指令C:\android-ndk-r14b\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin\arm-linux-androideabi-addr2line.exe  -e -f xxx.so addr,回车,会输出错误定位,然后就可以进一步分析错误原因了。

Linux系统:

       如果在linux下开发程序时,经常遇到Segmentation fault的错误信息也可以用该指令定位错误位置,先使用addr2line --version查看是否安装该工具,如果没有,可以使用路径prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi-addr2line下的,使用指令与windows下相同。

       Linux下的操作如仍有疑问可参见网址:https://jingyan.baidu.com/article/6525d4b1596f69ac7d2e94e1.html
 

      

猜你喜欢

转载自blog.csdn.net/weixin_40779546/article/details/83417004