如何快速分析fd leaks, 文件句柄泄露.

转发:http://bbs.16rd.com/thread-26768-1-1.html


如何快速分析fd leaks, 文件句柄泄露.


[Keyword]
FD leaks, File Description Leaks, Too many open files, error 24

[Solution]
android 默认每一个进程最多能够打开的文件数量为1024, 一旦达到预置,则会爆错 error=24, 即Too many open files.

通常的分析手法如下:

(1). 确定是哪类文件打开太多,没有关闭.
   *  fd leaks, 通常伴随着此进程会出现Java Exception, Native Exception 等. 在mtk 的AEE DB 中, 有一支文件 PROCESS_FILE_STATE 描述, 此进程的打开的所有文件.
查看此文件, 确定哪个或者哪种文件打开数量最多,即追查此类文件打开如此多, 而没有被关闭的原因.
   
   *  如果没有DB, 当发生文件句柄泄露到1024 时, 在L 版本后, 在Kernel Log 中search "FDLEAK",   在L 版本之前, 在Kernel Log 中search "FS_TAG", 即可枚举出所有的此进程所打开的文件.
   
   *  如果问题容易复现,可以直接 adb shell ls -a -l /proc/pid/fd , 直接打印出当前此process 所有打开的文件.
   
(2). 确定此类文件是在哪里打开.
    对于一些确定的文件, 比如/data/data/xxxx_app/yyyy 之类的文件, 通常开发者自己可以快速的确定打开文件的位置,基本上不需要debug.
    对于一些另外一些常见的场景说明如下:
    * 大批量的打开“anon_inode:[eventpoll]” 和 "pipe",  超过100个eventpoll, 通常情况下是开启了太多的HandlerThread/Looper/MessageQueue, 线程忘记关闭, 或者looper 没有释放. 可以抓取hprof 进行快速分析. 抓取hprof 可以参考FAQ:

         http://online.mediatek.com/Pages/FAQ.aspx?List=SW&FAQID=FAQ08893
    * 对于system server, 如果有大批量的socket 打开, 可能是因为Input Channel 没有关闭, 此类同样抓取hprof, 查看system server 中WindowState 的情况.
    * 大批量的打开“/dev/ashmem”, 如果是Context provider, 或者其他app, 很可能是打开数据库没有关闭, 或者数据库链接频繁打开忘记关闭.
   
(3). 暴力确定文件打开的位置
    MTK 有开发了fd leaks debug 功能,可以记录每次打开fd 的backtrace, 可以参考FAQ:   http://online.mediatek.com/Pages/FAQ.aspx?List=SW&FAQID=FAQ11422
   
(4). 修正
    确认为何要频繁打开, 或者为何打开后忘记关闭, ^_^,  然后更新.

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值