E IMemory : cannot dup fd=988, size=4968448, err=0 (Too many open files)

Posted 小筱萌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了E IMemory : cannot dup fd=988, size=4968448, err=0 (Too many open files)相关的知识,希望对你有一定的参考价值。

错误日志

 E IMemory : cannot dup fd=988, size=4968448, err=0 (Too many open files)
 E IMemory : cannot map BpMemoryHeap (binder=0x72af762820), size=4968448, fd=-1 (Bad file descriptor)

背景:自主研发的虹膜识别一体机,从硬件-系统-算法-软件都是我们自己研发的,现在就是在android应用层调用相机实现识别的过程中每隔半个小时就会崩溃一次,log日志如下:

01-18 17:45:18.749  1460  2817 E IMemory : cannot dup fd=988, size=4968448, err=0 (Too many open files)
01-18 17:45:18.749  1460  2817 E IMemory : cannot map BpMemoryHeap (binder=0x72af762820), size=4968448, fd=-1 (Bad file descriptor)
--------- beginning of crash
01-18 17:45:19.075  8272  8272 F DEBUG   : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
01-18 17:45:19.075  8272  8272 F DEBUG   : Build fingerprint: 'Android/nanopc_t4/nanopc-t4:7.1.2/NHG47K/root01222110:userdebug/test-keys'
01-18 17:45:19.075  8272  8272 F DEBUG   : Revision: '0'
01-18 17:45:19.075  8272  8272 F DEBUG   : ABI: 'arm64'
01-18 17:45:19.075  8272  8272 F DEBUG   : pid: 1460, tid: 2817, name: Binder:1460_9  >>> cn.com.iristar.smartas <<<
01-18 17:45:19.076  8272  8272 F DEBUG   : signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0
01-18 17:45:19.076  8272  8272 F DEBUG   :     x0   0000000000000000  x1   000000763cb2ef10  x2   000000763ca00000  x3   0000000000000005
01-18 17:45:19.076  8272  8272 F DEBUG   :     x4   000000000000012e  x5   0000000000000000  x6   0000000000000000  x7   00000000001e5a76
01-18 17:45:19.076  8272  8272 F DEBUG   :     x8   0000000000000000  x9   00000079c07f3b48  x10  000000000000012e  x11  00000079cce0d4e8
01-18 17:45:19.076  8272  8272 F DEBUG   :     x12  0000000000000018  x13  0000000050f919ae  x14  002c864f77af3653  x15  00002b2f56f39014
01-18 17:45:19.076  8272  8272 F DEBUG   :     x16  0000007a16c2c5b0  x17  0000007a16bd3e68  x18  0000000000000000  x19  00000079f81ec640
01-18 17:45:19.076  8272  8272 F DEBUG   :     x20  0000007a16f1d000  x21  0000000000000010  x22  0000007a0a6d4b60  x23  0000000000000010
01-18 17:45:19.076  8272  8272 F DEBUG   :     x24  00000079cce0cfa0  x25  000000000000275d  x26  00000000000005b4  x27  0000007a19779d00
01-18 17:45:19.076  8272  8272 F DEBUG   :     x28  0000000000000001  x29  00000079cce0cf40  x30  0000007a16e866dc
01-18 17:45:19.076  8272  8272 F DEBUG   :     sp   00000079cce0cf40  pc   0000007a16e866e4  pstate 0000000020000000
01-18 17:45:19.086  8272  8272 F DEBUG   : 
01-18 17:45:19.086  8272  8272 F DEBUG   : backtrace:
01-18 17:45:19.086  8272  8272 F DEBUG   :     #00 pc 000000000012d6e4  /system/lib64/libandroid_runtime.so (_ZN16JNICameraContext11copyAndPostEP7_JNIEnvRKN7android2spINS2_7IMemoryEEEi+96)
01-18 17:45:19.086  8272  8272 F DEBUG   :     #01 pc 000000000012ddac  /system/lib64/libandroid_runtime.so (_ZN16JNICameraContext8postDataEiRKN7android2spINS0_7IMemoryEEEP21camera_frame_metadata+104)
01-18 17:45:19.086  8272  8272 F DEBUG   :     #02 pc 000000000003bc1c  /system/lib64/libcamera_client.so (_ZN7android6Camera12dataCallbackEiRKNS_2spINS_7IMemoryEEEP21camera_frame_metadata+168)
01-18 17:45:19.086  8272  8272 F DEBUG   :     #03 pc 00000000000446a8  /system/lib64/libcamera_client.so (_ZN7android8hardware14BnCameraClient10onTransactEjRKNS_6ParcelEPS2_j+624)
01-18 17:45:19.086  8272  8272 F DEBUG   :     #04 pc 0000000000049e74  /system/lib64/libbinder.so (_ZN7android7BBinder8transactEjRKNS_6ParcelEPS1_j+132)
01-18 17:45:19.086  8272  8272 F DEBUG   :     #05 pc 0000000000055c34  /system/lib64/libbinder.so (_ZN7android14IPCThreadState14executeCommandEi+992)
01-18 17:45:19.086  8272  8272 F DEBUG   :     #06 pc 0000000000055798  /system/lib64/libbinder.so (_ZN7android14IPCThreadState20getAndExecuteCommandEv+156)
01-18 17:45:19.086  8272  8272 F DEBUG   :     #07 pc 0000000000055e4c  /system/lib64/libbinder.so (_ZN7android14IPCThreadState14joinThreadPoolEb+72)
01-18 17:45:19.087  8272  8272 F DEBUG   :     #08 pc 0000000000072d94  /system/lib64/libbinder.so
01-18 17:45:19.087  8272  8272 F DEBUG   :     #09 pc 000000000001245c  /system/lib64/libutils.so (_ZN7android6Thread11_threadLoopEPv+272)
01-18 17:45:19.087  8272  8272 F DEBUG   :     #10 pc 000000000009f1b0  /system/lib64/libandroid_runtime.so (_ZN7android14AndroidRuntime15javaThreadShellEPv+116)
01-18 17:45:19.087  8272  8272 F DEBUG   :     #11 pc 0000000000068748  /system/lib64/libc.so (_ZL15__pthread_startPv+208)
01-18 17:45:19.087  8272  8272 F DEBUG   :     #12 pc 000000000001da7c  /system/lib64/libc.so (__start_thread+16)

最开始出现这个错误的时候一直以为是系统崩溃了,但是抓到的log多了之后就会发现每次崩溃之前都会有(Too many open files)的IMemory错误级别的日志出现,从字面意思上可以看出是打开的文件太多导致的崩溃,首先想到的第一个思路就是用adb shell查看当前进程中所有打开的文件,步骤如下:
1.ps | grep XXX
查看当前工程的进程ID
2. lsof -p 17419 | wc -l
能看见打开的文件一直在涨,并没有下降,这就是问题的所在了
3. lsof -p 进程id >/sdcard/openfiles.log
这一步主要是将所有打开的文件列表保存下来,多保存几次然后比对差别,看是哪些文件在重复的打开,我这里有个 /data/app/XX.XX.XX.XX-1/base.apk一直在刷,可以看出来是apk内部文件打开的问题,于是经过代码复盘找到了一处问题:SoundPool在使用过程中有两个问题:

soundId = soundPool.load(context, R.raw.right, 1);

使用完之后并没有unload操作,于是在页面销毁的时候添加unload方法,查看当前打开文件数基本保持在570左右,并没有持续上涨,由此搞定。

nanopc-t4:/ # lsof -p 3703 | wc -l
582
nanopc-t4:/ # lsof -p 3703 | wc -l
578
nanopc-t4:/ # lsof -p 3703 | wc -l
580
nanopc-t4:/ # lsof -p 3703 | wc -l
560
nanopc-t4:/ # lsof -p 3703 | wc -l
554
nanopc-t4:/ # lsof -p 3703 | wc -l
554
nanopc-t4:/ # lsof -p 3703 | wc -l
579
nanopc-t4:/ # lsof -p 3703 | wc -l
575
nanopc-t4:/ # lsof -p 3703 | wc -l
575
nanopc-t4:/ # lsof -p 3703 | wc -l
575

注意:我这边把音频文件放入了raw文件夹下,如果你放在assect中的话需要使用AssetFileDescriptor,切记使用完毕之后需要释放调用close。

以上是关于E IMemory : cannot dup fd=988, size=4968448, err=0 (Too many open files)的主要内容,如果未能解决你的问题,请参考以下文章

Linux dup dup2函数理解

Linux系统编程---dup和dup2详解

c语言的 dup函数

android为啥会有以下错误?

引擎国产化适配&重构笔记

dup和dup2