出现问题

Android在开发native层代码是时很容易报 signal 11 (SIGSEGV) 错误,这种问题单看报错日志是很难定位到问题的。比如如下错误是我在开发过程中遇到的,Android Studio也不知道抽什么风断点调试也不能用,好在之前听说过 addr2line 这个工具,但一直没有用过,没办法只好用这个工具试试。

2022-06-21 15:38:00.197 27730-27790/com.jk.superplayer A/libc: Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x720064 in tid 27790 (Thread-3), pid 27730 (.jk.superplayer)
2022-06-21 15:38:00.262 27798-27798/? A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
2022-06-21 15:38:00.262 27798-27798/? A/DEBUG: Build fingerprint: 'xiaomi/lavender/lavender:10/QKQ1.190910.002/V12.0.2.0.QFGCNXM:user/release-keys'
2022-06-21 15:38:00.262 27798-27798/? A/DEBUG: Revision: '0'
2022-06-21 15:38:00.262 27798-27798/? A/DEBUG: ABI: 'arm'
2022-06-21 15:38:00.262 27798-27798/? A/DEBUG: Timestamp: 2022-06-21 15:38:00+0800
2022-06-21 15:38:00.262 27798-27798/? A/DEBUG: pid: 27730, tid: 27790, name: Thread-3  >>> com.jk.superplayer <<<
2022-06-21 15:38:00.262 27798-27798/? A/DEBUG: uid: 10731
2022-06-21 15:38:00.262 27798-27798/? A/DEBUG: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x720064
2022-06-21 15:38:00.262 27798-27798/? A/DEBUG:     r0  c2e0d400  r1  000002d0  r2  00000500  r3  00000b40
2022-06-21 15:38:00.262 27798-27798/? A/DEBUG:     r4  c370b1e4  r5  0000001a  r6  c370b230  r7  c370b200
2022-06-21 15:38:00.262 27798-27798/? A/DEBUG:     r8  eec83a50  r9  00006c8c  r10 c370b230  r11 00101000
2022-06-21 15:38:00.262 27798-27798/? A/DEBUG:     ip  00720065  sp  c370b190  lr  c39ec9a9  pc  00720064
2022-06-21 15:38:00.264 27798-27798/? A/DEBUG: backtrace:
2022-06-21 15:38:00.264 27798-27798/? A/DEBUG:       #00 pc 00720064  <unknown>
2022-06-21 15:38:00.264 27798-27798/? A/DEBUG:       #01 pc 000db9a7  /data/app/com.jk.superplayer-HfkpzCWGDpsnFPAOI22SdQ==/lib/arm/libsuperplayer.so (VideoChannel::video_play()+258) (BuildId: fcf1af443c8cfbc511f044fbfb24f53015c0d2dd)
2022-06-21 15:38:00.264 27798-27798/? A/DEBUG:       #02 pc 000db89b  /data/app/com.jk.superplayer-HfkpzCWGDpsnFPAOI22SdQ==/lib/arm/libsuperplayer.so (task_video_play(void*)+14) (BuildId: fcf1af443c8cfbc511f044fbfb24f53015c0d2dd)
2022-06-21 15:38:00.265 27798-27798/? A/DEBUG:       #03 pc 000ab98b  /apex/com.android.runtime/lib/bionic/libc.so (__pthread_start(void*)+20) (BuildId: 7103c0ea4dad751f797aed4598de945f)
2022-06-21 15:38:00.265 27798-27798/? A/DEBUG:       #04 pc 000629b3  /apex/com.android.runtime/lib/bionic/libc.so (__start_thread+30) (BuildId: 7103c0ea4dad751f797aed4598de945f)

addr2line

addr2line命令来自于英文词组”address to line“的缩写,其功能是将函数地址解析成文件名或行号的工具。给出一个可执行文件中的地址或一个可重定位对象中的偏移部分的地址,使用调试信息来找出与之相关的文件名和行号。

语法格式

addr2line [参数] [地址]

常用参数:

参数 作用
-a 在函数名、文件和行号信息之前,显示地址,以十六进制形式
-b 指定目标文件的格式为bfdname
-e 指定需要转换地址的可执行文件名
-j 给出的地址代表指定section偏移,而非绝对地址
-C 将低级别的符号名解码为用户级别的名字
-f 在显示文件名、行号的同时显示函数名信息
-p 每一个地址的信息占一行

addr2line使用步骤

第一步:

addr2line使用步骤在ndk目录中,根据设备abi找到对应目录,由于我的设备是arm架构就到arm-linux-androideabi-4.9文件夹下,比如:E:\Users\Aimee\AppData\Local\Android\Sdk\ndk\21.4.7075529\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin,并在此目录下打开命令行窗口。

第二步:

查看报错日志确定发生crash的so,并找到其路径,可以到Android Studio编译的build目录中寻找,比如:build/intermediates/cmake/debug/obj/armeabi-v7a/

第三步:

接下来就是日志分析,可以看backtrace,下面有crash时的调用栈信息

#01 pc 000db9a7  /data/app/com.jk.superplayer-HfkpzCWGDpsnFPAOI22SdQ==/lib/arm/libsuperplayer.so (VideoChannel::video_play()+258) (BuildId: fcf1af443c8cfbc511f044fbfb24f53015c0d2dd)

可以看出是VideoChannel类的video_play方法报错的,但具体是哪一行报错就不知道了,这时我用就可以找到偏移地址(000db9a7)通过addr2line定位到具体行号,在命令行输入以下命令:

$ ./arm-linux-androideabi-addr2line.exe -f -C -e /f/as_project/SuperPlayer/app/build/intermediates/cmake/debug/obj/armeabi-v7a/libsuperplayer.so 000db9a7

命令输出结果如下:

定位错误

根据以上命令确定了错误在VideoChannel.cpp的111行,分析代码找到问题,原来是因为调用的函数指针没有初始化。解决native问题报错太麻烦了,不像java代码出错打印的日志可以直接定位到错误。

Android使用addr2line定位native崩溃堆栈相关推荐

  1. android imageview图片崩溃,android - setImageResource导致应用程序崩溃 - 堆栈内存溢出...

    我试图做一个按钮,当单击它时会从一组卡中选择一个随机卡,并将其显示到ImageView中. 为此,我为它们的值和ID(可绘制的图像卡名称)提供了一个Card类. public class Carte ...

  2. Unity移动应用如何在Bugly上查看崩溃堆栈

    文章目录 一.使用Bugly对移动应用进行崩溃监控 二.崩溃类型 1.Java崩溃 2.Native崩溃 三.Bugly上传符号表解析崩溃堆栈 1.关于符号表 2.上传符号表 3.Native崩溃堆栈 ...

  3. Android APP native 崩溃分析之 linker SIGBUS 崩溃

    原文地址:https://caikelun.io/post/2019-05-31-android-app-native-crash-linker-sigbus/ 这是 Android APP nati ...

  4. NDK撩妹三部曲(四)—NDK 开发如何优雅的定位 Native 异常,看这篇就够了

    NDK 开发如何优雅的定位 Native 异常,看这篇就够了 从何说起? 摘要 案例实操 aaddr2line objdump ndk-stack 1.假设我们已经通过 adb logcat 拿到了程 ...

  5. Android系统调试-程序崩溃调试

    Android系统对于Native(C/C++)应用程序的调试手段比单纯的linux系统coredump文件与gdb结合调试的手段.但是Android系统的天然不支持这种调试方式,其在内核中就没有启用 ...

  6. Android 高质量开发之崩溃优化,kotlinnativerust跨端

    一.崩溃 崩溃率是衡量一个应用质量高低的基本指标,那么,该怎样客观地衡量崩溃这个指标,以及又该如何看待和崩溃相关的稳定性.Android 的两种崩溃: Java 崩溃 Native 崩溃 简单来说,J ...

  7. Android 高质量开发之崩溃优化,kotlin协程跟线程

    1.3 应用退出 除了常见的崩溃,还有一些会导致应用异常退出的情况,例如: 主动自杀.Process.killProcess().exit() 等 崩溃.出现了 Java 或 Native 崩溃 系统 ...

  8. Android 高质量开发之崩溃优化,kotlin匿名内部类

    崩溃率是不是就能完全等价于应用的稳定性呢?答案是肯定不行.处理了崩溃,我们还会经常遇到 ANR(Application Not Responding,程序没有响应)这个问题.出现 ANR 的时候,系统 ...

  9. Android 高质量开发之崩溃优化,2020-2021字节跳动Android面试真题解析

    除了常见的崩溃,还有一些会导致应用异常退出的情况,例如: 主动自杀.Process.killProcess().exit() 等 崩溃.出现了 Java 或 Native 崩溃 系统重启.系统出现异常 ...

最新文章

  1. 「摸鱼」神器来了,Python 实现人脸监测制作神器
  2. **CI两种方式查询所返回的结果数量
  3. java extends原则_Java泛型extends及super区别实例解析
  4. LINUX 文件夹打包
  5. 关于常量池的一些整理
  6. 华为MateBook14s更换固态(系统无缝衔接,等价于官方镜像)
  7. mongodb基本数据类型
  8. JAVA 实现《推箱子》游戏
  9. 数据分析之EXCL筛选多列相同的数据(满足多列条件的数据)进行处理
  10. 教程:在C#中创建带有表格、图表、图片的PPT演示文稿
  11. Excel技巧:如何绘制一份优秀的甘特图(项目管理)
  12. NOI / 1.5编程基础之循环控制——02:财务管理
  13. 使用Guardium大数据智能解决方案释放Guardium数据的价值
  14. 英勇青铜5基金个人策略
  15. PAID Network攻击事件分析 | 零时科技
  16. android获取定位并标点,Android Studio 中实现高德定位并获取相应信息
  17. Ubuntu系统下利用anaconda创建虚拟环境
  18. java多态的理解(java多态的理解和使用 - 阿猫阿狗)
  19. 揭秘华为AI布局:为什么生态和平台这么重要?
  20. 供应链管理系统--(6)供应商商品管理

热门文章

  1. 一二, Spark概述和快速入门
  2. 数据窗口Pageup与Pagedown翻页
  3. 日志显示格式%d{yyyy/MM/dd-HH:mm:ss} [%thread] %-5level %logger- %msg%n
  4. 笔记本做wifi热点
  5. 匿名函数 和 拉姆达表达式
  6. Pytorch中的Conv1d()和Conv2d()函数
  7. android自动唤醒屏幕软件下载,抬手唤醒软件下载-抬手唤醒安卓版下载V1.6手机版-西西软件下载...
  8. 手游扫码登录神器教程
  9. 计算机网络体系结构-网络管理
  10. Linux之ant安装部署