Android:长时间运行的应用程序停止响应如何调试

时间:2016-10-14 17:57:26

标签: android service hang android-service-binding

我有一个长时间运行Service,它运行正常,但是,几个小时后,它停止响应(它似乎正在执行,但事实并非如此)。我希望找出原因/方法。

故障/错误永远不会“在电缆上”发生,因此在本地桌面计算机上进行调试不起作用。

我还将日志写入磁盘,以便遵循Service的“流程”,但没有发生故障(MyService网络工作,至少每20秒一次,但可能是更多)

我有一个扎根的Android设备。

在此设备中,我使用Wifi(IEE802.11)与ESP8266进行通信。

为此,我有一个无限期运行的服务。我有“开始”和“停止”动作来控制它。它由以下内容启动和停止:

MainActivity:

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,它们似乎工作正常,即使MyService停止响应“约束活动”。

为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;
    }
}

据我所知,当“bug”发生时,就是当我绑定一个Activity(几个可能会被绑定一次),然后转到后台,几个小时之后,当一个“绑定” “不在前台的活动”进入前台,没有任何反应,没有日志,没有错误,应用程序只是挂起,并且出现ANR(应用程序无响应)消息,并提示终止应用程序。

更新25 / 10/2016

所有绑定都已删除并经过测试。该服务将停止运营,在大约40~500分钟内没有出现故障原因的迹象。该设备发出“异常发生”的声音,它是三星SM-T810平板电脑,没有任何内容写入日志,没有DDMS堆栈跟踪,没有路径可以跟踪......

我确实意识到服务“崩溃”,其线程和其他部分将继续正常工作。似乎服务对象上没有代码运行,写入磁盘的尝试从未成功。 通过电缆进行调试并没有对1 mb以上的日志提供任何有用的信息......

我正试图通过Wifi adb监控设备。一旦完成,将发布结果

3 个答案:

答案 0 :(得分:1)

ANR发生在" main"线。这是事件循环线程,如果它很忙, 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追踪:

Interpreting an ANR stack trace

答案 1 :(得分:-1)

我建议您创建一个文本文件,其中包含所需消息的日志,以尝试找到崩溃的位置,或者甚至在可能的情况下编写异常输出。检查this thread,其中有人提到如何编写文本文件Log,然后使用它在正在运行的服务中编写检查点。它不是最终解决方案或调试,但在许多情况下,日志记录有所帮助。

希望它有所帮助!

答案 2 :(得分:-1)

MainActivity在销毁时会停止服务。只需在onDestroy中取消绑定即可使服务继续运行。请看一下这个example。该示例还建议使用onStart和onStop而不是onCreate和onDestroy来绑定和取消绑定您的服务。

相关问题