android - 解释 Logcat 条目 : threadid=8: still suspended after undo (sc=1 dc=1 s=Y)

标签 android dalvik android-logcat

在我的应用程序启动后,我运行了大约十个 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/

相关文章:

java - 未从 Intent 接收数据

java - 如何清除android中的后台进程?

android - 浏览器发送 "Dalvik"作为用户代理

android - 请任何人都可以在 LogCat 中解释这个异常

android - 在存储库容器上找不到参数 [] 的方法 google()。 ( flutter )

android - 简单的日期格式。日期解析

java - 两个正整数乘以long的结果为负值

android - 使用 javax/net/SocketFactory.class 转换为 Dalvik 格式失败,错误 1

android - 如何在 Android 上为 Catlog 授予 root 权限

android - Logcat 中显示的时间