我有一个应用程序在没有连接调试器的设备上运行完美.但是,在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:
进一步的调查让我相信它是故意杀死我的进程,因为它错误地认为UI线程被挂起.问题不在我的应用程序中.所以现在我的问题是:如何在调试时阻止Android杀死我的进程?
这开始在android 7.1.1中发生了
连接调试器时,我的应用程序总是崩溃,在调试模式下启动应用程序时也是如此.
为我修复的原因很简单:
运行你的应用程序
单击Debug中的"Mute Breakpoints"
附加调试器
重新单击"静音断点"以取消静音
完成,调试再次工作
android故意杀死进程,因为它认为UI线程是挂起的,所以它的ANR是正确的.为了调试目的,你可以,
转到设置 - >开发人员选项,然后选中显示所有ANR.
这将显示在后台运行的应用程序的"应用程序无响应"对话框.您可以单击对话框中的"等待"按钮,以防止系统在调试器附加之前终止您的进程.请注意,对于在前台运行的应用程序,将自动打开该对话框.对于后台应用程序,您必须启用此选项