从 A/Looper: Could not create epoll instance. errno=24 错误浅谈解决各种 bug 的思路
今天代码写着写着就莫名闪退了,手机也没有“程序停止运行”的提示,logcat也没有看到蓝色的调用栈log,这样的闪退最是蛋疼了,还好必现。复现几次之后,终于从logcat中看到了一行可疑的log: A/Looper: Could not create epoll instance. errno=24
,看起来又是在native层闪退了。本文就把这个问题的分析解决过程记录了下来。
方法论
遇见没填过的坑,第一反应就是Google之,果然前几个结果中一个 Stack Overflow的问答 就为这个问题的解决提供了很好的思路。当然搜索结果并不能直接解决问题,如果Google的结果直接就能解决问题,我也就没必要写这样一篇文章,徒增无用信息了。
除了能够直接搜到完全一样的问题,并且已经有了解决办法的情况,还有时候只能搜到相关的问题,但是没有解决办法,或者解决办法不work,或者压根儿搜不到相关信息,这时候就需要自己根据已有信息一步步分析了,甚至只能自己一步步趟坑了,通常有几种情形:
有log,但是搜索结果没有解决方案(经常遇到有人两年前在stack overflow上问了一个一模一样的问题,但是没有答案),或者解决方案不work。这时我们可以 根据搜到的信息,确定问题出在哪儿 。就比如这个问题, stack overflow上的回答 就说可能是打开了太多文件,而采纳的回答说去掉 looper.prepare()
就解决了问题,那就可能是创建了太多的 lopper
。又比如之前一篇文章中遇到的log A/libc: Fatal signal 11 (SIGSEGV) at 0x00000010 (code=1), thread 9302 (RxComputationTh)
,搜索结果就说可能是对native代码的多线程执行导致的。
有log,但是搜索不到有意义的结果。有时候搜索无结果可能是因为搜索内容包含了太多本地计算机相关的信息,比如文件路径,很多时候 删掉文件路径、时间戳等信息,就能搜到结果了 。如果还是搜不到结果,而log又有较明确的意义,这时候我们就可以 直接分析log的含义,确定问题的原因 。比如之前另一篇文章中遇到的 error: 不兼容的类型: java.util.List<java.lang.Object>无法转换为 java.util.List<com.github.piasy.model.entities.GithubUser>
,拿着这个错误信息去搜肯定都是不相干的结果,因为去掉自己定义的类路径之后,太短而且太常见了(类型转换错误)。但是通过分析报错信息,可以知道确实是类型转换错误。通过在代码中找和这个类相关的发生了类型转换的地方,最终解决了问题。
最惨的情况就是没有log,或者log没有任何有用信息了。这时候如果问题是突然冒出来的,这时候就可以通过 代码差异分析 来确定引入bug的代码了,通常情况下二分查找是最高效的,而git则有一个无比牛逼的命令, git bisect
,通过二分查找commit,来定位引入bug的坏commit。而如果只有一个commit,或者没有版本控制(啥?),那就只能新拉一个分支,通过逐步注释/删除代码,来定位bug代码了。
好吧上面不是最惨的,最惨的就是上面的情况都无法适用。这就真的没别的办法了,只能推倒重来了,其实这还是属于通过回滚来定位坏代码的类型,由此可见,回滚是定位bug的万精油,只不过效率可能是最低的。
A/Looper: Could not create epoll instance. errno=24
错误的分析解决过程
好了回到本次的具体问题上来,既然判断可能是由于创建了太多的looper导致的闪退,那就查看代码咯。但是我的代码并没有一处创建了looper呀!别急,looper还有个兄弟handler,handler可是经常使用的,看看是不是handler创建了太多。
通过为创建handler的代码加“非中断”断点(调试时不中断程序执行,只记录log),发现确实就是创建了太多的handler!
好了,找到了问题可能的原因,改掉会导致创建过多handler的代码,测试运行,闪退确实不再出现了,OK问题圆满解决 :)
转载于:https://www.cnblogs.com/longhs/p/5557713.html
从 A/Looper: Could not create epoll instance. errno=24 错误浅谈解决各种 bug 的思路相关推荐
- MySQL创建外键时报Can‘t create table xxx(errno: 150)错误解决办法
Can't create table xxx (errno: 150)错误解决办法 第一种情况,很简单,就是列的类型不匹配 另外一种情况,虽然数据类型一致了,但是字符编码不一致 最后一种情况则是,找不 ...
- 在Filfter中使用注解了spring 的bean,报javax.naming.NamingException: Cannot create resource instance...
为什么80%的码农都做不了架构师?>>> 严重: Servlet /xcfhinvoices threw load() exception javax.naming.Namin ...
- Cannot create an instance of class AndroidViewModel (androidx ViewModelProvider AndroidViewModel)
使用 androidx viewmodel 2.2.0 后,对 ViewModel 的创建有一些变化 原:ViewModelProviders.of(activity).get(ViewModel.c ...
- SQL Developer Unable to create an instance ...解决方法
下载解压了Oracle SQL Developer工具,运行时,启动不了,报错信息如下: --------------------------- Unable to create an instanc ...
- Cannot create an instance of class xxxxBinding
问题:Cannot create an instance of class com.fawcar.dlife6.appmarket.databinding.ActivityAppSetupBindin ...
- 阿里旺旺出现create DOMDocument instance error
最近出现的一个问题,电脑刚开始安装的是360管家,后面卸载,装的金山,就一直出现一个问题旺旺出现create DOMDocument instance error ,各种卸载,各种杀毒,都没有解决,在 ...
- Could not create an instance of type T. Type is an interface or abstract class
在开发中定义了一个抽象类,序列号抽象类的子类时,出现如下问题: Could not create an instance of type TestJsonConvert.IDevice. Type i ...
- dbeaver Can‘t create driver instance
使用dbeaver 创建新的连接,下载完mysql驱动后,连接报错: Can't create driver instance Error creating driver 'MySQL' instan ...
- 【c++】26.浅谈“事件驱动”、select、poll、epoll
浅谈"事件驱动" 1.通常,我们设计一个事件处理模型的程序有两种思路: 一种是通过轮询的方式; 一种通过事件驱动的方式,事件驱动方式也被称为消息通知方式. 下面举个简单收信的例子, ...
最新文章
- Windows command tools
- pytorch 笔记: 复现论文 Stochastic Weight Completion for Road Networks using Graph Convolutional Networks
- Linux下如何安装最新版本工具
- OpenCV与图像处理学习五——图像滤波与增强:线性、非线性滤波、直方图均衡化与Gamma变换
- webpack 保存文件后自动打包_继webpack后又一打包神器Parcel
- 【Java】Gourmet咖啡系统
- MVC 自定义属性验证登录
- python对文本数据进行采样_Python对wav文件的重采样实例
- ssm项目配置文件中的包扫描bean,排除特定bean的扫描
- Q132:PBRT-V3,BSSRDF(双向散射表面反射分布函数)(5.6.2章节、11.4章节)
- 【教程6】疯壳·ARM功能手机-中断实验教程
- 第七章 如何增加收入
- cad隐藏图层命令快捷键_Auto CAD如何隐藏全部图层,快捷键是什么?
- vue 项目实现水印效果
- python如何将两个list合并成字典_怎么把两个列表合并成字典 论Python怎样将两个list合并为一个字典...
- 查看linux服务器的内存和CPU信息
- 王卫不再担任顺丰速运法人 变更为陈雪颖
- 图的深度广度优先遍历(DFC与BFC)JavaScript版
- 【译】如何提高工作效率——HOWTO: Be more productive
- java随堂练习01,算术运算符的使用。
热门文章
- MySql中的内外联结查询
- 网络服务中常用的端口介绍
- JSP HTTP 状态码
- Function:函数对象
- 03-07 APP 控件交互
- 深度linux安装virtualbox,【玩转deepin】如何安装VirtualBox增强功能使得deepin系统全屏显示?...
- kong组件_使用Kongzue全家桶组件创建项目全攻略(一、引入和沉浸式的那些事儿)...
- sf | 空间矢量对象的几何信息处理方法
- python程序运行结果始终为0_Python:始终运行程序
- web前端开发规范总结