Android 开发高手课
张绍文
前微信高级工程师,Tinker 负责人
52721 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 62 讲
导读 (1讲)
模块一 高质量开发 (25讲)
Android 开发高手课
15
15
1.0x
00:00/00:00
登录|注册

02 | 崩溃优化(下):应用崩溃了,你应该如何去分析?

尝试复现
查找共性
确定重点
应用信息
资源信息
内存信息
系统信息
崩溃信息
疑难问题:系统崩溃
崩溃分析
崩溃现场
课后作业
总结
应用崩溃了,你应该如何去分析?
崩溃优化

该思维导图由 AI 生成,仅供参考

在侦探漫画《名侦探柯南》中,无论柯南走到哪里都会遇到新的“案件”,这也很像程序员的“日常”,我们每天工作也会遇到各种各样的疑难问题,“崩溃”就是其中比较常见的一种问题。
解决崩溃跟破案一样需要经验,我们分析的问题越多越熟练,定位问题就会越快越准。当然这里也有很多套路,比如对于“案发现场”我们应该留意哪些信息?怎样找到更多的“证人”和“线索”?“侦查案件”的一般流程是什么?对不同类型的“案件”分别应该使用什么样的调查方式?
“真相永远只有一个”,崩溃也并不可怕。通过今天的学习,希望你能成为代码届的名侦探柯南。

崩溃现场

崩溃现场是我们的“第一案发现场”,它保留着很多有价值的线索。在这里我们挖掘到的信息越多,下一步分析的方向就越清晰,而不是去靠盲目猜测。
操作系统是整个崩溃过程的“旁观者”,也是我们最重要的“证人”。一个好的崩溃捕获工具知道应该采集哪些系统信息,也知道在什么场景要深入挖掘哪些内容,从而可以更好地帮助我们解决问题。
接下来我们具体来看看在崩溃现场应该采集哪些信息。
1. 崩溃信息
从崩溃的基本信息,我们可以对崩溃有初步的判断。
进程名、线程名。崩溃的进程是前台进程还是后台进程,崩溃是不是发生在 UI 线程。
崩溃堆栈和类型。崩溃是属于 Java 崩溃、Native 崩溃,还是 ANR,对于不同类型的崩溃我们关注的点也不太一样。特别需要看崩溃堆栈的栈顶,看具体崩溃在系统的代码,还是我们自己的代码里面。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文以侦探漫画《名侦探柯南》为比喻,将程序员解决应用崩溃问题比作侦探破案,强调解决崩溃问题需要经验和技巧。文章详细介绍了崩溃现场的重要性,以及在崩溃现场应该采集的信息,包括崩溃信息、系统信息、内存信息、资源信息和应用信息。强调了不同类型的崩溃需要关注不同的信息,而一个好的崩溃捕获工具能够根据场景为我们采集足够多的信息,让我们有更多的线索去分析和定位问题。文章内容丰富,对于解决应用崩溃问题有很大的帮助。文章还介绍了崩溃分析的三部曲:确定重点、查找共性和尝试复现。在解决疑难问题时,作者强调了耐心和细心地分析,总能敏锐地发现一些异常或关键点,并且还要敢于怀疑和验证。此外,文章还提到了系统崩溃的解决思路,包括查找可能的原因、尝试规避和Hook解决。最后,作者强调了崩溃攻防是一个长期的过程,需要提前预防崩溃的发生,将其消灭在萌芽阶段。整体而言,本文为读者提供了丰富的崩溃分析方法、特殊技巧以及疑难和常见问题的解决方法,对于解决应用崩溃问题具有很高的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Android 开发高手课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(100)

  • 最新
  • 精选
  • 沐风
    置顶
    疑难杂症的解决确实能够带来难以比拟的兴奋和荣耀感,但付出的精力可能也不亚于一次需求开发的周期。其实大部分问题的根源都在于前期开发过程的不规范编码导致,如果能够从技术方案选型->编码时静态检查->编码后review->测试&灰度问题解决,很多问题都能扼杀在摇篮里了。 这里推荐一篇早期 gityuan 大佬解决崩溃问题的案例文章,对于解决问题的基本流程和思路应该有一定帮助:http://gityuan.com/2018/02/03/log-fc/
    2023-03-07归属地:美国
    1
  • 张绍文
    置顶
    补充一下获得logcat和Jave堆栈的方法: 一. 获取logcat logcat日志流程是这样的,应用层 --> liblog.so --> logd,底层使用ring buffer来存储数据。 获取的方式有以下三种: 1. 通过logcat命令获取。 优点:非常简单,兼容性好。 缺点:整个链路比较长,可控性差,失败率高,特别是堆破坏或者堆内存不足时,基本会失败。 2. hook liblog.so实现。通过hook liblog.so 中__android_log_buf_write 方法,将内容重定向到自己的buffer中。 优点:简单,兼容性相对还好。 缺点:要一直打开。 3. 自定义获取代码。通过移植底层获取logcat的实现,通过socket直接跟logd交互。 优点:比较灵活,预先分配好资源,成功率也比较高。 缺点:实现非常复杂 二. 获取Java 堆栈 native崩溃时,通过unwind只能拿到Native堆栈。我们希望可以拿到当时各个线程的Java堆栈 1. Thread.getAllStackTraces()。 优点:简单,兼容性好。 缺点: a. 成功率不高,依靠系统接口在极端情况也会失败。 b. 7.0之后这个接口是没有主线程堆栈。 c. 使用Java层的接口需要暂停线程 2. hook libart.so。通过hook ThreadList和Thread的函数,获得跟ANR一样的堆栈。为了稳定性,我们会在fork子进程执行。 优点:信息很全,基本跟ANR的日志一样,有native线程状态,锁信息等等。 缺点:黑科技的兼容性问题,失败时可以用Thread.getAllStackTraces()兜底 获取Java堆栈的方法还可以用在卡顿时,因为使用fork进程,所以可以做到完全不卡主进程。这块我们在后面会详细的去讲。
    2018-12-04
    2
    102
  • 小龙虾
    老师可能还不了解学生的水平,读者都是做应用层程序的你讲这么深入恐怕没什么效果

    作者回复: 不会的,移动开发已经十年了,已经不是单独写个界面就可以了。应用层开发当你深入到后面,这些知识都是必须的。当你知道了更多,学习的更多深入的时候,你才能做一些别人做不了的东西。

    2018-12-04
    2
    73
  • arvinljw
    张老师好,我想问一下,感觉学习这些课有点理解不了,不知道为什么,应该怎么入手呢?

    作者回复: 坚持,可能跟着学习完整个课程再回头看会有不一样的感觉

    2018-12-04
    17
  • mzh
    之前遇到过一个输入法的内存泄露,但是自己完全没有调用过输入法,后面查了一下 网上说是系统的一个bug 张老师 这种应该怎么解决呢?

    作者回复: 那个问题很经典,解决方法就是反射将输入法的两个view置空

    2018-12-06
    14
  • O_o
    感觉可以由浅入深的讲,这一脚下去有点深呀,可能很多人3,4年经验,没做过这方面,学完了这一章一脸蒙圈,也没太大帮助呀

    作者回复: 一脸懵逼没有关系,我们可以跟着文中提到的一些文件,去学习到linux的一些基础知识。这些文件记录了一些什么样的内容,对排查问题有什么帮助,怎么在应用获取它们。 后面的内容会从浅入深,我们学习完整个专栏再回头看应该有不同的感觉

    2018-12-05
    10
  • Kenny
    张老师,看到你解决一些棘手的崩溃,会去翻看源码,然后对比版本的差异,然后寻找hook点去解决,这个要考虑机型适配吧?毕竟国产机型rom差异化严重。

    作者回复: Hook的时候,前几个版本一般会把hook失败的机型 rom 堆栈传上来做进一步分析。top的机型也会保证可以兼容

    2018-12-04
    6
  • jason
    TimeoutException 直接调用stop存在什么安全问题?请大神指教一二。

    作者回复: Stop的时候有一定概率导致即使没有超时也会报timeoutexception

    2018-12-04
    2
  • Wilson
    pthread_create (1040KB stack) failed: Out of memory老师这个有没有好的解决方法?

    作者回复: 可以把线程和句柄 dump出来,看看是哪里出了问题

    2019-06-05
    2
    1
  • Geek_Yasin28
    请问有没有native崩溃后成功获取java堆栈的例子, 是只能用hook libart.so实现吗? 这边参考实现了native崩溃获取, 但是在native崩溃时, 信号处理函数去唤醒之前等待的线程,去回调java或者抛出异常给java处理都没有反应。

    作者回复: 一般情况下直接jni调用也是可以拿到的,除了一些特殊情况

    2019-03-14
    1
收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部