在我的应用程序启动后,我运行了大约十个 AsyncTasks。有时模拟器需要很长时间才能启动这些任务。发生这种情况时,我会在日志 cat 中看到以下消息:
D/dalvikvm(1983): threadid=8: 撤消后仍然挂起 (sc=1 dc=1 s=Y)
当模拟器快速执行时,不会出现此消息。奇怪的是,这种行为今天发生了变化,没有任何修改。由于我已经明确地为模拟器分配了 512mb 内存,它不再非常慢 ~5 分钟,现在是 ~5 秒。在真实设备上,我的执行速度从来没有这么慢。
我想了解这条日志猫消息的含义。我知 Prop 有指定 id 的线程已暂停并且在此状态下不工作。但为什么?撤消后? (sc=1 dc=1 s=Y) 是什么意思?
最佳答案
该消息来自 dvmSuspendSelf()
,当调试器(通过 JDWP 线程)要求它们暂停时调用该线程。
它应该工作的方式是(其中“我们”是一个线程):
- JDWP 要求我们暂停
- 我们告诉它我们已经暂停并进入休眠状态
- 最终,调试器唤醒我们,我们继续
当 VM 正在等待信号的条件变量时记录消息,但由于某种原因我们仍被标记为暂停。代码注释:
/*
* The condition was signaled but we're still suspended. This
* can happen if the debugger lets go while a SIGQUIT thread
* dump event is pending (assuming SignalCatcher was resumed for
* just long enough to try to grab the thread-suspend lock).
*/
在这种情况下,我们的期望是当信号到达时我们被意外唤醒(例如,system_server 认为有一个 ANR,因为主线程没有响应,因为调试器已暂停它),如果我们再次循环调试器将有机会清理我们并让我们上路。
日志消息正在打印 self->suspendCount
的值(我们被告知要暂停多少次),self->dbgSuspendCount
(有多少次这些挂起请求来自调试器,因此如果调试器断开连接,我们可以“撤消”所有这些请求)和 self->isSuspended
bool 值。
注意“s=Y”标志在 Gingerbread 中消失了——线程暂停的工作方式是changed .
关于android - 解释 Logcat 条目 : threadid=8: still suspended after undo (sc=1 dc=1 s=Y),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9649282/