【fd泄漏问题】Monkey测试出现fd泄漏导致system_server重启

1、问题描述

测试monkey过程中发生system_sever重启,通过分析log确认是发生了fd泄漏。fd泄漏就是一个进程打开的fd数量超过了1024就会导致fd泄漏的进程抛出异常发生crash。如果这个进程正好是系统进程如,system_server、surfaceflinger等就会发生系统重启等异常。

2、问题分析

从获取log初步确认system_server重启原因是打开了过多的文件导致句柄泄漏发生crash,log如下:

A101-01 01:53:59.520  3334 3936 E ActivityManager: Activity Manager Crash

A101-01 01:53:59.520  3334 3936 E ActivityManager: java.lang.RuntimeException: Too many open files

A101-01 01:53:59.520  3334 3936 E ActivityManager:     atandroid.os.Parcel.nativeWriteFileDescriptor(Native Method)

A101-01 01:53:59.520  3334 3936 E ActivityManager:     atandroid.os.Parcel.writeFileDescriptor(Parcel.java:615)

A101-01 01:53:59.520  3334 3936 E ActivityManager:     atandroid.os.ParcelFileDescriptor.writeToParcel(ParcelFileDescriptor.java:975)

A101-01 01:53:59.520  3334 3936 E ActivityManager:     atandroid.app.ActivityManager$TaskThumbnail.writeToParcel(ActivityManager.java:1954)

A101-01 01:53:59.520  3334 3936 E ActivityManager:     at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:700)

A101-01 01:53:59.520  3334 3936 E ActivityManager:     atandroid.app.ActivityManagerNativeEx.onTransact(ActivityManagerNativeEx.java:149)

A101-01 01:53:59.520  3334 3936 E ActivityManager:     atcom.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2774)

A101-01 01:53:59.520  3334 3936 E ActivityManager:     atandroid.os.Binder.execTransact(Binder.java:591)

由于这里无法确定是那种fd类型导致的泄漏,所以需要通过lsof抓取fd system_server进程fd信息来确定fd类型。

通过脚本跑lsof,确定是open打开了713次的ddrinfo_freq_table节点没有关闭导致。

system_se  3342     system  982r      REG               0,19      4096      20997 /sys/devices/platform/scene-frequency/devfreq/scene-frequency/sprd_governor/ddrinfo_freq_table
system_se  3342     system  983r      REG               0,19      4096      20997 /sys/devices/platform/scene-frequency/devfreq/scene-frequency/sprd_governor/ddrinfo_freq_table
system_se  3342     system  984r      REG               0,19      4096      20997 /sys/devices/platform/scene-frequency/devfreq/scene-frequency/sprd_governor/ddrinfo_freq_table
system_se  3342     system  985r      REG               0,19      4096      20997 /sys/devices/platform/scene-frequency/devfreq/scene-frequency/sprd_governor/ddrinfo_freq_table
system_se  3342     system  986r      REG               0,19      4096      20997 /sys/devices/platform/scene-frequency/devfreq/scene-frequency/sprd_governor/ddrinfo_freq_table

由于这个节点的特殊性,搜索代码就可以确定是哪里打开的这个节点,即devfreq.c文件中逻辑异常导致没有及时关闭打开的fd,导致了泄漏,所以这里修改很简单就是关闭对应打开的fd即可。system_server或surfaceflinger中fd泄漏一般是socket或pipe的泄漏比较难查,这是首先也是要确定泄漏类型,其次就是确定操作这个fd代码的位置,可以通过打印调用栈的方法来定位问题。

你可能感兴趣的:(泄漏类)