问题描述
APP在执行NDK代码时,突然闪退,控制台只看到一行
Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x********
查看完整错误日志
并非是没有错误日志,而是Fatal Signal属于严重错误,它的错误记录是由操作系统统一处理的,不属于当前进程
所以当我们勾选【Select only selected application】时,只显示当前进程,被过滤了而已,切换到【No Filters】之后,就能正常显示了
日志格式分析 在错误日志里,我们能大致看到以下信息
崩溃进程,崩溃线程,崩溃原因,崩溃so库,崩溃方法,崩溃位置,指令地址
其中最重要的,崩溃方法和位置,和我们正常看到的格式不太一样
这是因为,这个方法名和报错位置,是经过编译器编译之后的名称
我们需要解编译,才能知道代码的正确位置
解编译,定位源码位置
Addr2line这个工具,就可以帮助我们完成这项工作,它是NDK工具链的一部分
它的功能就是通过编译后的指令地址,定位源码的代码位置
Addr2line使用方法
在NDK目录中找到工具
ndk\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin>arm-linux-androideabi-addr2line
在项目中的libs文件夹,或者编译目录下,搜到使用的so库
打开cmd,执行以下指令
addr2line完整路径 -C -f -e so库完整路径 指令地址(可以多个,空格隔开)
显示结果如下,得到了源码中的报错位置
/home/easing/ffmpeg-4.3.1/libavcodec/h264_cabac.c:1386
使用简化
由于这个工具我们会经常使用,每次都要记住指令,和输入完整路径,是非常麻烦的
我们可以把addr2line和so库都拷到桌面,直接写一个bat自动执行就行了,命令如下
title Addr2Line addr2line -C -f -e abc.so 006fafec pause
Addr2Line工具独立版
这个是简化后的工具,解压后替换下自己的so库,修改下bat里面的地址就能使用了
Addr2Line so库源码定位工具 https://download.csdn.net/download/u013718730/20233776