- WatchDog. Что это такое? Схема реализации с таймером и схема реализации на RunLoop'e.
- Как собирать результат работы WatchDog. Примеры того, что можно таким образом найти, и что мы нашли на проекте ICQ.
- Как работать с полученными результатами. Анализ стеков потоков. Профилирование с учетом расходов на синхронизацию.
- Проблемы при работе с WatchDog. Системные механизмы и популярные библиотеки, вызывающие проблемы. Методы обхода этих проблем. Итоговые параметры, применяемые на проекте ICQ.
2. Беда - UI тормозит
• iOS приложение тоже может тормозить
• У вас все отлично – у тестировщика тормозит
• Пользователь хочет написать, а приложение занято
своими делами
• У всех все отлично, но 30% неведомых пользователей
жалуются на тормоза
3. Как систематически решать проблему
тормозов?
• Тормоза UI – это когда главный поток чем-то занят и не
может 60 раз в секунду отдавать картинку приложения
• Нужно ловить процедуры, которые занимают главный
поток слишком долго
8. Логировать
превышение лимита
времени
NSLog(@"%@: iteration of run loop %p took %.f
ms to execute", self, self.runLoop, (double)duration
* 1000);
NSLog(@"WATCHDOG: task took longer than %d
seconds", self.timeout);
Main thread was blocked for 1.25s
+ Можно собирать проблемы без
остановки приложения
− Сложно понять, что является
источником проблемы
9. Кидать исключение
для создания
крэшлога
Exception Type: SIGABRT
Exception Codes: #0 at 0x383bc1f0
Crashed Thread: 20
Thread 0:
0 libsystem... semaphore_wait_trap + 8
1 TCC TCCAccessPreflight + 210
2 AddressBook ABCDBContextCreateWithPathAndAddressBook + 70
3 AddressBook ABCCreateAddressBookWithDatabaseDirectoryA...
4 AddressBook ABAddressBookCreateWithDatabaseDirectory + 72
5 AddressBook ABAddressBookCreateWithOptionsAndPolicy + 144
6 AddressBook ABAddressBookCreateWithOptions + 86
7 ICQ +[AddressBookManager newAddressBook]
...
16 Graphics... GSEventRunModal + 136
17 UIKit UIApplicationMain + 1134
18 ICQ main (main.mm:23)
19 libdyld.dylibstart + 0
+ Можно смотреть стек главного
потока – очень высока
вероятность, что там будет
видна причина проблемы.
− Приложение останавливается.
Пользователь вынужден
начинать все с начала.
27. При сворачивании приложения оно
“засыпает”
До сворачивания После активацииРабота в фоне
● В фоне легко попасть в промежуток, когда
приложение выгружено
● При сворачивании и разворачивании выполняются
тяжелые системные операции
40. Остановка и запуск
До сворачивания После активацииРабота в фоне
Важно остановиться как можно раньше при
сворачивании и стартануть как можно позже при
активации
Стоп Старт
44. На позитивной ноте
• Мы оперативно понимаем, что вызывает торможение на
главном потоке
• Это настолько удобно, что хочется так же на остальных
потоках
https://github.com/maxgordeev/MRWatchdog