02 | 崩溃优化(下):应用崩溃了,你应该如何去分析?
该思维导图由 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-042102
- 小龙虾老师可能还不了解学生的水平,读者都是做应用层程序的你讲这么深入恐怕没什么效果
作者回复: 不会的,移动开发已经十年了,已经不是单独写个界面就可以了。应用层开发当你深入到后面,这些知识都是必须的。当你知道了更多,学习的更多深入的时候,你才能做一些别人做不了的东西。
2018-12-04273 - arvinljw张老师好,我想问一下,感觉学习这些课有点理解不了,不知道为什么,应该怎么入手呢?
作者回复: 坚持,可能跟着学习完整个课程再回头看会有不一样的感觉
2018-12-0417 - mzh之前遇到过一个输入法的内存泄露,但是自己完全没有调用过输入法,后面查了一下 网上说是系统的一个bug 张老师 这种应该怎么解决呢?
作者回复: 那个问题很经典,解决方法就是反射将输入法的两个view置空
2018-12-0614 - O_o感觉可以由浅入深的讲,这一脚下去有点深呀,可能很多人3,4年经验,没做过这方面,学完了这一章一脸蒙圈,也没太大帮助呀
作者回复: 一脸懵逼没有关系,我们可以跟着文中提到的一些文件,去学习到linux的一些基础知识。这些文件记录了一些什么样的内容,对排查问题有什么帮助,怎么在应用获取它们。 后面的内容会从浅入深,我们学习完整个专栏再回头看应该有不同的感觉
2018-12-0510 - Kenny张老师,看到你解决一些棘手的崩溃,会去翻看源码,然后对比版本的差异,然后寻找hook点去解决,这个要考虑机型适配吧?毕竟国产机型rom差异化严重。
作者回复: Hook的时候,前几个版本一般会把hook失败的机型 rom 堆栈传上来做进一步分析。top的机型也会保证可以兼容
2018-12-046 - jasonTimeoutException 直接调用stop存在什么安全问题?请大神指教一二。
作者回复: Stop的时候有一定概率导致即使没有超时也会报timeoutexception
2018-12-042 - Wilsonpthread_create (1040KB stack) failed: Out of memory老师这个有没有好的解决方法?
作者回复: 可以把线程和句柄 dump出来,看看是哪里出了问题
2019-06-0521 - Geek_Yasin28请问有没有native崩溃后成功获取java堆栈的例子, 是只能用hook libart.so实现吗? 这边参考实现了native崩溃获取, 但是在native崩溃时, 信号处理函数去唤醒之前等待的线程,去回调java或者抛出异常给java处理都没有反应。
作者回复: 一般情况下直接jni调用也是可以拿到的,除了一些特殊情况
2019-03-141