您当前的位置: 首页 > 

命运之手

暂无认证

  • 1浏览

    0关注

    747博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【NDK】【023】NDK崩溃定位终极方案

命运之手 发布时间:2021-07-13 10:41:53 ,浏览量:1

问题描述

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

关注
打赏
1654938663
查看更多评论
立即登录/注册

微信扫码登录

0.0386s