2014-02-06 24 views
43

我有一个应用程序在没有附加调试器的设备上运行得非常好。但是,在Eclipse中调试时遇到问题:Android应用程序与SIGABRT Signal 6仅在Eclipse调试期间崩溃

当主线程挂起大约10秒或更长时间(例如,遇到断点后)时,主线程会抛出一个SIGABRT,显然来自libc。

我能想到的唯一解释是主线程上的消息队列在不被轮询时会溢出来自其他线程的消息。但是,当主线程暂停时,我看不到堆增长。此外,虽然我的应用在所有服务,内容提供者,广播接收者,http和地图工作者线程等之间有大约20个线程,但我无法真正想到任何过多的消息来源。

所以我的问题是:我该如何解决这个问题?我可以使用哪些工具,以及如何查找导致我的应用在调试器中暂停时崩溃的原因?

编辑1:

在logcat的唯一的一点是:

02-05 22:23:54.861: I/dalvikvm(26795): threadid=3: reacting to signal 3 
02-05 22:23:54.901: D/dalvikvm(26795): threadid=1: still suspended after undo (sc=1 dc=1) 
02-05 22:23:54.901: I/dalvikvm(26795): Wrote stack traces to '/data/anr/traces.txt' 
02-05 22:23:58.905: A/libc(26795): Fatal signal 6 (SIGABRT) at 0x000002f5 (code=0), thread 26795 (om.myapp) 

编辑2:

进一步的调查使我相信这是Android的故意杀死我的过程,因为它错误地认为UI线程被挂起。问题不在我的应用程序中。所以现在我的问题是:如何阻止Android在调试时杀死我的进程?

+0

你找到任何解决这个? – WindRider

+0

到目前为止我还没有找到解决办法。 – zyamys

+0

我的问题与线程有关,在错误的时间调用函数或递归调用本身(堆栈溢出)。改变这个可以解决问题。 – Codebeat

回答

22

安卓故意杀死进程,因为它认为UI线程是挂起的,所以它是一个ANR的权利。 为了调试的目的,你可以,

转到设置 - >开发人员选项,并选中显示所有ANR。

这将显示App Not Responding对话框,用于在后台运行的应用程序。您可以单击对话框中的“等待”按钮,以防止系统在调试器连接之前终止进程。 请注意,对于在前台运行的应用程序,该对话框会自动打开。对于后台应用程序,您必须启用该选项

+4

LG Optimus G v4.4.2上的'致命信号6'仍然崩溃。不过很好的解释。 –

+12

问题是,如果一个垃圾收集需要三秒钟(定期发生),操作系统将杀死虚拟机(从而你的应用程序)。除了诅咒谷歌因为他们的无能使他们坚持要杀你的应用程序,你没有什么可以像程序员那样做。 – 2015-05-07 20:11:49

3

这开始发生在我身上的安卓7.1.1

当安装调试我的应用程序总是崩溃,同样在调试模式下启动应用程序时。

什么固定对我来说很简单:

  • 在调试
  • 安装调试器上的“静音断点”
  • 再点击的“静音断点”运行你的应用程序
  • 点击取消静音
  • 完成,调试工作再次
+0

在Android 7.1.1上使用Nexus 5x时遇到了同样的问题,但我在Android 6.0.1的Galaxy S6 Edge中也看到了类似的行为。 按照说明静音断​​点运行良好。同样,在没有任何断点的情况下启动调试器也是一种类似的方法,它也可以工作 – Brad

+0

我也在7.1.1中使用模拟器在Android Studio的调试模式下运行时看到了这一点。应用程序开始正常,但是当我进入带有ListView的活动时,它本身就是。如果我从Android Studio以正常模式运行,那很好。 –

0

我SI类似的问题,但山姆建议没有帮助 - 我必须实际移除断点,然后才能为我工作。

0

我不得不重新安装的Android工作室一个时间和它发生第二次,它只是走的是独自