Android: долго работающее приложение перестает отвечать на запросы. Как отлаживать

У меня давно работает Service, работает отлично, однако через пару часов перестает отвечать (вроде бы выполняется, но это не так). Я хочу узнать, почему/как.

Сбой/ошибка никогда не происходит «по кабелю», поэтому отладка на моем локальном настольном компьютере не работает.

Я также записывал логи на диск, чтобы следить за "потоком" Service, но сбоев не происходит (MyService сеть работает, хотя бы раз в 20 секунд, но может быть и намного чаще)

У меня есть рутированное Android-устройство.

В этом устройстве я использую Wi-Fi (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 имеет длину более 3 тыс. строк, он не имеет блокирующих операций сам по себе, но содержит Thread, которые, кажется, работают правильно, даже когда 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;
    }
}

As far as I can tell, when the "bug" happens, is when I bind an Activity (several may be bound at once), then goes to background, after a couple hours, when a "Bound Activity" that was not on foreground goes to foreground, nothing happens, no Logs, no error, application just hangs, and ANR (Application Not Responding) message appears, and prompts to kill the application.

Обновление 25.10.2016

All binds have been removed and tested. The Service will halt operations, with no signs of the source of the failure at around 40 ~ 500 minutes. The device does a "exception happened" sound, its a Samsung SM-T810 tablet, nothing gets written to logs, no DDMS stacktrace, no path to follow...

Я понимаю, что Служба «упала», ее потоки и другие части будут продолжать работать правильно. Похоже, что код на сервисном объекте не запускается, попытки записи на диск так и не увенчались успехом. Отладка по кабелю не дала никакой полезной информации по логам длиной более 1 мб...

Я пытаюсь контролировать устройство через Wi-Fi adb. Как только закончу, выложу результаты


person Bonatti    schedule 14.10.2016    source источник
comment
Что за резьба у вас в сервисе? Являются ли они внутренними классами службы?   -  person Mimmo Grottoli    schedule 23.10.2016
comment
Вы можете проверить trackTrace путем экспорта из ddms   -  person Jay Shah    schedule 24.10.2016
comment
@MimmoGrottoli Среди других систем связи у меня есть Timer, TimerTask, Thread, Volley, DatagramSocket, Process, LocalBroadcastManager, BroadcastReceiver, WifiManager, IBinder. Все они являются внутренними Object этого Service, все они работают корректно, даже когда само приложение дает сбой или ожидает ANR. Насколько я могу судить, это проблема привязки, скорее всего, во всех/любых действиях, которые привязываются/уничтожаются/не обрабатываются правильно.   -  person Bonatti    schedule 25.10.2016


Ответы (2)


ANR происходит, когда в «основном» потоке выполняется какая-то длительная операция. Это поток цикла событий, и если он занят, Android не может обрабатывать дальнейшие события и, таким образом, вызывает диалоговое окно ANR.

Чтобы определить, какая часть кода блокирует основной поток, вы можете извлечь файл traces.txt, в котором доступны сведения о состоянии каждого потока и трассировке стека.

adb pull /data/anr/traces.txt

Как избежать ANR

https://developer.android.com/training/articles/perf-anr.html

нижеприведенные инструменты также могут помочь отследить это.

Системная трасса

https://developer.android.com/studio/profile/systrace-commandline.html

TraceView

https://developer.android.com/studio/profile/traceview.html

Отслеживание ошибок:

Интерпретация трассировки стека ANR

person Rajesh Gopu    schedule 26.10.2016
comment
И что мне делать, когда моей посылки нет на traces.txt и когда StrictMode ничего не показывает, - person Bonatti; 26.10.2016
comment
Не тот ответ, которого я ожидал, а лучший, который у меня был, получил награду... - person Bonatti; 27.10.2016

Я предлагаю вам создать текстовый файл с журналом желаемых сообщений, чтобы попытаться найти точку, где происходит сбой, или даже записать туда вывод исключения, если это возможно. Проверьте эту ветку, где кто-то упоминает, как написать журнал в текстовом файле, а затем использовать его для записи контрольных точек в вашей работающей службе. Это не окончательное решение или отладка, но во многих случаях помогает ведение журнала.

Надеюсь, поможет!

person Hugo    schedule 25.10.2016
comment
Как я указал в вопросе: I also written logs to disk, in order to follow the "flow" of the Service, but no failures happens. Я вижу, что поток журналов происходит правильно, однако я также вижу, что активность не возобновляется и ничего не происходит. - person Bonatti; 25.10.2016
comment
Хорошо, извините, плохо прочитал эту часть. Во всяком случае, журнал должен сказать вам, где именно происходит сбой, не так ли? - person Hugo; 25.10.2016
comment
Я надеюсь, что так и должно быть, как указано в вопросе: nothing happens, no Logs, no error, application just hangs, and ANR (Application Not Responding) message appears, and prompts to kill the application. - person Bonatti; 25.10.2016