Console în Xcode: concepte cheie, ieșire de date și depanare

Autor: IT Sectr Publicat: 2026-05-06 Timp de citire: 8 min

Console în Xcode este un instrument de depanare pentru dezvoltarea iOS, care afișează ieșirea NSLog, print, os_log și logurile de crash ale aplicației în timp real. Conform Apple Unified Logging, începând cu iOS 10, Apple recomandă utilizarea os_log în loc de NSLog pentru colectarea centralizată a mesajelor prin Unified Logging System. Console combină ieșirea debuggerului și mesajele sistemului într-o fereastră unică Debug Area, accesibilă în orice moment al dezvoltării.

Principalele puncte

  • Console Xcode — fereastra Debug Area pentru vizualizarea NSLog, os_log, print și logurilor de crash ale aplicației iOS
  • Unified Logging System — sistem modern de logare Apple cu categorii, niveluri și salvare pe disc
  • os_log — API recomandat pentru logare cu suport pentru configurarea dinamică a nivelurilor
  • Logurile de crash sunt afișate automat în Console la căderea aplicației pe dispozitiv sau simulator
  • Breakpoint-logs — ieșirea mesajelor în Console fără oprirea execuției prin Debugger Command

Ce este Console în Xcode

Console — parte a Debug Area în Xcode, situată în panoul inferior al editorului (View → Debug Area → Activate Console, combinația Cmd + Shift + Y). Console afișează întreaga ieșire text a aplicației rulate: mesaje de la NSLog, os_log, print, avertismente de rulare (runtime warnings) și dump-uri automate de excepții la crash-ul aplicației.

Console funcționează atât pe simulator, cât și pe dispozitivul fizic. Pe simulator, mesajele sosesc instantaneu printr-un pipe local, pe dispozitiv — prin conexiune USB cu o întârziere de 1–3 cadre. Pentru aplicațiile de producție, Console pe dispozitiv nu este disponibilă — dezvoltatorul se bazează pe Crashlytics sau Unified Logging cu colectare la distanță prin log collect.

Spre deosebire de aplicația de sistem Console.app pe Mac, fereastra Console în Xcode arată doar logurile aplicației curente rulate (cu posibilitatea de filtrare). Console.app colectează logurile tuturor proceselor de pe Mac, inclusiv simulatoarele iOS. Cu toate acestea, pentru depanarea aplicațiilor iOS, dezvoltatorii folosesc Console Xcode integrată datorită integrării cu debuggerul LLDB.

API-uri de logare: NSLog, os_log și print

Trei API-uri principale sunt disponibile dezvoltatorului iOS pentru ieșirea în Console: NSLog (învechit), os_log (recomandat) și print (doar Swift). Fiecare are caracteristici proprii în ceea ce privește performanța, formatarea și compatibilitatea cu Unified Logging System.

NSLog — logare clasică

NSLog — funcție din Foundation, disponibilă în Objective-C și Swift. NSLog afișează mesajul cu marcaj temporal, numele procesului și PID. Dezavantaje: NSLog scrie în bufferul sistemului sincron, blocând thread-ul curent pe durata scrierii. La apeluri frecvente (de exemplu, într-o buclă), NSLog creează o întârziere vizibilă. Apple nu recomandă NSLog pentru proiecte noi, dar rămâne compatibil cu codul vechi și bibliotecile terțe.

os_log — standard modern

os_log — API din os.framework, introdus în iOS 10. os_log este asincron: mesajul este pus în coadă și scris în buffer fără a bloca thread-ul apelant. Conform WWDC 2016, os_log este de 50 de ori mai rapid decât NSLog în scenariile cu încărcare mare. os_log suportă și gestionarea dinamică: mesajele de nivel DEBUG sunt colectate doar în compilarea Debug, în Release sunt ignorate fără costuri de performanță.

print() — ieșire doar Swift

print() — cea mai simplă metodă de ieșire în Swift. print scrie în stdout (ieșire standard), pe care Xcode o redirecționează către Console. print nu adaugă metadate (timp, nivel), dar suportă bufferizarea stdout. Pentru depanare rapidă, print este un instrument convenabil, dar pentru logare permanentă este inferior os_log în ceea ce privește funcționalitatea și controlul.

swift
import os.log

// NSLog — învechit, blocant
NSLog("Application started")

// os_log — recomandat, asincron
let log = OSLog(
    subsystem: "com.myapp",
    category: "lifecycle"
)
os_log("Application started", log: log)

// print — ieșire rapidă Swift
print("Application started")

Unified Logging: categorii, niveluri și subsisteme

Unified Logging System (ULS) — infrastructura completă de logare Apple, introdusă în iOS 10 și macOS Sierra. ULS colectează mesaje de la toate procesele sistemului într-un depozit unic cu posibilitatea de acces la distanță prin instrumentul de linie de comandă log pe Mac. Dezvoltatorul folosește os_log pentru scrierea în ULS și Console pentru citire.

Subsisteme și categorii

Fiecare OSLog este identificat printr-o pereche subsystem (de exemplu, com.myapp.network) și category (de exemplu, http, websocket). Subsistemul este domeniul aplicației (o aplicație poate avea mai multe subsisteme pentru module diferite). Categoria este o componentă în cadrul subsistemului. Combinația subsystem + category permite filtrarea flexibilă a logurilor în Console și log collect.

Niveluri de logare OSLog

NivelOSLogTypeAfișare în ConsoleColectare în Release
Default.defaultÎntotdeaunaDa
Info.infoLa activarea os_log UIDa
Debug.debugDoar în compilarea DebugNu
Error.errorÎntotdeauna cu etichetă roșieDa
Fault.faultÎntotdeauna cu etichetă violetăDa

log collect — colectarea la distanță a logurilor

Comanda log collect pe Mac colectează logurile arhivate de pe dispozitivul iOS conectat într-un fișier .logarchive. Acest fișier poate fi deschis în Console.app pe Mac pentru analiză detaliată, inclusiv mesaje os_log, loguri de crash și diagnostice de sistem. Pentru activarea colectării pe dispozitiv, este necesar să activați Developer Mode și să conectați dispozitivul prin USB.

Lucrul cu Console: depanare pas cu pas și analiza logurilor de crash

Lucrul practic cu Console include trei scenarii principale: logare activă în timpul dezvoltării, analiza logurilor de crash după cădere și diagnosticare la distanță prin .logarchive. Pentru fiecare scenariu există un set optim de instrumente și setări.

Configurarea Console pentru dezvoltare

Se recomandă crearea unui OSLog separat pentru fiecare modul al aplicației cu niveluri: debug (depanare detaliată), info (tranziții cheie de stare), error (excepții și defecțiuni). În Console Xcode, activați filtrul după subsistemul aplicației dvs. pentru a exclude mesajele de sistem care creează zgomot și distrag atenția de la logica aplicației.

Analiza logului de crash

La căderea aplicației, Xcode oprește automat execuția și arată thread-ul pe care a avut loc crash-ul, cu stack trace complet în Console. Prima linie a logului de crash conține tipul excepției (NSException, EXC_BAD_ACCESS) și cauza (reason). Examinați stack trace de jos în sus: ultima metodă apelată este locul crash-ului. Pentru adrese criptate (în Release) este necesară simbolizarea prin dSYM.

swift
// Exemplu de configurare modulară 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"
    )
}

// Utilizare cu niveluri
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)

Caracteristici avansate: breakpoint-logs și formate personalizate

Xcode Console suportă mai multe funcții avansate care depășesc logarea simplă. Breakpoint-logs permit afișarea mesajelor în Console fără oprirea execuției, iar comenzile LLDB în Debugger Command oferă control complet asupra formatării ieșirii.

Breakpoint-logs fără oprire

Puteți configura un breakpoint astfel încât să afișeze un mesaj în Console și să continue automat execuția. Plasați breakpoint pe linia dorită, faceți clic dreapta → Edit Breakpoint → adăugați Debugger Command: «po self» sau «expr @import UIKit» + Debugger Command: «po self.view». Bifați Automatically continue after evaluating. După pornire, breakpoint va afișa rezultatul comenzii în Console la fiecare atingere a liniei, fără a întrerupe thread-ul.

Comenzi LLDB în Console

Console Xcode suportă executarea comenzilor LLDB arbitrare în timpul opririi pe breakpoint. po (print object) afișează descrierea obiectului, p (print) — valori primitive, iar expr — execută expresii Swift/ObjC. Pentru ieșire formatată, utilizați p/CGRectGetWidth. Ieșirea LLDB este afișată în Console imediat după atingerea breakpoint-ului.

swift
func processUserData(user: User) {
    // Breakpoint aici cu Debugger Command:
    // po "User name: \(user.name)"
    // expr user.age = 30
    print("Processing user: \(user.name)")
}

// Exemplu de logare personalizată cu secvență
func trackMethodCall(
    file: String = #file,
    function: String = #function
) {
    os_log("[\(function)] called",
        log: .uiLifecycle, type: .debug)
}

Integrarea cu Instruments

Console Xcode este strâns integrată cu Instruments — instrumentul de profiling Xcode. La rularea aplicației prin Product → Profile cu șablonul Logging, toate mesajele os_log sunt înregistrate în trasa Instruments cu marcaje temporale. Acest lucru permite vizualizarea simultană a logurilor, performanței și evenimentelor sistemului pe aceeași scară de timp, ceea ce este esențial pentru diagnosticarea race condition și a regresiei de performanță.

Întrebări frecvente

Care este diferența dintre NSLog și os_log?

NSLog — sincron, blochează thread-ul și afișează întotdeauna mesajul. os_log — asincron, de 50 de ori mai rapid în scenarii cu încărcare mare, suportă categorii și dezactivarea dinamică a nivelurilor debug în compilarea Release fără pierdere de performanță.

De ce Console nu afișează os_log din aplicație?

Verificați nivelul de logare: în mod implicit, Console afișează doar default și mai sus. Pentru a vedea info și debug, deschideți meniul os_log în Console Xcode și selectați Include Info Messages și Include Debug Messages, de asemenea, în setările schemei (Edit Scheme → Run → Arguments → OS_ACTIVITY_MODE = debug).

Cum să salvez logul Console într-un fișier pentru trimitere?

Selectați mesajele dorite în Console, copiați (Cmd + C) și lipiți în orice editor de text. Pentru un dump complet, utilizați comanda terminal: sudo log collect --device --output /tmp/app_logs.logarchive — aceasta salvează toate logurile de pe dispozitivul iOS într-un format structurat.

Cum să activez os_log în compilarea Release?

os_log de tip .default și .error funcționează în mod implicit în Release. Pentru .info și .debug în Release, trebuie să adăugați argumentul de lansare -OSLogPreferencesApp «$(PRODUCT_BUNDLE_IDENTIFIER):debug» în schema Xcode. Fără acest argument, mesajele debug nu sunt colectate în Release, ceea ce economisește resursele dispozitivului.

Cum găsesc un log de crash specific în istoric?

Deschideți Window → Organizer → Crashes în Xcode. Organizatorul afișează toate logurile de crash colectate de pe dispozitivele testerilor, grupate pe tipul de excepție. Pentru simbolizare, este necesar fișierul .dSYM de la compilarea pe care a avut loc crash-ul — Xcode îl găsește automat atunci când arhiva este disponibilă.

Concluzii

  • Console Xcode — instrument încorporat pentru vizualizarea NSLog, os_log, print și logurilor de crash în Debug Area
  • os_log — API recomandat cu scriere asincronă, categorii și suport pentru Unified Logging System
  • Unified Logging oferă subsisteme și categorii pentru organizarea modulară a logurilor
  • Breakpoint-logs afișează mesaje în Console fără a opri execuția aplicației
  • Comenzile LLDB po, p, expr oferă control complet asupra formatării ieșirii în consolă
  • Analiza logurilor de crash începe cu excepția în Console și necesită simbolizare prin dSYM pentru Release
  • Integrarea cu Instruments permite combinarea logurilor cu profilingul pe aceeași scară de timp

Vom dezvolta o aplicație mobilă la cheie

IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.

Discutați proiectul

Citiți și