IOs Debug Master

Одного разу я майже повністю відмовився від мишки для навігації Xcode і цілком цьому радий. Наступний крок – це відмова від візуальних засобів керування відладчиком. Навіщо? — Збільшуємо можливості, зменшуємо час дебагу, витрачаємо менше калорій для переміщення важкої ручки (нам калорії потрібні, щоб головою працювати) і тим самим провокуємо менше тунельного синдрому.

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

Не розглядаю такі теми: як працювати в Xcode, як взагалі налагоджувати додаток, коли потрібно це робити і навіщо, що таке LLDB, що таке Step Into і Step Over і т.д.

Відразу до прикладів:

Налаштовуємо консоль

Відмовляємось ось від цієї панельки:

Та й ось про цю скоро забудемо

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

Дякую моєму колезі: він здійснив мою давню мрію – відкривати консоль відладчика у новому вікні. А то завжди напружувало, що тільки відкрив і налаштував вкладки як тобі треба, то одразу ж при першому брейкпоінті все заперечилося. Щоб цього не було, йдемоXcode -> Behaviours -> Edit behaviours.Далі нам потрібна секціяRunning -> Pause.

ВибираємоShow tab named, пишемо туди нашу унікальну назву вкладки, наприкладDebug(зауважу, що при повторних запусках вкладка не дублюється), наприкінці ставимоactive window— це, як не дивно, відкриває нову вкладку (Cmd+T) для нашого відладчика. Ще я приховав непотрібну праву панель, але це за бажанням. Взагалі кастомізація середовища за різних умов — це розділBehaviours

debug

Всі миналаштовані, рухаємо далі.

Керуємо відладчиком

Додаємо відразу в скарбничку корисних hotkey'ів, хто не знавCmd + Shift + C. Це швидкий перехід у консоль.Сmd + Shift + Y- це приховати/показати консоль. Наші нові команди:Step Into-stepабо короткоsStep Over-nextабо короткоnStep Out-finishContinue-continueабоcВимкнути всі брейкпоїнти —breakpoint disable

За повним списком команд lldb можна відправитися сюди Не буду перераховувати всі можливості прямих команд LLDB, але їх список більший, ніж дозволяє зробити візуальне середовище Xcode і кожен сам має право вирішити використати йому подібний підхід чи ні і які команди потрібні та цікаві. Зупинюся на тому, що показав, куди дивитися.

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

В результаті наша робота з відладчиком виглядає так:

Swift та obj-c! Що всередині об'єкта?

Не знаю, як вам, але мені не пощастило писати проект на Swift з нуля, а довелося з виходом нової мови у величезному obj-c проекті все нові файли писати на Swifte. Не пишу про всі нестикування, але основна проблема у налагодженні, напевно, в наступному:

Створюємо простий клас моделі на Swift

Тепер пишемо на obj-c простий масив із нашим класом:

Тепер ставимо брейкпоінт на наступному рядку і дивимося на те, що ми побачили б у Variables:

Xcode

Знайомо? А де нашіnameіindexТепер дивимося, що ми можемо самі руками в консолі:

p- цеprintpo- цеprint object, кидає об'єкту повідомленняdescription, зверніть увагу, що об'єктам ще можна надіслати повідомлення debugDescriptionpo array[0].name— не працює, тому що для відладчика нульовий елемент у масиві типу id. А ось посилка повідомленняname(po [array[0] name]) чудово працює. Не забуваймо, про те, що obj-c – це message oriented мову програмування.

Знайди мене

Наступний кейс: у нас є API — ми ходимо на сервер за списком країн, потім перетворимо їх на внутрішню логіку і зберігаємо десь. Наприклад, наша modelView йде за даними у сховище та шукає модельку у словнику за ключом:

Що ми бачимо у Variables? 242 країни, чудово, як нам швидко знайти Україну?

debug

І хочу зауважити, що в рядку відладчика чудово працює автодоповнення для надсилання повідомлень у objective-c

Магічні UIView

Напевно, якщо робили якийсь нетривіальний UI були ситуації, коли щось в інтерфейсі з'їхало і потрібно розібратися, хто винен. При цьому перезапуск програма загрожує тим, що може не вдасться відтворити ситуацію. Ось тут робота з відладчиком незамінна. В результаті виконання простого

побачимо щось на кшталт такого:

А ось вам насамкінець шматок коду, який може діставати по ієрархії все view заданого класу, може видатися корисним. Сам використовую.

UPD: розширюємо набір команд LLDB

Є непогана колекція забінденних команд для LLDB від Facebook - Chisel Наприклад, там вже є команда з рекурсивним висновком вкладених view -pviewsта контролерів -pvcЄ зручні команди show/hide, які дозволяють без continue приховати або показати той чи інший шар, view. У гіті є опис команд та інструкції зі встановлення, хочу лише помітити, що вам потрібен менеджер пакетівbrew, якщо його немає і створити руками файл .lldbinit, якого у вас, як у мене, може не бути і додати туди код, який видає brew після встановлення chisel'a:

Потім створюємо файл .lldbinit у кореневій директорії та запихаємо туди скрипт:

Зверніть увагу, що скрипт може змінюватися, наприклад, той, що вказаний у гіті самого chisel відрізняється. Команди будуть доступні при перезапуску Xcode, якщо ліньки це робити, можна:

  • З налагоджувачем можна працювати не тільки через кнопочки Xcode.
  • Як настроїти відкриття консолі під час налагодження в новій вкладці? Найбільше — велика картинка
  • Швидкий перехід у консоль -Cmd + Shift + C, згорнути/розгорнути консоль -Cmd + Shift + Y
  • Наші нові команди:Step Into-stepабо короткоsStep Over-nextабо короткоnContinuecontinueабоcВимкнути всі брейкпоїнти —breakpoint disableОсь тут весь перелік команд LLDB.
  • Obj-c не бачить властивості об'єкта Swift-ового класу? Не біда:
  • У вікні variables 242 ключі у словника? Шукаємо швидко:
  • Ставимо chisel і розширюємо набір команд LLDB

Дякую всім, хто прочитав. Сподіваюся, кілька приймачів хтось собі відкрив.

Ви можете допомогти і перевести небагато коштів на розвиток сайту