我正在开发一个通过蓝牙记录数据的应用程序,但在收集数据数小时后它会间歇性地崩溃(使得很难追踪错误)。
logcat 输出不是很有帮助:
没有抛出异常,也没有任何导致进程终止的线索。
我怎样才能弄清楚出了什么问题?是否抛出了 logcat 未显示的异常?我怎样才能找到这个错误?
我正在开发一个通过蓝牙记录数据的应用程序,但在收集数据数小时后它会间歇性地崩溃(使得很难追踪错误)。
logcat 输出不是很有帮助:
没有抛出异常,也没有任何导致进程终止的线索。
我怎样才能弄清楚出了什么问题?是否抛出了 logcat 未显示的异常?我怎样才能找到这个错误?
信号 9 是 SIGKILL,它将立即终止进程(进程内不会运行任何处理程序)。从日志行来看,该进程正在杀死自己,因此它不是发出 SIGKILL 的外部代理。
我的猜测(实际上是猜测)是在您的进程中运行的内存管理代码(作为基础架构的一部分,而不是您编写的代码)决定您已经耗尽了一些资源,唯一的办法就是死。我希望在日志中达到这一点之前会有更多消息,因此可能值得浏览日志历史记录以查看在此之前的进程是否有有用的警告。
紧接在此之前的行是 GC 日志,这意味着某种内存资源正在运行不足。但看起来堆没有满,所以分配失败似乎不太可能。如果正在分配的对象太大而无法放入堆中,或者碎片阻止它被分配,您仍然可能会遇到分配失败。不过,我希望在这种情况下看到更多相关的日志消息。
我认为捕获更多日志(如有必要,可能通过应用程序的 PID 对其进行过滤)将帮助您取得进展。
就我而言,日志中没有警告或任何线索。
最终我发现我的问题是我正在进行的一项活动
(比如说活动 X)正在注册到广播接收器,但从未取消注册。
因此,通过关闭活动(活动 X)并返回它导致再次注册到同一个广播接收器 - 这导致了混乱!
只需添加unregisterReceiver(mybroadcast);
(在活动 X 中)即可解决。
(我将我的添加到 onDestroy。确保您在正确的位置取消注册)。
如果你非常绝望,我建议你看这个幻灯片分享,它解释了Android 崩溃调试你的错误。
使用 RXjava 并且没有实现onError
回调方法时会出现此问题