问题 应用程序死于“发送信号”。但没有例外或其他信息


我正在研究一种通过蓝牙记录数据的应用程序,但它在数小时收集数据后会间歇性地崩溃(很难找到错误)。

logcat输出不是很有帮助:

http://i.imgur.com/EalnX.png

没有抛出异常,也没有任何线索导致进程被终止。

我怎么能弄清楚出了什么问题?是否有抛出的异常没有被logcat显示?如何跟踪此错误?


7189
2017-07-10 19:58


起源



答案:


信号9是SIGKILL,它将立即终止进程(进程内的处理程序不会运行)。从日志行开始,进程自杀,因此它不是发出SIGKILL的外部代理。

我的猜测(实际上是猜测)是在你的进程中运行的内存管理代码(作为基础结构的一部分,而不是你编写的代码)决定你已经耗尽了一些资源,唯一的办法是死掉。我希望在日志中达到此点之前会有更多消息,因此可能值得浏览日志历史记录,以查看此前此过程中是否存在有用的警告。

紧接在此之前的行是GC日志,这意味着某种内存资源正在运行。但看起来堆不够,所以分配失败似乎不太可能。如果分配的对象太大而无法容纳在堆上,或者碎片阻止分配,则仍然可能会出现分配失败。不过,在这种情况下,我希望看到更多相关的日志消息。

我认为捕获更多日志(如果需要可能通过应用程序的PID过滤它)将帮助您取得进展。


10
2017-07-10 20:21



你说得对,我在日志中提到了一些我忽略的信息。谢谢! - 9us


答案:


信号9是SIGKILL,它将立即终止进程(进程内的处理程序不会运行)。从日志行开始,进程自杀,因此它不是发出SIGKILL的外部代理。

我的猜测(实际上是猜测)是在你的进程中运行的内存管理代码(作为基础结构的一部分,而不是你编写的代码)决定你已经耗尽了一些资源,唯一的办法是死掉。我希望在日志中达到此点之前会有更多消息,因此可能值得浏览日志历史记录,以查看此前此过程中是否存在有用的警告。

紧接在此之前的行是GC日志,这意味着某种内存资源正在运行。但看起来堆不够,所以分配失败似乎不太可能。如果分配的对象太大而无法容纳在堆上,或者碎片阻止分配,则仍然可能会出现分配失败。不过,在这种情况下,我希望看到更多相关的日志消息。

我认为捕获更多日志(如果需要可能通过应用程序的PID过滤它)将帮助您取得进展。


10
2017-07-10 20:21



你说得对,我在日志中提到了一些我忽略的信息。谢谢! - 9us


就我而言,日志中没有任何警告或任何线索。

终于 我发现我的问题是我要进行的其中一项活动
 (假设活动X)正在注册广播接收器但从未注销过它。

因此,通过关闭活动(活动X)并返回它导致注册 再次 到同一个广播接收器 - 这造成了混乱!

简单地添加 unregisterReceiver(mybroadcast); (在活动X中)解决了它。
(我把我加到了onDestroy。确保你注销了 正确的位置)。

如果你非常绝望,我建议看看这个幻灯片分享解释 Android崩溃调试 你的错误。


4
2018-04-27 23:16



谢谢。这并没有解决我的“不例外”问题,但修复了另一个我无法发现的讨厌的bug :) - goodfellow