前两天项目紧张阶段报出来一个Monkey测试出现的句柄泄露问题
当然这类问题日志和抛出的异常肯定不是直接告诉你句柄泄露啦、哪里泄露啦,测试报出来的问题是
AndroidRuntime: java.lang.RuntimeException: Could not read input channel file descriptors from parcel.
不少人都见过吧,其实这个也差不多就是告诉你文件句柄有了问题,可能还会怀疑是不是系统有问题导致的,好吧,还需要其他佐证来分析。
继续在这个日志附近搜索,哟,发现了宝贝了。
还有两句比较明显的,基本上可以确认就是句柄泄露了。
Parcel : dup() failed in Parcel::read, i is 0, fds[i] is -1, fd_count is 2, error: Too many open files
08-30 05:52:02.633 5258 5258 E InputChannel-JNI: Error 24 dup channel fd 1011.
开始解把
先搜索Cursor关键字,毕竟cursor也是要占用句柄的,代码里面都有加close操作,排除
然后搜索关键字File、InputStream和OutStream看看是否有未关闭的,没有问题排除
还是没找到问题,只能祭出杀手锏了,根据日志显示的操作简单操作几次看看前后文件句柄变化主要是哪几个方面
shell命令adb shell ls -al /proc/pid/fd
进入应用就已经有四十好几个了,大部分都不知道是什么,猜也没什么意义,还是直接操作几下看看差别吧。
lrwx------ u0_a67 u0_a67 2016-09-02 16:32 0 -> /dev/null
lrwx------ u0_a67 u0_a67 2016-09-02 16:32 1 -> /dev/null
lr-x------ u0_a67 u0_a67 2016-09-02 16:32 10 -> /system/framework/core-libart.jar
lrwx------ u0_a67 u0_a67 2016-09-02 16:32 1