[英]Android: Long running application stops responding. How to debug
我有一個長時間運行的Service
,它運行良好,但是,幾個小時后,它停止響應(它似乎正在執行,但實際上沒有)。 我想知道為什么/如何。
故障/錯誤永遠不會發生在“電纜上”,因此在我的本地台式機上調試不起作用。
我還將日志寫入磁盤,以遵循Service
的“流程”,但沒有發生故障( MyService
執行網絡工作,至少每 20 秒一次,但可能更多)
我有一個有根的 Android 設備。
在這個設備中,我使用 Wifi (IEE802.11) 與 ESP8266 通信。
為此,我有一個無限期運行的服務。 我有“開始”和“停止”動作來控制它。 它通過以下方式啟動和停止:
主要活動:
MyServices mMyServices = null;
boolean mIsBound = false;
onCreate(){
Intent myIntent = new Intent(this, MyServices.class);
startService(myIntent);
bindService(
myIntent,
myServiceConnection,
Context.BIND_AUTO_CREATE
);
}
onDestroy(){
unbindService(myServiceConnection);
stopService(new Intent(this, MyServices.class));
}
private final ServiceConnection mServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
MyServices.MyBinder binder = (MyServices.MyBinder) service;
mMyServices = binder.getService();
mIsBound = true;
}
@Override
public void onServiceDisconnected(ComponentName name) {
mIsBound = false;
}
};
MyService
超過 3k 行,它本身沒有阻塞操作,但持有Thread
s,即使MyService
停止響應“綁定活動”,它們似乎也能正常工作。
我的服務:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return Service.START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
private final IBinder mBinder = new MyBinder();
public class MyBinder extends Binder {
public MyServices getService() {
return MyServices.this;
}
}
據我所知,當“錯誤”發生時,是當我綁定一個Activity
(可能同時綁定幾個),然后在幾個小時后轉到后台,當一個“綁定活動”不在前台時進入前台,沒有任何反應,沒有日志,沒有錯誤,應用程序只是掛起,並出現 ANR(應用程序無響應)消息,並提示終止應用程序。
我確實意識到服務“崩潰”了,它的線程和其他部分將繼續正常工作。 服務對象上似乎沒有代碼運行,嘗試寫入磁盤從未成功。 通過電纜調試沒有在超過 1 mb 長的日志上提供任何有用的信息......
我正在嘗試通過 Wifi adb 監控設備。 完成后,將發布結果
在“主”線程中進行一些長時間的操作時,會發生ANR。 這是事件循環線程,如果繁忙,則Android無法處理任何其他事件,因此會引發ANR對話框。
要確定代碼的哪一部分阻塞了主線程,您可以在每個線程狀態和堆棧跟蹤詳細信息可用的情況下提取traces.txt。
adb pull /data/anr/traces.txt
如何避免ANR
https://developer.android.com/training/articles/perf-anr.html
下面的工具也可以幫助對其進行跟蹤。
Systrace
https://developer.android.com/studio/profile/systrace-commandline.html
TraceView
https://developer.android.com/studio/profile/traceview.html
Anr追蹤:
我建議您創建一個帶有所需消息日志的文本文件,以嘗試查找崩潰的地方,或者甚至在可能的情況下在其中寫入Exception輸出。 在有人提到如何編寫文本文件Log的地方檢查此線程 ,然后使用它在運行的服務中編寫檢查點。 它不是最終的解決方案,也不是調試,但是在許多情況下日志記錄是有幫助的。
希望能幫助到你!
MainActivity在服務被銷毀時將其停止。 只需將其取消綁定到onDestroy中,即可使該服務保持運行狀態。 請看這個例子 。 該示例還建議使用onStart和onStop而不是onCreate和onDestroy來綁定和取消綁定您的服務。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.