Console у Xcode-у је алат за отклањање грешака за iOS развој, који приказује излаз NSLog, print, os_log и crash-логова апликације у реалном времену. Према 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). Сваки има своје карактеристике у погледу перформанси, форматирања и компатибилности са 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 командну линију на 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 поруке, crash-логове и системске дијагностике. За укључивање прикупљања на уређају потребно је активирати Developer Mode и повезати уређај преко USB-а.
Практичан рад са Console-ом укључује три главна сценарија: активно логирање током развоја, анализа crash-логова након пада и даљинска дијагностика кроз .logarchive. За сваки сценарио постоји оптималан скуп алата и подешавања.
Препоручује се креирање засебног OSLog-а за сваки модул апликације са нивоима: debug (детално отклањање грешака), info (кључни прелази стања), error (изузеци и откази). У Console Xcode-у укључите филтер по подсистему ваше апликације како бисте искључили системске поруке које стварају шум и одвлаче пажњу од логике апликације.
При паду апликације Xcode аутоматски зауставља извршење и приказује ток на коме се догодио пад, са комплетним stack-om у Console. Први ред crash-лога садржи тип изузетка (NSException, EXC_BAD_ACCESS) и узрок (reason). Проучите stack trace одоздо према горе: последњи позвани метод је место пада. За шифроване адресе (у Release) потребна је симболикација кроз 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 и регресије перформанси.
Често постављана питања
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. Организатор приказује све crash-логове прикупљене са уређаја тестера, груписане по типу изузетка. За симболикацију је потребан .dSYM фајл од верзије на којој се догодио пад — Xcode га аутоматски проналази када је архива доступна.
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође