从 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问题圆满解决 :)

时间: 2024-12-20 00:37:43

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

Looper Could not create wake pip

日志打印 A/Looper(31455): Could not create wake pipe. errno=24 A/Looper(1960): Could not create wake pipe. errno=24 A/libc(1960): Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1) A/Looper(16848): Could not create wake pipe. errno=24 App直接飞掉 问题: Native Lo

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,下载下来之后,就跃跃欲试了.将下载下来的包解压,直接运行sqldeveloper.exe这个文件,选择了本地安装的JDK路径,之后却不幸的报错了,提示"unable to create an instance of the java virtual machine located at path",具体界面

Cannot create an instance of OLE DB provider “OraOLEDB.Oracle” for linked server &quot;xxxxxxx&quot;.

在SQL SERVER 2008 R2下用Windows 身份认证的登录名创建了一个访问ORACLE数据库的链接服务器xxxxx,测试成功,木有问题,但是其它登录名使用该链接服务器时,报如下错误: 消息 7302,级别 16,状态 1,第 1 行 Cannot create an instance of OLE DB provider "OraOLEDB.Oracle" for linked server "xxxxxx". 此时需要在"服务器对象&quo

spring mvc 500错误Allocate exception for servlet AppService javax.naming.NamingException: Cannot create resource instance

头几天已经测试的完毕了,换了个目录出现这个问题 严重: Allocate exception for servlet AppService javax.naming.NamingException: Cannot create resource instance at org.apache.naming.factory.FactoryBase.getObjectInstance(FactoryBase.java:96) at javax.naming.spi.NamingManager.getO

解决ThinkPHP的Create方法失效而没有提示错误信息的问题

ThinkPHP中的数据创建Create方法是一个非常有用的功能,它自动根据表单数据创建数据对象(在表字段很多的情况下尤其明显) 但有时候该方法可能并未按照你期望的来工作,比如方法不工作而且还没有提示错误信息 这个时候你就要好好仔细下你的代码了,因为很有可能你写的代码不规范或是其他原因 以下是我因为自己的粗心而出现的问题:Create方法失效而没有提示错误信息 /** * 编辑数据 * @Author NETFOX-HTL * @Email [email protected] * @DateTi

[转]Git – fatal: Unable to create &#39;XXX/.git/index.lock’: File exists.的解决办法

参考资料: http://sheshui.me/articles/git-quickly-tutorial-20120517 http://stackoverflow.com/questions/9282632/git-index-lock-file-exists-when-i-try-to-commit-but-cannot-delete-the-file 我的说明: 我操作的是ubuntu环境.window远程 1 若在window下远程打开操作窗口(不是console),进入.git目录删

浅谈RxJava源码解析(观察者),创建(create、from、just),变换(Map、flatMap)、线程调度

一.创建操作: 1.观察者模式:RxJava的世界里,我们有四种角色: Observable<T>(被观察者).Observer(观察者) Subscriber(订阅者).Subject Observable和Subject是两个"生产"实体,Observer和Subscriber是两个"消费"实体.Observable 和 Observer 通过 subscribe() 方法实现订阅关系,从而 Observable 可以在需要的时候发出事件来通知 Ob

浅谈ORACLE AWR single instance 一

Oracle中的AWR,全称为Automatic Workload Repository,自动负载信息库. AWR是DBA了解其运行状态的重要工具之一,根据AWR报告可以对oracle数据库性能整体了解并针对性优化,此文章主要是介绍AWR相关部分的内容. DB Name         DB Id    Instance     Inst Num Startup Time    Release     RAC ------------ ----------- ------------ -----

关于 error C2039: “create”: 不是“cocos2d::GLView”的成员的解决方法

问题: 跑一个demo,因为是涉及3.x版本的引擎,不是很熟悉,在VS2013上运行,报错 error C2039: “create”: 不是“cocos2d::GLView”的成员 解决: 通过查阅资料,问度娘了解到,3.x版本引擎版本之间改动较大,demo是用3.2创建的,而我的开发环境是3.1.0,引擎变了,自然报错 办法: 出错代码: if(!glview) {  glview = GLView::create("My Game");  glview->setFrameS