从 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方法是一个非常有用的功能,它自动根据表单数据创建数据对象(在表字段很多的情况下尤其明显) 但有时候该方法可能并未按照你期望的来工作,比如方法不工作而且还没有提示 ...
随机推荐
- coderforces #384 D Chloe and pleasant prizes(DP)
Chloe and pleasant prizes time limit per test 2 seconds memory limit per test 256 megabytes input st ...
- 安装mysql因为/tmp权限不足而导致ERROR 1045 (28000): Access denied for user root@localhost (using password: NO)的解决方案
本机是centos 6.5 安装的mysql是5.1的版本. 在安装mysql之后,第一次启动mysql服务的时候,需要/tmp有777(rwxrwxrwx)的权限,然而楼主的/tmp是755(rw ...
- FreeBSD 无线配置
无线配置在 handbook 中早已有了,但 handbook 中采用写入配置文件的办法,缺乏灵活性,补充下 on the fly 的方法 假设网卡接口为 ath0 ifconfig wlan0 cr ...
- HttpServletRequest常用获取URL的方法
1.request.getRequestURL() 返回的是完整的url,包括Http协议,端口号,servlet名字和映射路径,但它不包含请求参数.2.request.getRequestURI() ...
- golang: 根据json生成go源文件
https://github.com/ChimeraCoder/gojson $ git clone https://github.com/ChimeraCoder/gojson.git$ cd go ...
- makedown使用语法
makedown是一个轻量级的标记语言,目前越来越多的写作爱好者所使用.优点很多,纯文本内容兼容所有文本编辑器.语法简单.轻松导出HTML.PDF和本身.md文件. 1.编辑工具 windows: M ...
- MYSQL 判断一个时间段是否在另一个时间段内。
[1 CREATE TABLE #B 2 ( 3 MeetingRoom int, 4 BeginTime datetime, 5 EndTime datetime6 ) 7 insert into ...
- Discuz模拟批量上传附件发帖
简介 对于很多用discuz做资源下载站来说,一个个上传附件,发帖是很繁琐的过程.如果需要批量上传附件发帖,就需要去模拟discuz 上传附件的流程. 模拟上传 discuz 附件逻辑 dz附件储存在 ...
- MySql 存储过程及调用方法
存储过程实例: DELIMITER $$drop procedure if exists ff $$CREATE /*[DEFINER = { user | CURRENT_USER }]*/ PRO ...
- 关于QFTP乱码
// 从FTP接收的内容QString FtpUtil::_FromSpecialEncoding(const QString &InputStr){ #ifdef Q_OS_WIN retu ...