Console в Xcode — это инструмент отладки для iOS-разработки, отображающий вывод NSLog, print, os_log и краш-логов приложения в реальном времени. По данным Apple Unified Logging, начиная с iOS 10 Apple рекомендует использовать os_log вместо NSLog для централизованного сбора сообщений через Unified Logging System. Console объединяет вывод отладчика и системные сообщения в едином окне Debug Area, доступном в любой момент разработки.
Главное
Console — часть Debug Area в Xcode, расположенная в нижней панели редактора (View → Debug Area → Activate Console, сочетание Cmd + Shift + Y). Console показывает весь текстовый вывод от запущенного приложения: сообщения от NSLog, os_log, print, ошибки компиляции на лету (runtime warnings) и автоматические дампы исключений при краше приложения.
Console работает как в симуляторе, так и на физическом устройстве. В симуляторе сообщения приходят мгновенно через локальный pipe, на устройстве — через USB-соединение с задержкой 1–3 кадра. Для продакшн-приложений Console на устройстве недоступна — разработчик полагается на Crashlytics или Unified Logging с удалённым сбором через log collect.
В отличие от системного приложения Console.app на Mac, окно Console в Xcode показывает только логи текущего запущенного приложения (с возможностью фильтрации). Console.app собирает логи всех процессов на Mac, включая iOS-симуляторы. Однако для отладки iOS-приложений разработчики используют встроенную Console Xcode из-за интеграции с отладчиком LLDB.
Три основных API доступны iOS-разработчику для вывода в Console: NSLog (устаревший), os_log (рекомендованный) и print (Swift-only). Каждый имеет свои особенности по производительности, форматированию и совместимости с Unified Logging System.
NSLog — функция из Foundation, доступная в Objective-C и Swift. NSLog выводит сообщение с меткой времени, именем процесса и PID. Недостатки: NSLog пишет в системный буфер синхронно, блокируя текущий поток на время записи. При частых вызовах (например, в цикле) NSLog создаёт заметную задержку. Apple не рекомендует NSLog для новых проектов, но он остаётся совместимым со старым кодом и сторонними библиотеками.
os_log — API из os.framework, представленный в iOS 10. os_log асинхронен: сообщение ставится в очередь и записывается в буфер без блокировки вызывающего потока. По данным WWDC 2016, os_log в 50 раз быстрее NSLog в высоконагруженных сценариях. os_log также поддерживает динамическое управление: сообщения DEBUG-уровня собираются только в Debug-сборке, в Release они игнорируются без накладных расходов.
print() — самый простой способ вывода в Swift. print пишет в stdout (стандартный вывод), который Xcode перенаправляет в Console. print не добавляет метаданные (время, уровень), но поддерживает stdout-буферизацию. Для быстрой отладки print — это удобный инструмент, но для постоянного логирования он уступает os_log по функциональности и контролю.
import os.log
// NSLog — устаревший, блокирующий
NSLog("Application started")
// os_log — рекомендованный, асинхронный
let log = OSLog(
subsystem: "com.myapp",
category: "lifecycle"
)
os_log("Application started", log: log)
// print — быстрый Swift-вывод
print("Application started")
Unified Logging System (ULS) — сквозная инфраструктура логирования Apple, введённая в iOS 10 и macOS Sierra. ULS собирает сообщения от всех процессов системы в единое хранилище с возможностью удалённого доступа через log command-line tool на Mac. Разработчик использует os_log для записи в ULS, а Console для чтения.
Каждый OSLog идентифицируется парой subsystem (например, com.myapp.network) и category (например, http, websocket). Подсистема — это домен приложения (одно приложение может иметь несколько подсистем для разных модулей). Категория — это компонент внутри подсистемы. Комбинация subsystem + category позволяет гибко фильтровать логи в Console и log collect.
| Уровень | OSLogType | Отображение в Console | Сбор в Release |
|---|---|---|---|
| Default | .default | Всегда | Да |
| Info | .info | При включённом os_log UI | Да |
| Debug | .debug | Только в Debug-сборке | Нет |
| Error | .error | Всегда с красной меткой | Да |
| Fault | .fault | Всегда с фиолетовой меткой | Да |
Команда log collect на Mac собирает архивированные логи с подключённого iOS-устройства в файл .logarchive. Этот файл можно открыть в Console.app на Mac для детального анализа, включая сообщения os_log, краш-логи и системные диагностики. Для включения сбора на устройстве требуется включить Developer Mode и подключить устройство по USB.
Практическая работа с Console включает три основных сценария: активное логирование во время разработки, анализ краш-логов после падения и удалённую диагностику через .logarchive. Для каждого сценария есть оптимальный набор инструментов и настроек.
Рекомендуется создать отдельный OSLog для каждого модуля приложения с уровнями: debug (подробная отладка), info (ключевые переходы состояний), error (исключения и сбои). В Console Xcode включите фильтр по подсистеме вашего приложения, чтобы исключить системные сообщения, которые создают шум и отвлекают от логики приложения.
При падении приложения Xcode автоматически останавливает выполнение и показывает thread, на котором произошёл краш, с полным stack trace в Console. Первая строка краш-лога содержит тип исключения (NSException, EXC_BAD_ACCESS) и причину (reason). Изучите stack trace снизу вверх: последний вызванный метод — место краша. Для зашифрованных адресов (в Release) требуется symbolication через dSYM.
// Пример модульной настройки OSLog
extension OSLog {
static let uiLifecycle = OSLog(
subsystem: "com.myapp.ui",
category: "lifecycle"
)
static let network = OSLog(
subsystem: "com.myapp.network",
category: "http"
)
static let database = OSLog(
subsystem: "com.myapp.data",
category: "core-data"
)
}
// Использование с уровнями
os_log("View did load", log: .uiLifecycle, type: .debug)
os_log("HTTP 200 received", log: .network, type: .info)
os_log("Failed to save: \(error.localizedDescription)",
log: .database, type: .error)
Xcode Console поддерживает несколько продвинутых функций, которые выходят за рамки простого логирования. Breakpoint-логи позволяют выводить сообщения в Console без остановки выполнения, а LLDB-команды в Debugger Command дают полный контроль над форматированием вывода.
Вы можете настроить breakpoint так, чтобы он выводил сообщение в Console и автоматически продолжал выполнение. Установите breakpoint на нужной строке, кликните правой кнопкой → Edit Breakpoint → добавьте Debugger Command: «po self» или «expr @import UIKit» + Debugger Command: «po self.view». Отметьте Automatically continue after evaluating. После запуска breakpoint будет выводить результат команды в Console при каждом достижении строки, не прерывая поток.
Console Xcode поддерживает выполнение произвольных LLDB-команд во время остановки на breakpoint. po (print object) выводит описание объекта, p (print) — примитивные значения, и expr — выполняет Swift/ObjC-выражения. Для форматированного вывода используйте p/CGRectGetWidth. LLDB-вывод отображается в Console сразу после достижения breakpoint.
func processUserData(user: User) {
// Breakpoint здесь с Debugger Command:
// po "User name: \(user.name)"
// expr user.age = 30
print("Processing user: \(user.name)")
}
// Пример кастомного логирования с последовательностью
func trackMethodCall(
file: String = #file,
function: String = #function
) {
os_log("[\(function)] called",
log: .uiLifecycle, type: .debug)
}
Console Xcode тесно интегрирована с Instruments — инструментом профилирования Xcode. При запуске приложения через Product → Profile с шаблоном Logging, все os_log-сообщения записываются в трассу Instruments с временными метками. Это позволяет одновременно видеть логи, производительность и системные события на одной временной шкале, что критично для диагностики race condition и performance regression.
Часто задаваемые вопросы
NSLog — синхронный, блокирует поток и всегда выводит сообщение. os_log — асинхронный, в 50 раз быстрее в высоконагруженных сценариях, поддерживает категории и динамическое отключение debug-уровней в Release-сборке без потери производительности.
Проверьте уровень логирования: по умолчанию Console показывает только default и выше. Для просмотра info и debug откройте меню os_log в Console Xcode и выберите Include Info Messages и Include Debug Messages в настройках схемы (Edit Scheme → Run → Arguments → OS_ACTIVITY_MODE = debug).
Выделите нужные сообщения в Console, скопируйте (Cmd + C) и вставьте в любой текстовый редактор. Для полного дампа используйте команду терминала: sudo log collect --device --output /tmp/app_logs.logarchive — она сохраняет все логи с iOS-устройства в структурированном формате.
os_log типа .default и .error работают в Release по умолчанию. Для .info и .debug в Release нужно добавить аргумент запуска -OSLogPreferencesApp "$(PRODUCT_BUNDLE_IDENTIFIER):debug" в схему Xcode. Без этого аргумента debug-сообщения не собираются в Release, что экономит ресурсы устройства.
Откройте Window → Organizer → Crashes в Xcode. Органайзер показывает все краш-логи, собранные с устройств тестировщиков, сгруппированные по типу исключения. Для symbolication нужен .dSYM-файл от той сборки, на которой произошёл краш — Xcode автоматически находит его при наличии архива.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также