admin管理员组文章数量:1531714
2023年12月12日发(作者:)
一次文件句柄泄露的排查
在linux中,当然android操作系统类似,每个进程打开的句柄数是有限制的,默认为1024个。另外在Linux操作系统中一切皆文件,
打开的都会持有一个句柄。查看某个进程的打开的句柄的命令有
1. lsof -p [进程ID]
2. ls -l /proc/进程ID/fd | wc -l
在一次项目中有个奇怪的问题是程序崩溃在不同的地方,如下面两个tombstone产生的内容,第一次往前翻没啥什么错误信息,但是从
那个Abort message最后的提示信息可以看到说打开的文件过多,同时第二张图片提示虽然是崩溃在RenderThread中,但是从崩溃信息
往前看日志可以看到在quebuffer调用中在一个binder通信中也是dup调用失败。那么初步怀疑问题出现在文件句柄泄露导致程序崩溃。
初步判断为文件句柄泄露导致,那么在程序拷机过程中通过上述的命令来证实是不是文件句柄泄露,通过在拷机中统计文件句柄个数发
现的确如判断一致。
现在知道了是文件句柄泄露,下面就需要定位是哪里导致文件句柄泄露。首先通过lsof查看是多了什么句柄,通过比较发现进程每次会
多3个句柄:1个anon_inode:[eventpoll] 和pipe的两个句柄,再在tasks目录发现同时会多一个线程,通过pstree可以查看这个线程的名
称,再通过androidstudio在线调试,发现这个线程名。同步搜索代码,发现是调用了一个Looper,而Looper通过
MessageQueue,MessageQueue的native层会创建pipe和epoll,至此,定位到了文件句柄泄露的元凶。那么就需要在Looper不需要的
时候退出。
版权声明:本文标题:一次文件句柄泄露的排查 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/xitong/1702342135a2023.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论