使用Eclipse调试时,Android应用程序崩溃并显示SIGABRT信号6。

50

我的应用在没有调试器连接的设备上可以完美运行。然而,在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 杀死我的进程?


你有找到任何解决方案吗? - WindRider
到目前为止,我还没有找到解决方案。 - zyamys
我的问题与线程有关,在错误的时间调用函数或递归调用本身(堆栈溢出)有关。改变这一点就可以解决问题了。 - Codebeat
@zyamys 你的问题解决了吗?我也遇到了同样的问题。如果你解决了,请告诉我。 - Md Maidul Islam
@Maid786 我也有同样的问题,你找到解决方法了吗? - Virthuss
显示剩余2条评论
3个回答

27

Android故意杀死进程,因为它认为UI线程已经挂起,所以这就是一个ANR。

为了调试,您可以:

打开“设置”->“开发人员选项”,并勾选“显示所有ANR”。

这将为在后台运行的应用程序显示"App未响应"对话框。您可以在对话框中点击“等待”按钮,以防止系统在调试器连接之前杀死您的进程。

请注意,对于在前台运行的应用程序,该对话框会自动打开。对于后台应用程序,您必须启用此选项。


4
仍然在LG Optimus G v4.4.2上出现“致命信号6”的崩溃。不过解释得很好。 - AlikElzin-kilaka
19
问题在于,如果垃圾收集器经常占用三秒钟的时间,操作系统会终止虚拟机(从而终止您的应用程序)。作为程序员,除了对谷歌的无能症状咒骂之外,您无法做任何事情来解决这个问题。 - user458577

9

这个问题发生在我的Android 7.1.1上。

当我附加调试器时,我的应用程序总是崩溃,以及在调试模式下启动应用程序时也会出现相同的情况。

解决方法很简单:

  • 运行你的应用程序
  • 在调试中点击“静音断点”
  • 附加调试器
  • 再次点击“静音断点”取消静音
  • 完成,调试就可以正常使用了

遇到了同样的问题,使用Android 7.1.1上的Nexus 5x,尽管我在Android 6.0.1上的Galaxy S6 Edge上也看到了类似的行为。如所述,将断点静音效果很好。同样,启动调试器而没有分配任何断点是一种类似的方法,也可以起到作用。 - Brad
我在使用Android Studio的调试模式下,通过模拟器运行7.1.1版本时也遇到了这个问题。应用程序可以正常启动,但是当我进入一个带有ListView的活动时,它就会出现问题。如果我在Android Studio的普通模式下运行,则一切正常。 - Nick Wright

2
我遇到了类似的问题,但是Sam提出的建议并没有帮助我 - 我必须实际上将断点删除,然后它才对我起作用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接