【吐血🤮】一次生产环境NPE崩溃的排查记录(上)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 直接说引起NPE的根本原因:rx订阅没有取消,回调时Fragment已经被回收,引用view调更新方法,自然NPE。

rx订阅要取消这可是常识:


  • 要么引入生命周期管理;
  • 要么定义CompositeSubscription,在Activity、Fragment销毁时clear()
  • 要么单独取消订阅,RxJava2用unsubscribe(),RxJava1用dispose();


我以为的开发常识,却被老项目打脸,接着我来捋一捋事情的前因后果,望大家吸取教训,排查BUG时少走弯路,错误原因已经给出了,对排查过程不感兴趣的可以直接略过了~


0x1、阴差阳错解了另一个BUG


组长钉钉甩来一个:


网络异常,图片无法展示
|


打开一看,刚上线的版本,爆了两千多次这个错误:



网络异常,图片无法展示
|


打开详细日志一看:


网络异常,图片无法展示
|


NPE,空指针异常,调用刷新组件的关闭刷新方法报空,排查下日志的其他部分,用 自己的写的脚本去下混淆,看下是否得到更多有帮助的信息。


没有什么卵用,不过奇怪的是,这个BUG的报错数还在不断增加,却没有用户反馈这个问题。


集成测试测三轮没发现,我们自己自测也不复现不了。


只能看进行更多的日志排查,一条日志引起我的注意:


UnknownHostException: Unable to resolve host "xxx.xxx.com": No address associated with hostname


然后报NPE,指向异常处理里的finishRefresh():


网络异常,图片无法展示
|


em?难不成错误处理的代码有问题?测试人员人手不够,漏掉 网络异常边界 测试也很正常,而且可能都不懂怎么 模拟网络异常和弱网情况


Charles 抓包模拟一波,定位到列表接口,下断点,请求后,直接把请求给 Abort 掉(丢弃):


网络异常,图片无法展示
|


果然应用崩溃了,心中窃喜,这么快就定位到了问题了?看下错误日志:


网络异常,图片无法展示
|


擦,怎么不是NPE,而是数组越界,看了下代码,原来是setEmptyView()后没有notifyDataSetChanged()一下。


好家伙,没解决BUG,却解了另外一个BUG,这...算是因祸得福吗?


0x2、真的是KAE的锅吗?


NPE的问题还没解决,控件为null,隐隐觉得可能是 kotlin-android-extensions (后面都简称KAE) 的锅,因为以前也遇到过根据id获取View实例为空的情况,不过那是因为id重复,于是干饭前在群里问了下小伙伴:


网络异常,图片无法展示
|


大家都很热情地劝我不要用KAE,坑多,官方推荐ViewBinding,手写findViewById稳等,这些我都知道...


但是哪能说话就换,项目里那么地方用到了,而且换一个方式,并没有真的解决问题,起码得搞清楚问题发生原因吧...


继续排查,直接源码看下KAE是怎么让你免去findViewById的,随手写个测试项目,写个TestActivity,里面引用下某个控件,依次点击 Tools → Show Kotlin ByteCode → Decompile


网络异常,图片无法展示
|


也是调 Activity.findViewById() 查找控件,没毛病,试试Fragment的情况:


网络异常,图片无法展示
|


和Activity实现方式如出一辙,唯二的区别是:


  • ① 调用Fragment的getView()方法的布局 (onCreateView返回的View);


  • ② 重写onDestroyView()方法,清空map中的实例;



相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
3月前
|
存储 缓存 JavaScript
Electron V8排查问题之V8FatalErrorCallback崩溃问题的定义如何解决
Electron V8排查问题之V8FatalErrorCallback崩溃问题的定义如何解决
41 0
|
6月前
|
JavaScript IDE Java
bugly崩溃排查3:观察是谁调用了崩溃函数
bugly崩溃排查3:观察是谁调用了崩溃函数
71 0
|
运维 监控 前端开发
记一次线上 bug 的排查分析过程及总结
记一次线上 bug 的排查分析过程及总结
记一次线上 bug 的排查分析过程及总结
|
消息中间件 运维 监控
线上踩坑记:项目中一次OOM的分析定位排查过程!
线上踩坑记:项目中一次OOM的分析定位排查过程!
|
存储 测试技术
kindle 应用程序出错,无法启动选定的应用程序,请重试。问题排查过程及处理方案。...
kindle 应用程序出错,无法启动选定的应用程序,请重试。问题排查过程及处理方案。...
523 0
|
SQL 关系型数据库 MySQL
MySQL大无语事件:一次生产环境的死锁事故,看看我怎么排查
今天要分享的是在生产环境中出现的一次算得上比较诡异的死锁事件, 不过庆幸的是没有产生较大的业务损失.
|
Java
如何排查Java内存泄露(内附各种排查工具介绍)
今天刚刚才加一个故障review会议, 故障非常典型, 在google也可以找到相似案例介绍。 在排查问题的过程中,使用了大量的工具, 发现有问题的地方还不只一个,总结一下. (本篇文章不会重点描述案例本身,重点会介绍个人对java内存泄露问题的排查思路和各种工具的使用)。
22061 0
|
JSON Java 程序员
写了这么久的业务连异常都不知道怎么处理吗
前言 文本已收录至我的GitHub仓库,欢迎Star:github.com/bin39232820… 种一棵树最好的时间是十年前,其次是现在
218 0
|
存储 Java Android开发
【吐血🤮】一次生产环境NPE崩溃的排查记录(中)
直接说引起NPE的根本原因: rx订阅没有取消,回调时Fragment已经被回收,引用view调更新方法,自然NPE。
168 0