从 A/Looper: Could not create epoll instance. errno=24 错误浅谈解决各类 bug 的思路

今天代码写着写着就莫名闪退了,手机也没有“程序中止运行”的提示,logcat也没有看到蓝色的调用栈log,这样的闪退最是蛋疼了,还好必现。复现几回以后,终于从logcat中看到了一行可疑的log: A/Looper: Could not create epoll instance. errno=24 ,看起来又是在native层闪退了。本文就把这个问题的分析解决过程记录了下来。java

方法论

碰见没填过的坑,第一反应就是Google之,果真前几个结果中一个 Stack Overflow的问答 就为这个问题的解决提供了很好的思路。固然搜索结果并不能直接解决问题,若是Google的结果直接就能解决问题,我也就不必写这样一篇文章,徒增无用信息了。git

除了可以直接搜到彻底同样的问题,而且已经有了解决办法的状况,还有时候只能搜到相关的问题,可是没有解决办法,或者解决办法不work,或者压根儿搜不到相关信息,这时候就须要本身根据已有信息一步步分析了,甚至只能本身一步步趟坑了,一般有几种情形:github

有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> ,拿着这个错误信息去搜确定都是不相干的结果,由于去掉本身定义的类路径以后,过短并且太常见了(类型转换错误)。可是经过分析报错信息,能够知道确实是类型转换错误。经过在代码中找和这个类相关的发生了类型转换的地方,最终解决了问题。oop

最惨的状况就是没有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问题圆满解决 :)code

相关文章
相关标签/搜索