从 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问题圆满解决 :)
从 A/Looper: Could not create epoll instance. errno=24 错误浅谈解决各种 bug 的思路的更多相关文章
- Cannot create an instance of OLE DB provider "OraOLEDB.Oracle" for linked server "xxxxxxx".
在SQL SERVER 2008 R2下用Windows 身份认证的登录名创建了一个访问ORACLE数据库的链接服务器xxxxx,测试成功,木有问题,但是其它登录名使用该链接服务器时,报如下错误: 消 ...
- SQL Developer 4.0 启动报错“unable to create an instance of the java virtual machine located at path”
安装了Oracle之后,第一件事情就是想想怎么去连接,进而操作.SQL Developer是官方提供的强大工具,个人看来也是第一选择. 目前官网提供的最新版是4.0.1.14.48,下载下来之后,就跃 ...
- Cannot create an instance of OLE DB provider “OraOLEDB.Oracle” for linked server "xxxxxxx".
在SQL SERVER 2008 R2下用Windows 身份认证的登录名创建了一个访问ORACLE数据库的链接服务器xxxxx,测试成功,木有问题,但是其它登录名使用该链接服务器时,报如下错误: 消 ...
- spring mvc 500错误Allocate exception for servlet AppService javax.naming.NamingException: Cannot create resource instance 竟是@Resource的原因
头几天已经测试的完毕了,换了个目录出现这个问题 严重: Allocate exception for servlet AppService javax.naming.NamingException: ...
- javax.naming.NamingException: Cannot create resource instance报错修改
//下面内容为网上获取 avax.naming.NamingException: Cannot create resource instance at org.apache.naming.factor ...
- run jdeveloper, unable to create an instance of the Java Virtual Machine Located at path:
刚才打开 jdevW.exe 时提示如下错误: Unable to create an instance of the Java Virtual MachineLocated at path:x:\x ...
- Create STKNetDiskC Instance Error
关于Create STKNetDiskC Instance Error错误的解决方法 这个错误可能出现在: AM8 附件直接存网盘的时候 报错 解决方法步骤如下: 在出现该错误的机器上,先将AM及 m ...
- DedeTag Engine Create File False提示的种种原因及解决方法
DedeTag Engine Create File False提示的种种原因及解决方法 第一种情况:站点.文件夹权限不足造成无法建立文件 这种情况的出现,一方面可能是Apache设置的读写权限较严格 ...
- 解决ThinkPHP的Create方法失效而没有提示错误信息的问题
ThinkPHP中的数据创建Create方法是一个非常有用的功能,它自动根据表单数据创建数据对象(在表字段很多的情况下尤其明显) 但有时候该方法可能并未按照你期望的来工作,比如方法不工作而且还没有提示 ...
随机推荐
- ubuntu kylin 16.04系统的基本安装
系统版本:ubuntu kylin 16.04 硬件状况:500G HDD+120G SSD 已安装操作系统:WIN 10专业版(craked) ——WIN 10系统是装在SSD的第一个盘符内的.以前 ...
- 11.12模拟考T2(GCD)
2.梅花桩 (blossom.pas/c/cpp) [问题描述] 小x在练习一门轻功,这门轻功是在梅花桩上跳来跳去,这门轻功是严格按照直线从一个梅花桩直接跳到另外一个梅花桩上.因为小x有恐高症,所 ...
- rsync+inotify实现自动备份
1.rsync命令 文件在不同服务器之间备份,有两种方式,一种是推,另一种是拉 推:即由主服务器推送数据到次服务器 拉:即由次服务器向主服务器要数据 一般采用拉的方式 但是这样同时多服务器备份就会分享 ...
- [BZOJ 3637]Query on a tree VI
偶然看见了这题,觉得自己 QTREE.COT 什么的都没有刷过的真是弱爆了…… 一道思路很巧妙的题,终于是在约大爷的耐心教导下会了,真是太感谢约大爷了. 这题显然是树链剖分,但是链上维护的东西很恶心. ...
- 怎样用vs 2008 编译C程序
在大学里都习惯了vc6.0,但是它的集成度并不好,刚试着用vs2008,简单说一下用vs2008编译c的方法吧 首先,在file中新建工程project ,确定之后,会出现新工程(new projec ...
- contiki学习笔记---process结构体
process,字面意义,进程,看看它的结构 struct process { struct process *next; #if PROCESS_CONF_NO_PROCESS_NAMES #def ...
- 怎么用BarTender的格式刷
BarTender的新格式刷使您能够轻松地在模板上的多个对象之间共享格式.您可以在单个模板中以及在多个BarTender模板和文档之间复制对象样式.下面小编给大家来讲讲BarTender格式刷这一可用 ...
- Android应用开发-网络编程(二)(重制版)
Apache HttpClient框架 GET方式请求提交数据 1. 创建一个HttpClient HttpClient hc = new DefaultHttpClient(); 2. 创建一个Ht ...
- .NET的ExcelOperate
using System; using System.Web; using Excel = Microsoft.Office.Interop.Excel; namespace Comm { /// & ...
- MySQL服务 - MySQL列类型、SQL模式、数据字典
MySQL列类型的作用: 列类型可以简单理解为用来对用户往列种存储数据时做某种范围"限定",它可以定义数据的有效值(字符.数字等).所能占据的最大存储空间.字符长度(定长或变长). ...