Androidハンドル漏れ

2316 ワード

Androidハンドル漏れ
前言
Androidの開発過程で、いくつかのユニットテストを実行すると、ファイルハンドルの漏れの問題が明らかになりやすい.この間、このようなバグがあり、最後にファイルハンドルの漏洩の問題であることが判明しました.次に、位置決めハンドルの漏れを一歩一歩検索する方法を記録します.
本文
まず、間違ったロゴログを見てみましょう.
10-27 00:35:32.141  7437  7437 E AndroidRuntime: FATAL EXCEPTION: main

10-27 00:35:32.141  7437  7437 E AndroidRuntime: Process: com.Android56, PID: 7437

10-27 00:35:32.141  7437  7437 E AndroidRuntime: java.lang.RuntimeException: Could not read input channel file descriptors from parcel.

10-27 00:35:32.141  7437  7437 E AndroidRuntime:    at android.view.InputChannel.nativeReadFromParcel(Native Method)

10-27 00:35:32.141  7437  7437 E AndroidRuntime:    at android.view.InputChannel.readFromParcel(InputChannel.java:148)

10-27 00:35:32.141  7437  7437 E AndroidRuntime:    at android.view.InputChannel$1.createFromParcel(InputChannel.java:39)

ここにCould not read input channel file descriptors from parcelという言葉があります.そして、この言葉の上に価値のある情報を見つけました.
Caused by: java.io.IOException: Too many open files

ネット検索を通じて、これはファイルハンドルの漏れの問題だと基本的に判断します.
では、ファイルのハンドルが漏れている場所をどのように探せばいいのでしょうか.
まず、androidはlinuxのカーネルであるため、システムはプロセスごとにファイルハンドルのディレクトリを持つ必要があります.まずpsコマンドでappのプロセスidを取得します.そしてrootが通過した携帯電話を見つけたり、andoridシミュレータを使ったりしてadbで携帯電話に接続し、shellコマンドで/proc/プロセスid/fdというディレクトリに入ります.linuxはシステムの管理についてファイル方式を使用しているため、このフォルダの下には開いているすべてのハンドルがあります.
appの実行中に、このディレクトリに絶えずアクセスし、ls-lコマンドですべてのファイルハンドルをリストすることで、ファイルハンドルがどのように成長しているかを見ることができます.次に、異なるタイプのファイルハンドルに基づいて、何が漏れているのかを初歩的に位置づけます.
チェックの過程で、あるプロセスのハンドル数を簡単に取得するために、簡単なshellスクリプトを書きました.必要な学生は持って行って使うことができます.
echo '           '
set `adb shell ps |grep com.Android56 |grep -v channel |grep -v Daemon`
pidnum=$2
index=0
while true
do
index=$[index+1]
echo '##################'
echo ' '$index'   '
echo '   '
adb shell ls -l /proc/$pidnum/fd |grep "" -c
echo 'anon  '
adb shell ls -l /proc/$pidnum/fd |grep anon -c
echo '##################'
sleep 2
done

まとめ
困難な調査過程を通じて、プレーヤーがsoダイナミックリンクライブラリを開いたとき、ファイルが解放されなかったことにやっと気づいた.具体的には、dlopen、dlsymが呼び出されますが、dlcloseというメソッドは呼び出されません.これからプログラミングの過程で、このような資源に関するものにもっと注意しなければなりません.開くには閉じる必要があります.同時に、テストの過程で、ファイルハンドルの監視を加えることをお勧めします.そうすれば、問題をよりよく発見し、オンラインでバグが発生しないようにすることができます.