Добрый день.
Я хотел бы поговорить о том, как можно упростить поддержку iOS-приложений.
- Мы упрощаем поддержку приложений iOS. Часть 1 — не отрываясь от Xcode
- Мы упрощаем поддержку приложений iOS. Часть 2 – местоположение и сеть
- Мы упрощаем поддержку приложений iOS. Часть 3 - сбой и логи
И после этой фразы можно было потратить несколько часов, пытаясь понять, как «это» произошло.
Если вам знакома такая ситуация, или вы хотели бы узнать, как уберечься от этого в будущем, обратитесь, пожалуйста, к коту.
И так, мы создали приложение для себя или для заказчика и идет процесс тестирования.
Тестировщики, как и заказчик, могут находиться от вас за 1000 км.
Итак, давайте рассмотрим несколько ситуаций, в которых вас уведомляют о странной ошибке, и вам либо трудно, либо невозможно ее воспроизвести.
Хит парада сложно воспроизвести или сложно отладить.
То есть либо до проблемы сложно добраться (нужно далеко зайти в приложение с совершенно особыми условиями, и даже несмотря на то, что погода за окном должна быть ровно -40, а ваше местоположение должно быть на экваторе), или вам нужно повторить одно и то же действие много раз.
В последнем случае то, что на каждой итерации попадаешь в точку останова как-то напрягает, но именно на этой строчке кода должно что-то произойти, на этом действительно нужно остановиться, когда нам посчастливится воспроизвести ошибку .
Каждый, кто разрабатывает приложения для iOS/MAC, всегда устанавливал точки останова и пытался понять, что происходит, прежде чем приложение выйдет из строя/поведет себя некорректно.
К сожалению, разработчики часто используют малую часть доступного им функционала.
Я порылся на Хабре и нашел всего одну статью о полноценном использовании точек останова.
Об отладке приложения с помощью lldb вообще глухой (ну или мои поисковые способности не позволили мне найти нужную статью).
Контрольные точки Отличный статья , но я не увидел там описания Символическая точка останова .
Итак, рекомендую вам прочитать статью, и я расскажу вам о Символические точки останова .
И так, вам удалось получить тот самый запуск, который воспроизводит некорректное поведение.
И скажем, это происходит, когда UIViewController только что появился, но вот незадача, у вас нет реализованного метода -[MyViewController viewDidAppear:] и нет делегата Уинавигатионвиевконтроллер , ни чего-либо подобного в вашем коде, что помогло бы установить точку останова в нужный момент. Именно в этой ситуации вам пригодится Символическая точка останова .
Вам просто нужно ввести символ -[UIViewController viewDidAppear:]
и ты остановишься в нужный момент.
Еще одно очень полезное приложение Символическая точка останова - вы получили проект от другого разработчика и есть описание проблемы от тестировщика.
И вы понимаете, как этого добиться в приложении, но как отобразить это в коде? База кода может быть колоссальной, а анимация намекает на то, что происходит. -[UINavigationController pushViewController:animated:] , но где это происходит, не ясно.
Добавлять Символическая точка останова : -[UINavigationController pushViewController:animated:] и мы сосредоточимся на всех вызовах этого метода.
Однако при использовании Символическая точка останова для системных функций у вас нет ни себя , ни один _cmd , ничего из того, что обычно доступно.
Так что к контроллеру придется подойти снаружи, и он вам поможет. lldb .
LLDB Во время запуска приложения нажмите паузу - вы увидите (лдб) ? Это консоль отладчика.
Есть много полезных команд, которые он может выполнять, и самая первая из них — помощь .
Теперь вы можете увидеть остальные полезные команды.
Самым популярным является по (объект печати).
Она распечатывает это -[Описание отладки NSObject] , В отличие НСлог какие результаты -[Описание NSObject] .
Стоит иметь это ввиду при переопределении описания для более удобного входа в приложение, не забудьте также отладочное описание .
Продолжим с того места, на котором остановились: у вас есть консоль и вы находитесь в нужном месте приложения.
Но, как минимум, нужно получить полную иерархию UIView и было бы неплохо иметь все ивары Мойвиевконтроллер ? Чтобы узнать указатель на UIWindow нашего приложения, нам нужно набрать
У нас есть указатель на UIWindow, теперь давайте получим указатель на rootViewControllerpo [[[UIApplication sharedApplication] delegate] window]
po [(UIWindow *)<pointer> rootViewController]
Теперь у нас есть указатель на главный контроллер.
С помощью подобных манипуляций мы можем добраться до нужного нам контроллера, пройдя через дочерние элементы или свойства.
И так, у нас есть указатель на нашу Мойвиевконтроллер .
Допустим, нам нужно его целое число _ивар , никто не создавал для него свойство (лишние геттер и сеттер нам не нужны).
Мы набираем po ((MyViewController *)<pointer>)->_ivar
Теперь у нас есть все, что нам нужно.
Отображение информации об объектах — это лишь часть функционала.
Вы хотите, чтобы анимация на устройстве стала медленнее, как в симуляторе кликов.
Переключить медленную анимацию ? Вот вариант, как это сделать без перезапуска приложения expr -- ((CALayer *)[[[[UIApplication sharedApplication] delegate] window] layer]).
speed = 0.2
Готово - на время этого запуска у вас медленная анимация и вы можете сделать это ровно в нужный момент и именно в этот запуск.
А когда надоест, верните значение 1 .
Эти примеры могут быть наивными, но они дают представление об основном функционале.
И да, помните, я описал невероятную ситуацию - -40 && экватор.
Теперь никто не мешает вам подменить значения на лету, перед выполнением критического участка кода, и все будет выглядеть так, будто вы находитесь на экваторе, а за вашим окном -40. долото В предыдущем описании есть один большой недостаток — до нужного контроллера добраться очень долго и дорого.
Но есть проект, который вам поможет - долото .
Этот товарищ умеет многое, список команд можно найти здесь .
Если вам непонятно, как лежит вид, потому что он прозрачный, то границы можно выделить (например, командой маски).
Вы можете, зная текст на кнопке, найти ее (команда pa11y).
А если заранее подготовиться и убедиться, что текст accessibilityLabel совпадает с текстом элемента, то можно искать что угодно.
После установки долото , список его команд будет добавлен к полному списку того, что он может делать lldb .
Для меня хитом парада является просмотры И ПВХ .
Эти команды отобразят иерархию UIView и UIViewController. Если вдруг понадобится понять, что это за команда и как она работает, набираем помощь .
В общем, я рекомендую вам ознакомиться с этим инструментом или хотя бы установить его, потому что когда вы нажимаете на него и у вас все еще есть проблема, все, что вы можете сделать, это вырвать волосы на голове, если у вас их нет. помощник под рукой.
Замечательные возможности lldb и Chisel на этом не заканчиваются.
В них можно копаться бесконечно.
Но для большинства небольших проектов этого будет вполне достаточно.
Присоединиться к процессу Предположим, что у нас есть хорошая основа для отладки, мы установили долото , и теперь мы можем в нужный момент lldb набирать номер помощь и, благодаря встроенным и дополнительным командам, понять, что с нами не так, прямо здесь и прямо на этом запуске.
Мы можем делать все это, пока наше приложение работает из Xcode на устройстве или симуляторе.
Но что делать, если мы обнаружили ошибку просто во время использования приложения на устройстве? Вы можете успеть подойти к Xcode и попросить его присоединиться к приложению.
Для этого вам нужно Xcode→Debug→Attach to Process. Вы можете использовать имя приложения, но Xcode сам угадает цель.
Заключение Сегодня мы рассмотрели случай, когда у вас есть приложение, идет бета-тестирование, есть невероятное описание или непонятный результат, и вы понятия не имеете, как это произошло.
Надеюсь, теперь у вас есть направление, с которого можно начать расследование.
Теги: #xcode #iOS #отладка #разработка iOS #отладка #xcode
-
Химера Электронного Правительства
19 Oct, 24 -
Какая Там Дезинфекция?
19 Oct, 24 -
Icfpc-2008: Первые Впечатления
19 Oct, 24 -
#18 Мосдроид Аргон На Ламоде — Анонс
19 Oct, 24 -
40 «Глупых» Вопросов О Crm
19 Oct, 24