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不需要的

时候退出。

本文标签: 句柄文件泄露