Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
yura91
28 / 26 / 2
Регистрация: 23.10.2013
Сообщений: 2,218
#1

Определить взаимную блокировку (диагностика) - Android

22.09.2016, 15:41. Просмотров 205. Ответов 6
Метки нет (Все метки)

как правильно определить причину взаимной блокировки в большом приложении, в большом проекте? Как правильно собрать дамп потоков и его проанализировать?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.09.2016, 15:41     Определить взаимную блокировку (диагностика)
Посмотрите здесь:

Программно включить экран не отключая блокировку Android
Android Отключить блокировку экрана при бездействии
Android Отловить блокировку экрана

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
KEKCoGEN
Модератор
Эксперт Java
1873 / 1751 / 426
Регистрация: 28.12.2010
Сообщений: 7,102
22.09.2016, 15:48     Определить взаимную блокировку (диагностика) #2
yura91, kill -3 <pid> дает дамп потоков. Опций для просмотра и анализа дампов миллион. Можно в блокноте смотреть, а можно скачать всякие программы утилиты
yura91
28 / 26 / 2
Регистрация: 23.10.2013
Сообщений: 2,218
22.09.2016, 15:57  [ТС]     Определить взаимную блокировку (диагностика) #3
А как по самому дампу понять где была взаимная блокировка? Это место как то помечается в дампе можно пример дампа какого нибудь с блокировкой? И как там это место обозначается?
turbanoff
Модератор
3888 / 3623 / 432
Регистрация: 18.05.2010
Сообщений: 9,120
Записей в блоге: 11
Завершенные тесты: 1
22.09.2016, 15:58     Определить взаимную блокировку (диагностика) #4
Чтобы получить дамп потоков есть утиллита jstack (входит в поставку JDK).
Код
jstack -m <pid>
Если процесс JVM завис совсем
Код
jstack -F -m <pid>
yura91
28 / 26 / 2
Регистрация: 23.10.2013
Сообщений: 2,218
22.09.2016, 16:25  [ТС]     Определить взаимную блокировку (диагностика) #5
Ну дамп потоков я получу а дальше как по этому дампу понять причину deadlock как она обозначается в самом дампе? Ну по этому дампу можно понять в каком месте ошибка?

Добавлено через 1 минуту
есть какой то инструмент работы с самими дампами? или как их расшифровывать?
yura91
28 / 26 / 2
Регистрация: 23.10.2013
Сообщений: 2,218
22.09.2016, 16:47  [ТС]     Определить взаимную блокировку (диагностика) #6
Да там же как то при помощи DDMS Android Studio можно проще определить да? И еще не подскажите как правильно разобрать сам дамп потоков? Там есть id потока и прочее. Можете подробнее объяснить это все если можно?

Добавлено через 7 минут
Например если такой дамп получился
Код
"Thread-23" daemon prio=5 tid=22 NATIVE
  | group="main" sCount=1 dsCount=0 obj=0x4056fbc0 self=0x1b5da0
  | sysTid=764 nice=0 sched=0/0 cgrp=bg_non_interactive handle=1793248
  at android.os.MessageQueue.nativePollOnce(Native Method)
  at android.os.MessageQueue.next(MessageQueue.java:119)
  at android.os.Looper.loop(Looper.java:117)
  at com.que.gpslogger.module.b.a.run((null):-1)
 
"Thread-22" prio=5 tid=21 TIMED_WAIT
  | group="main" sCount=1 dsCount=0 obj=0x40573d58 self=0x1b6768
  | sysTid=765 nice=0 sched=0/0 cgrp=bg_non_interactive handle=1796256
  at java.lang.Object.wait(Native Method)
  - waiting on <0x40573cf0> (a com.que.gpslogger.d.q)
  at java.lang.Object.wait(Object.java:395)
  at com.que.gpslogger.a.run((null):-1)
  at java.lang.Thread.run(Thread.java:1019)
 
"Thread-21" prio=5 tid=20 TIMED_WAIT
  | group="main" sCount=1 dsCount=0 obj=0x4056e678 self=0x1b4b18
  | sysTid=763 nice=0 sched=0/0 cgrp=bg_non_interactive handle=1789008
  at java.lang.Object.wait(Native Method)
  - waiting on <0x4056e5c0> (a com.que.gpslogger.d.n)
  at java.lang.Object.wait(Object.java:395)
  at com.que.gpslogger.a.run((null):-1)
  at java.lang.Thread.run(Thread.java:1019)
 
"Thread-19" prio=5 tid=18 WAIT
  | group="main" sCount=1 dsCount=0 obj=0x4056d860 self=0x1b3f70
  | sysTid=761 nice=0 sched=0/0 cgrp=bg_non_interactive handle=1786024
  at java.lang.Object.wait(Native Method)
  - waiting on <0x40573458> (a java.lang.VMThread)
  at java.lang.Object.wait(Object.java:358)
  at java.lang.Thread.join(Thread.java:914)
  at com.que.gpslogger.d.k.c((null):-1)
  at com.que.gpslogger.a.run((null):-1)
  at java.lang.Thread.run(Thread.java:1019)
Как его разобрать где здесь deadlock?
turbanoff
Модератор
3888 / 3623 / 432
Регистрация: 18.05.2010
Сообщений: 9,120
Записей в блоге: 11
Завершенные тесты: 1
22.09.2016, 21:56     Определить взаимную блокировку (диагностика) #7
Ну, для начала стоит понять, почему вы решили, что у вас deadlock?
Обычно, это значит, что какой-то интересующий вас поток висит и ждёт захвата лока. Какой из этих потоков вам интересен?

PS. Наименование потоков Thread-<num> - это говнокод. Всегда давайте потокам значимые имена.

Добавлено через 2 минуты
В общем предвосхищая будущие вопросы: никакого true-way для разбора deadlock-ов нет. Вы просто смотрите на stack trace интересующих вас потоков, и пытаетесь понять, почему они заблокировались. Очень часто - это супер-нетривиальная задача.
Yandex
Объявления
22.09.2016, 21:56     Определить взаимную блокировку (диагностика)
Ответ Создать тему
Опции темы

Текущее время: 04:09. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru