Console у Xcode-у: кључни појмови, излаз података и отклањање грешака

Аутор: IT Sectr Објављено: 2026-05-06 Време читања: 8 мин

Console у Xcode-у је алат за отклањање грешака за iOS развој, који приказује излаз NSLog, print, os_log и crash-логова апликације у реалном времену. Према Apple Unified Logging, од iOS 10 Apple препоручује коришћење os_log уместо NSLog за централизовано прикупљање порука кроз Unified Logging System. Console обједињује излаз дебагера и системске поруке у јединственом прозору Debug Area, доступном у било ком тренутку развоја.

Главно

  • Console Xcode — прозор Debug Area за преглед NSLog, os_log, print и crash-логова iOS апликације
  • Unified Logging System — модеран Apple систем логирања са категоријама, нивоима и чувањем на диску
  • os_log — препоручени API за логирање са подршком за динамичко подешавање нивоа
  • Crash-логови се аутоматски приказују у Console-у при паду апликације на уређају или симулатору
  • Breakpoint-логови — излаз порука у Console без заустављања извршења кроз Debugger Command

Шта је Console у Xcode-у

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 логирања: NSLog, os_log и print

Три главна API су доступна iOS програмеру за излаз у Console: NSLog (застарео), os_log (препоручен) и print (само Swift). Сваки има своје карактеристике у погледу перформанси, форматирања и компатибилности са Unified Logging System.

NSLog — класично логирање

NSLog — функција из Foundation, доступна у Objective-C и Swift. NSLog приказује поруку са временском ознаком, именом процеса и PID-ом. Недостаци: NSLog пише у системски бафер синхроно, блокирајући тренутни ток током писања. При честим позивима (нпр. у петљи), NSLog ствара приметно кашњење. Apple не препоручује NSLog за нове пројекте, али остаје компатибилан са старим кодом и библиотекама трећих страна.

os_log — савремени стандард

os_log — API из os.framework, представљен у iOS 10. os_log је асинхрон: порука се ставља у ред и уписује у бафер без блокирања позивајућег тока. Према WWDC 2016, os_log је 50 пута бржи од NSLog-а у сценаријима са високим оптерећењем. os_log такође подржава динамичко управљање: поруке DEBUG нивоа се прикупљају само у Debug верзији, у Release се игноришу без додатних трошкова перформанси.

print() — Swift-only излаз

print() — најједноставнији начин излаза у Swift-у. print пише у stdout (стандардни излаз), који Xcode преусмерава у Console. print не додаје метаподатке (време, ниво), али подржава stdout-баферизацију. За брзо отклањање грешака print је згодан алат, али за стално логирање заостаје за os_log-ом по функционалности и контроли.

swift
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: категорије, нивои и подсистеми

Unified Logging System (ULS) — свеобухватна Apple инфраструктура логирања, уведена у iOS 10 и macOS Sierra. ULS прикупља поруке од свих процеса система у јединствено складиште са могућношћу даљинског приступа кроз log командну линију на Mac-у. Програмер користи os_log за упис у ULS, а Console за читање.

Подсистеми и категорије

Сваки OSLog се идентификује паром subsystem (нпр. com.myapp.network) и category (нпр. http, websocket). Подсистем је домен апликације (једна апликација може имати више подсистема за различите модуле). Категорија је компонента унутар подсистема. Комбинација subsystem + category омогућава флексибилно филтрирање логова у Console-у и log collect-у.

Нивои логирања OSLog

НивоOSLogTypeПриказ у ConsoleПрикупљање у Release
Default.defaultУвекДа
Info.infoКада је os_log UI укљученДа
Debug.debugСамо у Debug верзијиНе
Error.errorУвек са црвеном ознакомДа
Fault.faultУвек са љубичастом ознакомДа

log collect — даљинско прикупљање логова

Команда log collect на Mac-у прикупља архивиране логове са повезаног iOS уређаја у .logarchive датотеку. Ова датотека се може отворити у Console.app на Mac-у за детаљну анализу, укључујући os_log поруке, crash-логове и системске дијагностике. За укључивање прикупљања на уређају потребно је активирати Developer Mode и повезати уређај преко USB-а.

Рад са Console: корак по корак отклањање грешака и анализа crash-логова

Практичан рад са Console-ом укључује три главна сценарија: активно логирање током развоја, анализа crash-логова након пада и даљинска дијагностика кроз .logarchive. За сваки сценарио постоји оптималан скуп алата и подешавања.

Подешавање Console за развој

Препоручује се креирање засебног OSLog-а за сваки модул апликације са нивоима: debug (детално отклањање грешака), info (кључни прелази стања), error (изузеци и откази). У Console Xcode-у укључите филтер по подсистему ваше апликације како бисте искључили системске поруке које стварају шум и одвлаче пажњу од логике апликације.

Анализа crash-лога

При паду апликације Xcode аутоматски зауставља извршење и приказује ток на коме се догодио пад, са комплетним stack-om у Console. Први ред crash-лога садржи тип изузетка (NSException, EXC_BAD_ACCESS) и узрок (reason). Проучите stack trace одоздо према горе: последњи позвани метод је место пада. За шифроване адресе (у Release) потребна је симболикација кроз dSYM.

swift
// Пример модуларног подешавања 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)

Напредне могућности: breakpoint-логови и прилагођени формати

Xcode Console подржава неколико напредних функција које превазилазе једноставно логирање. Breakpoint-логови омогућавају приказ порука у Console без заустављања извршења, а LLDB команде у Debugger Command дају потпуну контролу над форматирањем излаза.

Breakpoint-логови без заустављања

Можете подесити breakpoint тако да приказује поруку у Console и аутоматски настави извршење. Поставите breakpoint на жељеној линији, кликните десним тастером → Edit Breakpoint → додајте Debugger Command: «po self» или «expr @import UIKit» + Debugger Command: «po self.view». Означите Automatically continue after evaluating. Након покретања, breakpoint ће приказивати резултат команде у Console приликом сваког достизања линије, без прекидања тока.

LLDB команде у Console

Console Xcode подржава извршавање произвољних LLDB команди током заустављања на breakpoint-у. po (print object) приказује опис објекта, p (print) — примитивне вредности, а expr — извршава Swift/ObjC изразе. За форматирани излаз користите p/CGRectGetWidth. LLDB излаз се приказује у Console одмах након достизања breakpoint-а.

swift
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)
}

Интеграција са Instruments

Console Xcode је тесно интегрисана са Instruments — алатом за профилисање Xcode. При покретању апликације кроз Product → Profile са шаблоном Logging, све os_log поруке се уписују у трасу Instruments са временским ознакама. Ово омогућава истовремено виђење логова, перформанси и системских догађаја на истој временској скали, што је критично за дијагностику race condition и регресије перформанси.

Често постављана питања

Која је разлика између NSLog и os_log?

NSLog — синхрони, блокира ток и увек приказује поруку. os_log — асинхрони, 50 пута бржи у сценаријима са високим оптерећењем, подржава категорије и динамичко искључивање debug нивоа у Release верзији без губитка перформанси.

Зашто Console не приказује os_log из апликације?

Проверите ниво логирања: подразумевано Console приказује само default и више. За преглед info и debug отворите os_log мени у Console Xcode и изаберите Include Info Messages и Include Debug Messages, такође у подешавањима шеме (Edit Scheme → Run → Arguments → OS_ACTIVITY_MODE = debug).

Како сачувати лог Console у датотеку за слање?

Изаберите потребне поруке у Console, копирајте (Cmd + C) и налепите у било који текстни едитор. За потпуни дамп користите команду терминала: sudo log collect --device --output /tmp/app_logs.logarchive — она чува све логове са iOS уређаја у структуираном формату.

Како укључити os_log у Release верзији?

os_log типа .default и .error раде у Release подразумевано. За .info и .debug у Release потребно је додати аргумент покретања -OSLogPreferencesApp «$(PRODUCT_BUNDLE_IDENTIFIER):debug» у Xcode шему. Без овог аргумента debug поруке се не прикупљају у Release, што штеди ресурсе уређаја.

Како пронаћи конкретан crash-лог у историји?

Отворите Window → Organizer → Crashes у Xcode. Организатор приказује све crash-логове прикупљене са уређаја тестера, груписане по типу изузетка. За симболикацију је потребан .dSYM фајл од верзије на којој се догодио пад — Xcode га аутоматски проналази када је архива доступна.

Закључак

  • Console Xcode — уграђени алат за преглед NSLog, os_log, print и crash-логова у Debug Area
  • os_log — препоручени API са асинхроним уписом, категоријама и подршком за Unified Logging System
  • Unified Logging пружа подсистеме и категорије за модуларну организацију логова
  • Breakpoint-логови приказују поруке у Console без заустављања извршења апликације
  • LLDB команде po, p, expr дају потпуну контролу над форматирањем излаза у конзоли
  • Анализа crash-логова почиње од изузетка у Console и захтева симболикацију кроз dSYM за Release
  • Интеграција са Instruments омогућава спајање логова са профилисањем на једној временској скали

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође