Expert JS React Developers for TUI wanted. Join Ciklum and get a $4000 sign-on bonus!
×Закрыть

Лайфхаки з iOS app дебаггінгу

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті.

Привіт. Мене звати Роман Фурман, я iOS розробник в продуктовій студії Uptech.

Усі ми час від часу ловимо баги у своєму коді. Помилки — це частина розробки і навіть найдосвідченіші програмісти стикаються з багами. Отже, важливо знайти для себе оптимальні інструменти для швидкої та ефективної відладки.

Зі свого досвіду я виокремив для себе декілька інструментів, які допомагають швидко та завчасно виявити помилки коду. В цій статті я розповім, яких основних проблем припускаються розробники та надам рекомендації щодо використання деяких інструментів для iOS дебагінгу. Зокрема, я зупиню увагу на таких інструментах:

  1. Signpost
  2. Charles Proxy
  3. Chisel
  4. Breakpoints

Найпоширеніші баги

Невміння реєструвати повідомлення про помилки

Один з найбільш невдалих сценаріїв, на який ви можете натрапити — це коли програма виходить з ладу, однак повідомлення про помилку немає. Ви навіть не можете зрозуміти, що трапилося.

Нестача пам’яті на девайсі

Коли оперативної пам’яті на девайсі замало, iOS починає шукати місце для звільнення, перед цим надсилаючи memory warnings в відкритий додаток. Цей процес неявно впливає на CPU та батарею девайса. Якщо таке повідомлення ігнорується, а звільнення пам’яті продовжується, система примусово завершує роботу додатку. Користувач бачить це як crash, однак в репорті будуть відсутній стектрейс.

Надмірне використання мережевих запитів

Це також призводить до зменшення терміну життя батареї девайсу. Дублювання запитів та/або відсутність скасування зайвих запитів призводить до неефективного використання CPU.

Для того, щоб перевірити коректність обробки описаних випадків, пропоную скористатися наступними інструментами для відладки.

Signpost

На конференції WWDC 2018, Apple представила нову систему для логування os_log, що була розширена, інструментом для аналізу продуктивності os_signpost. Обидва фреймворка доступні в iOS 12. В документації фреймворків написано:

Marks a point of interest in your code as a time interval or as an event for debugging performance in Instruments.

Скажімо, нам необхідно перевірити, що трапляється з viewDidLoad на окремому екрані. Отже, алгоритм дій наступний:

  1. Треба проініціалізувати об’єкт OSLog, передавши кілька параметрів: bundle ідентифікатор та .pointOfInterest. Останній параметр допоможе нам відобразити наші журнали в інструменті Point of Interest.

2. Викликати функцію os_signpost з типом OSSignpostType.begin, та передати об’єкт логів, а також назву нашого виміру.

3. А також не забуваємо зробити те саме, але з типом OSSignpostType.end в кінці ваших вимірів.

Це все! Можна профілювати дані.

Charles Proxy

Загалом, Charles — це інструмент для моніторингу HTTP/HTTPS трафіку. Отже, основне призначення цієї програми — це відображення даних, отриманих та відправлених клієнтом в процесі роботи з сервером. Особливістю Charles є те, що всі отримані та відправлені дані відображаються на вашому комп’ютері зрозуміло та упорядковано.

Втім, ця програма здатна на більше ніж просто відображення запитів та відповідей. Charles — ще й чудовий інструмент для відладки коду:

Для того щоб слідкувати за трафіком нашого додатку на iOS симуляторі, необхідно встановити root сертифікат. Робимо це таким чином: Help -> SSL Proxying -> Install Charles Root Certificate in iOS Simulators.

Наприклад, ми маємо простий додаток, що відправляє запит до сервера та відображає відповідь:

Щоб імітувати відповідь від сервера, треба здійснити декілька дій:

  1. Знайти необхідних вам запит, та відкрити контекстне меню, обрати Save a response та зберегти його як .json file;
  2. В цьому ж меню необхідно обрати Map Locale. Ви побачите віконце Edit Mapping;
  3. Вкажіть file_path у полі Local path та натисніть OK.

Чудово, тепер ми можемо змінити файл на JSON. На наступний запит ви вже отримаєте рандомну відповідь.

Те ж саме можна зробити з breakpoints:

  1. Оберіть запит та відкрийте контекстне меню, оберіть Breakpoint;
  2. Після опрацювання запиту, викликається наш Breakpoint. Тим часом Charlies відкриє вікно, де можна змінити headers та body. Натисніть Execute, щоб продовжити.

3. Як тільки ви отримаєте відповідь з серверу, вікно оновиться. Тепер можна змінити response body, code, та headers. Натисніть Execute, щоб відправити підмінені дані у додаток.

Chisel

Цей фреймворк створила команда розробників з Фейсбуку. По суті це набір команд LLDB, що допоможуть вам в процесі відладки коду. Тут можна знайти гайд з встановлення цього інструменти. Chisel виконує велику кількість завдань. Декілька з них показано нижче.

1. Taplog

Taplog налаштовує breakpoint для -[UIApplication sendEvent:], а також налаштовує умови, щоб відфільтрувати всі touch events.

Після будь-якого touch івенту, запускається breakpoint та показує опис об’єкту у консолі.

2. Vs

Особисто мені ця функція не знадобилася, однак ця команда дозволяє за допомогою простого інтерфейсу рухатись крок за кроком через всю ієрархію додатку.

Інтерфейс виглядає таким чином:

Маленький приклад:

3. Pviews

Ця команда відкриває view hierarchy.

4. flicker, mask & border

Ці три команди дуже схожі, оскільки вони виконують приблизно одну й ту ж саму функцію — допомагають швидше знайти елементи UI.

  • Flicker показує та ховає елементи створюючи ефект мерехтіння;
  • Mask додає червоний колір до view;
  • vs та border додають межі.

5. Pjson

Це чудова комнада, що форматує дефолтний опис NSDictionary або NSArray на звичайний JSON.

З цього 👇🏻

На це 👇🏻

Breakpoints

Брейкпоінти в LLDB дуже ефективні особливо в Xcode UI. Нижче я розповім про декілька цікавих фіч, що можуть бути корисними.

1. Conditions

Можливо, вам відома ця функція, однак я трохи зупинюсь на ній. Щоб встановити умову, необхідно натиснути праву кнопку миші та обрати Edit Breakpoint. На зображені нижче ця функція трігеритсья, за умови що показник буде більше двох.

2. Debugger command

Брейкпоінти можуть виконувати LLDB команду через дії. Ось невеликий приклад:

thread jump -by 1 пропустить поточну лінію коду. В цьому випадку, якщо умова виконується, ми почнемо безпосередньо з функції update Label, не збільшуючи кількісний показник.

3. Apple scripts

Уявіть, що як тільки запускається breakpoint, лунає звуковий сигнал. Насправді, це можливо, оскільки breakpoints підтримують Apple Script.

AppleScript — це потужна та проста мова програмування. Вона дозволяє зробити багато чого цікавого, наприклад:скріншот, відправити повідомлення, та ін.

4. Звуковий сигнал

breakpoints також можуть підтримувати стандартні звукові сигнали. Теоретично, можна використовувати їх в AppleScript, однак це більше для розваги.

Звукові сигнали можуть статися в нагоді, якщо ви займаєтесь live debugging та вам необхідно впевнитися, що якась частина коду викликається один раз.

5. Log message

Це може бути корисним коли вам потрібно залогати якесь повідомлення чи дані^ без додавання функции print().

Ці інструменти з дебаггингу дійсно дуже ефективні та нескладні в опануванні. Завдяки їм вам вдасться ефективно та швидко знайти та видалити помилки в коді.

👍НравитсяПонравилось14
В избранноеВ избранном4
Подписаться на автора
LinkedIn

Похожие статьи

Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Дякую, Романе! Користуюся Charles Proxy та breakpoints, а от про Chisel та Signpost дуже цікаво було прочитати. Впевнений, мені стаття стане в пригоді!

До речі, розділ «Debugger command» проілюстрований помилковою картинкою, зверніть на це увагу!

Дякую. Прочитавши анонс в ТГ я вважав, що там буде щось більш цікаве, але і так непонано. Проксі вважаю лишнім, тому що всі мережеві запити намагаюсь розміщувати в одному місці і їх не складно порахувати. Проксі потрібен для reverse engineer, коли працюєш с чужим кодом.
Вже 25 років вважаю за найкращий спосіб для дебага — це print з мітками timestamp та log level.

Дякую за відгук! Слушне зауваження, але тут я більше хотів донести інформацію про можливість підміни респонсу з серверу :)
У всіх різні задачі, це всього на всього інструменти.

Дякую за статтю!

Подписаться на комментарии