简介:Android Native crash 处理案例分享

1. 背景

目前 mPaas[1] Android使用Crash SDK对闪退进行的处理,CrashSDK 是 Android 平台上一款功能强大的崩溃日志收集 SDK,有着极高的崩溃收集率和完整、全面的崩溃日志信息,生成的日志内容非常利于问题的跟进和解决。在日常运维中,经常遇到一些闪退,无法直接从闪退堆栈找到原因,尤其是一些非Java的Native的闪退,这里分享下在mPaas框架下怎么使用Crash SDK分析闪退。

2. 闪退报文分析工具介绍

对于mPaas的用户,从MAS上闪退分析平台导出的一般是原始的闪退信息,闪退信息比较多,如果直接阅读会比较困难,使用者可以通过下载Chrome的插件LogAnalyzer,LogAnalyzer会将Crash SDK生成的日志文本内容转化成可视效果较强的 HTML 页面展现,功能强大,主要包含:
1) 高亮显示日志中重点信息,并使用不同颜色区分;
2) 支持日志内容整体结构预览,快速定位重点内容;
3) 常见崩溃原因提醒;
安装好chrome插件后,仍需以下配置:

1. 修改闪退文件后缀为 .txt

由于MAS默认下载的文件后缀是.dat,需改为.txt,否则 LogAnalyzer 无法识别。

2. 修改插件配置

由于 Chrome 默认权限限制,任何 Chrome 插件均默认无法访问文件网址,需要在 Chrome 插件中进行如下操作。
1) 打开 Chrome 插件管理页面 chrome://extensions/
2) 找到 LogAnalyzer 插件,点击 “详细信息" 进入设置:

3) 勾选“允许访问文件网址”选项
4) 打开或者刷新日志页面,LogAnalyzer 便可生效。

3. 生效效果

把日志文件直接拖到chrome后,可以看到右边插件生效后,可以通过不同颜色显示闪退信息的各个字段
首次打开后的使用说明如下:

正常查看闪退截图如下:

3. 闪退分析举例

我们经常在日常运维中遇到一些非Java的Native模块闪退,比如UC。其实很多场景下,闪退的根因并不是UC,只是最后的闪退点在UC。以日常运维高频的UC内核的闪退为例,对一些案例的处理分享如下。

1. java空指针导致UC闪退

在闪退点上可以看到以下闪退信息(已经隐藏客户apk相关信息),暂无任何线索,继续查看日志。

查看logcat节点信息时,首先看到关键字:begin to generate native report, 表示当前是闪退日志上报的日志,在往前看,logcat节点里打印了异常堆栈信息,从堆栈信息可以看到,由于precreate操作触发了底层的空指针,从而导致初始化异常,触发了闪退。解决方案为临时关闭预创建,从而规避闪退。

从上面的案例可以看出,
1) Native的闪退原因不一定是Native模块,有可能是java异常导致的。
2) begin to generate native report 附近可以查看闪退相关的logcat信息,协助定位闪退的上下文日志。

2. 上层OOM导致UC闪退

首先,查看上报的闪退点的日志,如下图所示,闪退在RenderThread里,毫无头绪。

其次,在logcat节点里查找begin to generate native report上报节点,可以看到大量的底层OOM的异常日志,基本确定是OOM的原因了,继续查找OOM的触发源头。

点击闪退里的内存节点,基本原因就比较清晰了,当前手机的vmsize基本已经到最大了,我们知道对于 32 位的进程,APP 可使用的 VmSize 最大为 3GB,不过当运行在 64 位 CPU 上时,VmSize 最大可超过 3GB,接近 4GB。但是由于内核需要占据一部分,以及不同的ROM版本的差别,有以下规律:android 8.1.0 及之后的系统,大部分 native oom crash 发生时 vmSize 分布在 3.5 - 3.9 G 的位置,相对较为集中。下面讲解下如何解决OOM。

3. FD误关导致UC闪退

日志如下图所示,我大概只能看出SIGILL有可能是主动崩溃,崩溃ILL_ILLOPC表示非法操作。

然后我们继续看logcat节点的begin to generate native report, 基本确认原因是为uc使用的FD对象被其他程序关闭。

随后UC提供了带FDscan的工具包,通过我们复现后发现,是由于UC调用shouldIntercept回调的输入流对象被其他模块close掉了,导致UC使用的时候发现FD对象已经被关闭,从而做了崩溃处理。最后的处理方案就变成了用户解决其他模块的误关FD的问题。

4. 总结

综合以上的case分析,在遇到Native模块闪退的时候,一般如果从直接的闪退堆栈看不出原因的时候,不要心急,可以搜索begin to generate native report 找到崩溃上下文,多看看logcat闪退上下文的日志,会有一些收获,同时对于oom类型的问题,可以结合当前内存统计来看。

我们是阿里云智能全球技术服务-SRE团队,我们致力成为一个以技术为基础、面向服务、保障业务系统高可用的工程师团队;提供专业、体系化的SRE服务,帮助广大客户更好地使用云、基于云构建更加稳定可靠的业务系统,提升业务稳定性。我们期望能够分享更多帮助企业客户上云、用好云,让客户云上业务运行更加稳定可靠的技术。

原文链接:https://developer.aliyun.com/article/781273?

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

Android Native crash 处理案例分享相关推荐

  1. Android native crash解析

    当某个进程发生crash时会出现下面的错误日志,它可能出现在logcat日志或者/data/tombstones目录下的tombstone文件中 --------- beginning of cras ...

  2. 基于友盟+U-APM解决客户小姐姐Android Native Crash问题,小姐姐说我真棒,要把她闺蜜介绍给我

    文章目录 一.遇到问题 二.Native日志分析 三.信号量(signal) 和 错误码(code)分析 四.PC指针addr2line定位 4.1 addr2line路径 4.2 so路径 4.3 ...

  3. Android Native Crash崩溃及错误原因分析二-实战解决

    一. 简述 之前有一篇文章讲诉了Android实际开发过程中一些崩溃的原因,以及对崩溃类型做了详细的介绍,简单回顾一下:Crash类型:Java和Native,JavaCrash中明显会打印出Andr ...

  4. android native crash的处理机制

    拦截所有信号 Linux信号机制 1.程序奔溃在Unix-like系统中,所有的崩溃都是编程错误或者硬件错误相关的,系统遇到不可恢复的错误时会触发崩溃机制让程序退出,如除零.段地址错误等.异常发生时, ...

  5. Android APP加固混淆案例分享(解决风险提示问题)

    由于第一次用 AI2 开发安卓应用程序,第一次发现有编程入门不拿 Hello world 招呼人的,很是意外,也令人欣慰.随手撸了几个 Demo ,打包,下载,安装到手机,发现居然有风险提示. 若应用 ...

  6. android 中断处理流程,Android P的native crash处理流程

    一.概述 Android系统有监控程序异常退出的机制,这便是本文要讲述得debuggerd守护进程.当发生native crash或者主动调用debuggerd时,会输出进程相关的状态信息到文件或者控 ...

  7. android crash分析工具,Android Crash之Native Crash分析

    前言 上一篇给大家介绍了Android Crash中的Java Crash分析,我们可以知道Java Crash一般会弹出提示框告诉我们程序崩溃了,通常使用Crash工具都能够捕获到:本篇博客来谈谈如 ...

  8. Android Native程序crash的一些定位方法简介

    Android Native程序crash的一些定位方法简介 经常,避免不了,我们的代码会崩溃.如果crash在native代码上,Android会和其他Linux一样,生成一份core dump,将 ...

  9. 当Android发生Native Crash时,Coredump能为我们带来什么信息?

    ​更多内核安全.eBPF分析和实践文章,请关注博客和公众号: CSDN博客:内核功守道 公众号: 内核功守道 1.概述 1.1 Coredump形成原因 1.2 Coredump的作用 2.使能Cor ...

最新文章

  1. CVPR 2021 | 基于稠密场景匹配的相机定位学习
  2. 【机器学习实战】第7章 集成方法(随机森林和 AdaBoost)
  3. 使用request实现网站中的注册功能
  4. gitlab windows安装_gitlab pages之gitlab-runner 安装(windows)
  5. DBA日常工作内容和职责
  6. input type='file' 上传文件时显示文件名及上传进度
  7. syscall 系统调用陷入_系统调用深度剖析(上)
  8. 输出100以内的所有素数
  9. python利用公式计算_python如何利用公式计算π
  10. 华为云获TFC“年度最佳云服务商”金苹果奖
  11. Hibernate:DisjunctionConjunction构造复杂的查询条件.
  12. Python对电影Top250并进行数据分析
  13. Phonics 自然拼读法 S A T I P N Teacher:Lamb
  14. 产品经理的工作职责是什么,需要具备什么能力?
  15. 别过来,过来我就撕票了!
  16. EDG为何刷爆你的朋友圈?是什么让年轻人那么激动?作为程序员你关注了么?
  17. 从零开始学信号完整性(SIPI)--3 SI面临的挑战以及基于SI的设计方法
  18. 单片机I/O的常用驱动与隔离电路的设计
  19. 时间管理课程笔记【待更】
  20. 银联将启用双免交易白名单核验功能 移机或无法定位的POS要关停

热门文章

  1. 利用Conda尝鲜Python 3.10
  2. python企业级框架_Python六大开源框架对比:Web2py略胜一筹
  3. linux内核_查看Linux内核版本
  4. ni软件可以卸载吗_黑科技 | 2020全新AI人工智能修图汉化版软件!这下可以放心卸载PS啦!...
  5. ubuntu18.04安装gcc7.3.0g++7.3.0
  6. 组件 DataList 和 ObjectDataSource
  7. python315题的漫漫通关之路
  8. [源码和文档分享]C语言实现的基于Huffman哈夫曼编码的数据压缩与解压缩
  9. 线程与进程的一些应用
  10. Python Day11