USB デバイスを何度も開くとメモリ リークの問題が発生することを思い出してください。

1. 原因

少し前までスレッドプログラムが一定期間実行されていると必ず不可解なクラッシュが発生することがあり、当初はメモリリークかデバイス(端末のAndroidプログラム、と機種変更したところ、互換性が良くないのではないかと疑って調べてみましたが、こちらも問題はありませんでした。
バグは SIGABRT エラーをキャッチしますが、他に有用な情報はありません。

ここに画像の説明を挿入

その後、開発環境において、対応するバージョンのプログラムと端末機器を使用してシミュレーションテストを実施しました。デバイスは開発者モードであり、デバッグ ログ入力スイッチがオンになっていることに注意してください。後で問題が再発しました。 adb pull /data/logs/ ./ コマンドを使用してログをローカルに保存します。 /data/logs/ はデバイスのシステム ログが入力されるディレクトリです。

ログ フォルダーに Android ファイルがあります。このファイルを開いて、クラッシュが発生した時点のログを確認します。
ここに画像の説明を挿入
ログ ファイルによると、「間接参照テーブル」の ashmem_create_region が失敗しました。プロセスが開いているファイルが多すぎます。開いたファイルが多すぎるため、その結果、OutOfMemoryError "JNI Env を割り当てられませんでした" がスローされたため、プログラムは例外をスローしました。Bugly はクラッシュ情報をファイルに保存して報告する必要もありますが、プログラムがクラッシュすると、開いているファイルが多すぎるというエラーが発生するため、Bugly にはクラッシュ情報をより完全に記録する方法がありません。

2. 分析と解決策

adb シェルを使用してデバイスに接続し、ps を使用してデバイスのプロセスを表示し、対応するプログラムのプロセスを見つけます。
ここに画像の説明を挿入
ここに画像の説明を挿入

ls /proc/pid/fd | wc -l (pid は上記の手順で照会されます) コマンドを使用して、プロセスの最大ファイル制限を表示します
ここに画像の説明を挿入
ls -l /proc/pid/fd コマンドを使用して、プロセスの詳細を表示します5243 プロセスの開いたファイル
ここに画像の説明を挿入
一定期間のシミュレーション後 テスト後、開いているファイルをチェックし、開いているファイルの詳細を表示すると、実際にファイルが複数回開かれていて解放されていないことがわかり、クラッシュが発生しました。しきい値に達した後の OOM の問題。
ここに画像の説明を挿入
ここに画像の説明を挿入
問題を特定したら、USB 外部デバイスに関連するコードを最適化して問題を解決します。

おすすめ

転載: blog.csdn.net/qq_36224961/article/details/125795177