从 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方法是一个非常有用的功能,它自动根据表单数据创建数据对象(在表字段很多的情况下尤其明显) 但有时候该方法可能并未按照你期望的来工作,比如方法不工作而且还没有提示 ...
随机推荐
- CE 进程同步-事件
事件(event)分为有名的和无名的,使用有名事件的时候,在不同进程中创建的同名事件,其实就是同一个,这样就可以在不同的进程中使用了.两个进程里面都要创建事件,事件名要一致. //进程1 HANDLE ...
- centos安装sublime
在官网下载,tarball 下载链接 http://www.sublimetext.com/3 提示信息: Ubuntu 64 bit - also available as a ...
- while 循环
while(condition) { //........ } 循环在我们从事C语言开发的过程中可以说用的挺多的,但是今天想起了一个问题,源于我要在一个长字符串中查找特定字符串,于是我写了如下代码: ...
- SQL 查询两个字段相同表的不同记录
select b.NativeName from sanleiDB.dbo.Dictionary_Native b where not EXISTS (select a.NativeName from ...
- CommittableTransaction和TransactionScope
创建可提交事务 下面的示例创建一个新的 CommittableTransaction 并提交它. //Create a committable transaction tx = new Committ ...
- Oracle常用的性能诊断语句
--1.阻塞及等待事件信息查询 -- 查询所有会话的状态.等待类型及当前正在执行的SQL脚本 select se.SID, se.SERIAL#, se.Status, se.Event, se.BL ...
- Delphi写的DLL回调C#
C#的调用Delphi的DLL没有问题,DLL回调时遇到了麻烦,网上找了个方法,解决了这个问题 Delphi部分,列举了三种回调函数定义 library test; uses SysUtils; {$ ...
- c语言中static的用法,包括全局变量和局部变量用static修饰
一.c程序存储空间布局 C程序一直由下列部分组成: 1)正文段--CPU执行的机器指令部分:一个程序只有一个副本:只读,防止程序由于意外事故而修改自身指令: 2)初始化数据段(数据段)--在程序中所有 ...
- python---difflib
文件内容差异对比 difflib为python的标准库模块,无需安装.作用时对比文本之间的差异.并且支持输出可读性比较强的HTML文档,与LInux下的diff 命令相似.在版本控制方面非常有用. # ...
- 【uTenux】学习一个嵌入式操作系统-uTenux
[这个是汇总] 最近有点时间,参加了EEPW论坛和悠龙咨询组织的一个嵌入式操作系统uTenux试用活动.本来想借助这个活动提供的开发板做一个小项目,奈何OS使用功底太次.于是,这个活动被我降低到了学习 ...