Какие ключевые инструменты отладки в Xcode?

Ответ

1. Отладчик LLDB (консоль в нижней панели Xcode):

  • po (print object) — выводит описание объекта (вызывает description/debugDescription).
  • p (print) — выводит значение с информацией о типе.
  • expr — позволяет выполнить выражение во время выполнения.
  • fr v (frame variable) — показывает локальные переменные в текущем кадре стека.
    (lldb) po myArray.count
    (lldb) expr myArray.append("newItem")

2. Визуальные инструменты:

  • View Debugger (кнопка с иерархией кубов): показывает 3D-развертку UI, проверку констрейнтов и свойства каждого UIView.
  • Memory Graph Debugger (кнопка с графом): визуализирует объекты в памяти, помогает находить циклы сильных ссылок (retain cycles).

3. Инструменты производительности (Instruments): Запуск: Product -> Profile (Cmd+I).

  • Time Profiler — анализ загрузки CPU, поиск "узких" мест.
  • Allocations — отслеживание выделения и освобождения памяти.
  • Leaks — автоматический поиск утечек памяти.
  • Network — анализ сетевых запросов (длительность, объем данных).

4. Специализированные утилиты:

  • Network Link Conditioner (дополнительная загрузка в Xcode) — симуляция различных условий сети (3G, потерянные пакеты, высокая задержка).
  • Консоль macOS (Console.app) — просмотр системных логов и логов устройства, включая os_log сообщения.

5. Практический совет: Используйте символьные точки останова (Symbolic Breakpoint) для остановки на конкретных системных событиях (например, -[UIViewController viewDidLoad]) без модификации кода.

Ответ 18+ 🔞

А, ну вот, смотри, опять этот твой проект накрылся медным тазом, и ты смотришь на экран как баран на новые ворота? Не беда, я тебе сейчас, как шаман, все косточки твоему коду по полочкам разложу. Запоминай, а лучше записывай, пока не забыл.

Первое и самое простое — отладчик LLDB, эта консолька внизу Xcode. Там не просто так кнопочки мигают.

  • po — это твоя правая рука. Хочешь посмотреть, что внутри объекта твоего валяется? po myArray и вуаля — тебе вывалит всю его душу, то есть результат description. Количество элементов? po myArray.count — элементарно, Ватсон.
  • p — это как po, но для зануд. Выдаст не только значение, но и тип, чтоб ты знал, с чем имеешь дело.
  • expr — это вообще магия. Застрял на брейкпоинте и понял, что надо срочно в массив чот добавить? Без проблем, expr myArray.append("newItem") и жизнь налаживается прямо на лету.
  • fr v — когда совсем всё хуёво и ты забыл, какие переменные вокруг тебя вообще есть. Покажет всех местных обитателей текущего кадра стека.
(lldb) po myArray.count
(lldb) expr myArray.append("newItem")

Второе — визуальные штуки. Ты ж не просто так вёрстку мучал? Смотри:

  • View Debugger (кнопка с кубиками, напоминает игру тетрис). Тыкаешь на неё — и твой интерфейс разбирается на запчасти в 3D. Видно сразу, какая вьюха куда влезла, какие констрейнты её держат и почему эта чёртова кнопка уехала за экран. Просто находка для тех, у кого глаза уже квадратные.
  • Memory Graph Debugger (кнопка с графом-паутинкой). Вот это, блядь, мощнейшая вещь! Она показывает, кто на кого в памяти ссылается. Увидел на графе кучу объектов, которые держат друг друга за жопу мертвой хваткой — поздравляю, ты нашёл retain cycle, из-за которого память не утекает, а вытекает полноводной рекой.

Третье — Instruments. Это не просто «Профиль» в меню, это целый арсенал. Запускаешь через Product -> Profile (Cmd+I) и обалдеваешь от количества инструментов.

  • Time Profiler — показывает, какой кусок кода жрёт твой процессор как не в себя. Нашёл красненький столбик — нашёл место, где всё тормозит. Волшебство, ёпта.
  • Allocations — следит за каждым байтом памяти. Видишь, что память растёт как на дрожжах, а не падает — начинай копать тут.
  • Leaks — само название говорит. Сам найдёт, где ты память забыл отпустить. Правда, иногда и ложные срабатывания бывают, но в целом — спасатель.
  • Network — для тех, кто работает с сетью. Покажет, сколько данных качается, как долго и не шлёшь ли ты на сервер какую-нибудь дичь по десять раз.

Четвёртое — спецутилиты, про которые многие забывают.

  • Network Link Conditioner — её надо отдельно скачать (в Additional Tools for Xcode). Включаешь — и можешь симулировать, что твое приложение работает на дрянном 3G в лифте. Очень быстро вылезают все баги, связанные с медленной сетью или таймаутами.
  • Консоль macOS (Console.app) — это не про Xcode, но про дебаг. Туда летят все системные логи и твои os_log сообщения. Когда приложение на тестовом устройстве крешится без видимой причины, первым делом лезь сюда. Часто ответ на поверхности, просто его надо уметь прочитать.

И на закуску практический совет, который сэкономит тебе кучу нервов. Символьные точки останова (Symbolic Breakpoint). Это жесть, как удобно! Не надо лезть в каждый файл и пихать print или брейкпоинт. Хочешь ловить момент, когда у любого UIViewController вызывается viewDidLoad? Создаёшь symbolic breakpoint, пишешь -[UIViewController viewDidLoad] — и всё, ты в дамках. Приложение само остановится в нужный момент, и ты сможешь посмотреть, что происходит. Красота, а не инструмент.

Вот так вот, коротко и без лишней воды. А теперь иди и дебажь, у тебя всё получится. Главное — не паниковать.