Интерпретировать запись Logcat: threadid = 8: все еще приостановлено после отмены (sc = 1 dc = 1 s = Y) - PullRequest
6 голосов
/ 10 марта 2012

Я запускаю около десяти AsyncTasks после запуска моего приложения.Иногда эмулятору требуется много времени для запуска этих задач.Когда это происходит, я вижу следующее сообщение в журнале cat:

D / dalvikvm (1983): threadid = 8: все еще приостановлено после отмены (sc = 1 dc = 1 s = Y)

Когда эмулятор выполняется быстро, это сообщение не появляется.Как ни странно, это поведение изменилось сегодня без каких-либо изменений.Так как я явно назначил 512 МБ оперативной памяти для эмулятора, он больше не очень медленный ~ 5 минут, теперь ~ 5 с.На реальном устройстве у меня никогда не было такого медленного выполнения.

Я хотел бы понять, что означает это сообщение журнала cat.Я понимаю, что поток с указанным идентификатором приостановлен и не работает в этом состоянии.Но почему?После чего отменить?Что означает (sc = 1 dc = 1 s = Y)?

Ответы [ 3 ]

4 голосов
/ 29 июля 2013

Сообщение приходит от dvmSuspendSelf(), который потоки вызывают, когда отладчик (через поток JDWP) просит их приостановить.

Способ, которым он должен работать (где «мы» - поток):

  • JDWP просит нас приостановить
  • мы говорим, что мы приостановлены и идем спать
  • в конце концов, отладчик разбудит нас и мы возобновим

Сообщение регистрируется, когда переменная условия, которую ВМ ожидает по сигналам, но по какой-то причине мы все еще помечены как приостановленные.Код отмечает:

/*
 * 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 boolean.

Обратите внимание, что в пряниках пропал флаг "s = Y" - способ подвешивания нитей был изменен .

4 голосов
/ 19 февраля 2013

Эта ветка старая, но этот ответ должен быть полезен для пользователей, натолкнувшихся на этот вопрос несколько месяцев спустя.

Цитирование ответа пользователя в цепочке группы google

Существует странное взаимодействие между виртуальной машиной и вашим отладчиком.Нить приостановилась, а затем ждала, когда ее разбудят.Однако, когда он проснулся, отладчик (d = 1) все еще помечал поток как приостановленный (s = 1).

Я сталкивался с этим на эмуляторе и на телефоне.сам.Если отладчик отключен от устройства (будь то эмулированное или реальное), это условие ошибки сбрасывается.Я не нашел другого способа избежать этой проблемы.

В другом ответе SO утверждается, что это связано с несинхронизацией точек останова - Ошибка DexFile.class в eclipse

Вы можете попробовать это тоже.

HTH

0 голосов
/ 29 июля 2013

Я тоже сталкивался с проблемой.Просто потому, что после того, как я запустил новый Thread (), я попытался получить доступ к тому материалу в потоке, который уже был приостановлен.Удален этот код, и проблема решена.

HTH

...