当前位置: 首页 > news >正文

诊断Android系统原生代码Native崩溃问题

诊断Android系统原生代码Native崩溃问题

  • 诊断原生代码Native崩溃问题
    • Abort(中止操作)
    • Null空指针
  • Linux中32个信号及其含义

诊断原生代码Native崩溃问题

Abort(中止操作)

log信息signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr。代码中Abort中止操作为刻意为之。执行中止操作可通过多种不同的方法(包括调用 abort(3)、使 assert(3) 失败、使用 Android 特有的严重记录类型)来实现,所有方法都调用到 abort。abort 调用会向发起调用的线程发出 SIGABRT 信号,因此在log中,libc.so 中显示“abort”的帧,以及 SIGABRT 信号。
参考示例如下(部分日志):

pid: 4637, tid: 4637, name: crasher >>> crasher <<<
signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
Abort message: ‘some_file.c:123: some_function: assertion “false” failed’
r0 00000000 r1 0000121d r2 00000006 r3 00000008
r4 0000121d r5 0000121d r6 ffb44a1c r7 0000010c
r8 00000000 r9 00000000 r10 00000000 r11 00000000
ip ffb44c20 sp ffb44a08 lr eace2b0b pc eace2b16
backtrace:
#00 pc 0001cb16 /system/lib/libc.so (abort+57)
#01 pc 0001cd8f /system/lib/libc.so (__assert2+22)
#02 pc 00001531 /system/bin/crasher (do_action+764)
#03 pc 00002301 /system/bin/crasher (main+68)
#04 pc 0008a809 /system/lib/libc.so (__libc_init+48)
#05 pc 00001097 /system/bin/crasher (_start_main+38)
···中止相关代码信息省略

在log中一般会看到明确的中止信息,了解此线程在刻意终止自身之前所记录的内容。追踪Native调用栈,返回追查定位问题。
android系统native层代码中存在一些判断逻辑进行abort,不一定是native层的问题,可能存在上层App触发了错误的逻辑。

Null空指针

分为纯空指针和低地址空指针,log信息为signal 11 (SIGSEGV), code 1 (SEGV_MAPERR)
纯空指针引用示例如下:

pid: 25326, tid: 25326, name: crasher >>> crasher <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0
r0 00000000 r1 00000000 r2 00004c00 r3 00000000
r4 ab088071 r5 fff92b34 r6 00000002 r7 fff92b40
r8 00000000 r9 00000000 sl 00000000 fp fff92b2c
ip ab08cfc4 sp fff92a08 lr ab087a93 pc efb78988 cpsr 600d0030
backtrace:
#00 pc 00019988 /system/lib/libc.so (strlen+71)
#01 pc 00001a8f /system/xbin/crasher (strlen_null+22)
#02 pc 000017cd /system/xbin/crasher (do_action+948)
#03 pc 000020d5 /system/xbin/crasher (main+100)
#04 pc 000177a1 /system/lib/libc.so (__libc_init+48)
#05 pc 000010e4 /system/xbin/crasher (_start+96)

在上面示例中,尽管崩溃函数在 libc.so 内,但由于字符串函数仅在指定给它们的指针处进行操作,因此您可以推断出在调用 strlen(3) 时指定的是 Null 指针;对于这类崩溃问题,应直接找发起调用的代码的作者加以解决。在这种情况下,帧 #01 是不良调用程序。

*低地址 Null 空指针引用和更多信号奔溃问题详见:诊断原生代码崩溃问题。

Linux中32个信号及其含义

Arch Linux发行版中,有着arch/usr/include/asm/signal.h这样的头文件,定义Linux系统中信号类型。Linux中32个信号及其含义如下:

信号含义
#define SIGHUP 1终端挂起或控制进程终止
#define SIGINT 2终端中断(Ctrl+C 组合键)
#define SIGQUIT 3终端退出(Ctrl+\组合键)
#define SIGILL 4非法指令
#define SIGTRAP 5debug 使用,有断点指令产生
#define SIGABRT 6由 abort(3)发出的退出指令
#define SIGIOT 6IOT 指令
#define SIGBUS 7总线错误
#define SIGFPE 8浮点运算错误
#define SIGKILL 9杀死、终止进程
#define SIGUSR1 10用户自定义信号 1
#define SIGSEGV 11段违例(无效的内存段)
#define SIGUSR2 12用户自定义信号 2
#define SIGPIPE 13向非读管道写入数据
#define SIGALRM 14闹钟
#define SIGTERM 15软件终止
#define SIGSTKFLT 16栈异常
#define SIGCHLD 17子进程结束
#define SIGCONT 18进程继续
#define SIGSTOP 19停止进程的执行,只是暂停
#define SIGTSTP 20停止进程的运行(Ctrl+Z 组合键)
#define SIGTTIN 21后台进程需要从终端读取数据
#define SIGTTOU 22后台进程需要向终端写数据
#define SIGURG 23有"紧急"数据
#define SIGXCPU 24超过 CPU 资源限制
#define SIGXFSZ 25文件大小超额
#define SIGVTALRM 26虚拟时钟信号
#define SIGPROF 27时钟信号描述
#define SIGWINCH 28窗口大小改变
#define SIGIO 29可以进行输入/输出操作
#define SIGPOLLSIGIO
#define SIGPWR 30断点重启
#define SIGSYS 31非法的系统调用
#define SIGUNUSED 32未使用信号

参考博客:Linux中32个信号及其含义或Android native crash 信号量signal对应的含义。
32种信号同样适用于Android系统。

相关文章:

  • React中实现一键复制——五种办法
  • byName自动装配和byType自动装配
  • 【黑马Java笔记汇总】JavaSE+JavaWeb+SSM+Springboot笔记汇总
  • DRF 用户认证
  • 系统架构演变历史及集群、分布式、微服务、SOA的概念区别
  • 四、RocketMq本地集群搭建
  • 金仓数据库 KingbaseES 插件参考手册 xml2
  • FITC-PEG-SH/Fluorescent-PEG-SH 多种分子量可选/荧光素聚乙二醇巯基 FITC-PEG-SH
  • 常用hooks用法总结
  • 赛默飞世尔Thermo Fisher仪器电路板维修故障概述
  • 对于生物素-PEG32-NHS 酯,Biotin-PEG32-NHS ester物理性质大家了解多少了?
  • 关于神经网络的正确说法,神经网络通俗的解释是
  • python带你采集桌游、剧本杀游戏店数据信息~
  • sd卡数据丢失的原因有哪些?常见的sd卡数据丢失原因及恢复方法
  • 深度神经网络的训练过程
  • hexo+github搭建个人博客
  • python3.6+scrapy+mysql 爬虫实战
  • angular组件开发
  • Codepen 每日精选(2018-3-25)
  • ES6--对象的扩展
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • Lucene解析 - 基本概念
  • nfs客户端进程变D,延伸linux的lock
  • nodejs实现webservice问题总结
  • Phpstorm怎样批量删除空行?
  • 初识 webpack
  • 开源SQL-on-Hadoop系统一览
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 前端临床手札——文件上传
  • 嵌入式文件系统
  • 如何选择开源的机器学习框架?
  • 怎么把视频里的音乐提取出来
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • #1015 : KMP算法
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (九)One-Wire总线-DS18B20
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (一)80c52学习之旅-起始篇
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • (轉)JSON.stringify 语法实例讲解
  • ***详解账号泄露:全球约1亿用户已泄露
  • **PHP分步表单提交思路(分页表单提交)
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .net 按比例显示图片的缩略图
  • .NET大文件上传知识整理
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • .net与java建立WebService再互相调用