当前位置:   article > 正文

Android Too many open files, fd泄露_dup fd泄露

dup fd泄露

接到一个三方apk在我方手机运行异常的问题.

fatal exception信息如下:

  1. 05-13 18:31:34.485 13749 13749 E AndroidRuntime: FATAL EXCEPTION: main
  2. 05-13 18:31:34.485 13749 13749 E AndroidRuntime: Process: com.****.****, PID: 13749
  3. 05-13 18:31:34.485 13749 13749 E AndroidRuntime: java.lang.RuntimeException: Adding window failed
  4. 05-13 18:31:34.485 13749 13749 E AndroidRuntime: at android.view.ViewRootImpl.setView(ViewRootImpl.java:809)
  5. 05-13 18:31:34.485 13749 13749 E AndroidRuntime: at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:356)
  6. 05-13 18:31:34.485 13749 13749 E AndroidRuntime: at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:93)
  7. 05-13 18:31:34.485 13749 13749 E AndroidRuntime: at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4136)
  8. 05-13 18:31:34.485 13749 13749 E AndroidRuntime: at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:51)
  9. 05-13 18:31:34.485 13749 13749 E AndroidRuntime: at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:145)
  10. 05-13 18:31:34.485 13749 13749 E AndroidRuntime: at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70)
  11. 05-13 18:31:34.485 13749 13749 E AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1872)
  12. 05-13 18:31:34.485 13749 13749 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:106)
  13. 05-13 18:31:34.485 13749 13749 E AndroidRuntime: at android.os.Looper.loop(Looper.java:210)
  14. 05-13 18:31:34.485 13749 13749 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:7124)
  15. 05-13 18:31:34.485 13749 13749 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
  16. 05-13 18:31:34.485 13749 13749 E AndroidRuntime: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
  17. 05-13 18:31:34.485 13749 13749 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:898)
  18. 05-13 18:31:34.485 13749 13749 E AndroidRuntime: Caused by: android.os.DeadObjectException: Transaction failed on small parcel; remote process probably died
  19. 05-13 18:31:34.485 13749 13749 E AndroidRuntime: at android.os.BinderProxy.transactNative(Native Method)
  20. 05-13 18:31:34.485 13749 13749 E AndroidRuntime: at android.os.BinderProxy.transact(BinderProxy.java:467)
  21. 05-13 18:31:34.485 13749 13749 E AndroidRuntime: at android.view.IWindowSession$Stub$Proxy.addToDisplay(IWindowSession.java:825)
  22. 05-13 18:31:34.485 13749 13749 E AndroidRuntime: at android.view.ViewRootImpl.setView(ViewRootImpl.java:797)
  23. 05-13 18:31:34.485 13749 13749 E AndroidRuntime: ... 13 more

fatal exception中 添加窗口失败,看上去堆栈信息没有和三方apk有关的信息.

但是在报错之前,发现大量篇幅的Too many open files

  1. 05-13 18:30:02.923 13749 13864 I Adreno : DequeueBuffer: dequeueBuffer failed
  2. 05-13 18:30:02.925 13749 13864 I Adreno : DequeueBuffer: dequeueBuffer failed
  3. 05-13 18:30:02.925 13749 13864 I Adreno : DequeueBuffer: dequeueBuffer failed
  4. 05-13 18:30:02.925 13749 13864 W OpenGLRenderer: swapBuffers encountered EGL error 12301 on 0x7ba7638700, halting rendering...
  5. 05-13 18:30:02.926 13749 14684 E PendingMediaStoreSerializer: File not found while getting output stream for 33746658248_pending_media.json.tmp
  6. 05-13 18:30:02.926 13749 14684 E PendingMediaStoreSerializer: java.io.FileNotFoundException: /data/user/0/com.*****.android/files/33746658248_pending_media.json.tmp (Too many open files)
  7. 05-13 18:30:02.926 13749 14684 E PendingMediaStoreSerializer: at java.io.FileOutputStream.open0(Native Method)
  8. 05-13 18:30:02.926 13749 14684 E PendingMediaStoreSerializer: at java.io.FileOutputStream.open(FileOutputStream.java:308)
  9. 05-13 18:30:02.926 13749 14684 E PendingMediaStoreSerializer: at java.io.FileOutputStream.<init>(FileOutputStream.java:238)
  10. 05-13 18:30:02.926 13749 14684 E PendingMediaStoreSerializer: at android.app.ContextImpl.openFileOutput(ContextImpl.java:581)
  11. 05-13 18:30:02.926 13749 14684 E PendingMediaStoreSerializer: at android.content.ContextWrapper.openFileOutput(ContextWrapper.java:208)
  12. 05-13 18:30:02.926 13749 14684 E PendingMediaStoreSerializer: at com.******.pendingmedia.store.PendingMediaStoreSerializer.A02(:109)
  13. 05-13 18:30:02.926 13749 14684 E PendingMediaStoreSerializer: at X.1dt.run(:8)
  14. 05-13 18:30:02.926 13749 14684 E PendingMediaStoreSerializer: at com.******.pendingmedia.model.PendingMedia.A0Q(:4)
  15. 05-13 18:30:02.926 13749 14684 E PendingMediaStoreSerializer: at X.1LL.A01(:71)
  16. 05-13 18:30:02.926 13749 14684 E PendingMediaStoreSerializer: at X.1LO.run(:39)
  17. 05-13 18:30:02.926 13749 14684 E PendingMediaStoreSerializer: at X.0Ms.run(:2)
  18. 05-13 18:30:02.926 13749 14684 E PendingMediaStoreSerializer: at X.0Mr.run(:31)
  19. 05-13 18:30:02.926 13749 14684 E PendingMediaStoreSerializer: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
  20. 05-13 18:30:02.926 13749 14684 E PendingMediaStoreSerializer: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
  21. 05-13 18:30:02.926 13749 14684 E PendingMediaStoreSerializer: at java.lang.Thread.run(Thread.java:764)
  22. 05-13 18:30:02.926 13749 14684 E PendingMediaStoreSerializer: at X.0dQ.run(:5)

怀疑三方apk逻辑问题,导致死循环 打开文件导致次问题. 最后的crash只是压死骆驼的最后一根稻草. 真正的原因是前面的 文件相关操作.

并且发现Adreno  : DequeueBuffer: dequeueBuffer failed

更详细的判断如下:

1./proc/$pid/limits查看Max open files

  1. # cat proc/8183/limits
  2. Limit Soft Limit Hard Limit Units
  3. Max cpu time unlimited unlimited seconds
  4. Max file size unlimited unlimited bytes
  5. Max data size unlimited unlimited bytes
  6. Max stack size unlimited unlimited bytes
  7. Max core file size unlimited unlimited bytes
  8. Max resident set unlimited unlimited bytes
  9. Max processes 21613 21613 processes
  10. Max open files 32768 32768 files
  11. Max locked memory 67108864 67108864 bytes
  12. Max address space unlimited unlimited bytes
  13. Max file locks unlimited unlimited locks
  14. Max pending signals 21613 21613 signals
  15. Max msgqueue size 819200 819200 bytes
  16. Max nice priority 40 40
  17. Max realtime priority 0 0
  18. Max realtime timeout unlimited unlimited us

当一个进程打开的文件数超过最大限制,就会抛出各种异常. crash堆栈信息并不够准确

2.ls -la /proc/$pid/fd    查看进程在做什么

  1. lr-x------ 1 u0_a168 u0_a168 64 2020-05-15 15:31 9997 -> /storage/8482-18E5/DCIM/100MEDIA/IMAG0010.jpg
  2. lr-x------ 1 u0_a168 u0_a168 64 2020-05-15 15:31 9998 -> /storage/8482-18E5/DCIM/100MEDIA/IMAG0010.jpg
  3. lr-x------ 1 u0_a168 u0_a168 64 2020-05-15 15:31 9999 -> /storage/8482-18E5/DCIM/100MEDIA/IMAG0010.jpg

这里发现应用fd 都指向同一个文件

3.借助tombstone文件

一般搜索anon_inode就可以了

fd 107: anon_inode:[eventpoll]             epoll创建的fd

  1. fd 103: /storage/8482-18E5/DCIM/100MEDIA/IMAG0001.jpg
  2. fd 104: /storage/8482-18E5/DCIM/100MEDIA/IMAG0001.jpg
  3. fd 105: /storage/8482-18E5/DCIM/100MEDIA/IMAG0001.jpg
  4. fd 106: anon_inode:[eventfd]
  5. fd 107: anon_inode:[eventpoll]
  6. .........
  7. fd 32766: /storage/8482-18E5/DCIM/100MEDIA/IMAG0001.jpg
  8. fd 32767: /storage/8482-18E5/DCIM/100MEDIA/IMAG0001.jpg

从tombstone中看到  fd确实被耗尽.

尾注:

  1. "Too many open files"
  2. "Could not allocate JNI Env"
  3. "Could not allocate dup blob fd"
  4. "Could not read input channel file descriptors from parcel"
  5. "pthread_create"
  6. "InputChannel is not initialized"
  7. "Could not open input channel pair"
  8. 当你看到上面几种crash的堆栈之后,就需要往fd泄露的方向上去思考了

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/235592
推荐阅读
相关标签
  

闽ICP备14008679号