Xcode-da Console: əsas anlayışlar, məlumat çıxışı və debug

Müəllif: IT Sectr Dərc olunub: 2026-05-06 Oxuma vaxtı: 8 dəq

Xcode-da Console, iOS inkişafı üçün debug alətidir, NSLog, print, os_log və tətbiqin crash-loqlarını real vaxtda göstərir. Apple Unified Logging-ə görə, iOS 10-dan etibarən Apple Unified Logging System vasitəsilə mərkəzləşdirilmiş mesaj toplanması üçün NSLog əvəzinə os_log istifadə etməyi tövsiyə edir. Console debugger çıxışını və sistem mesajlarını Debug Area-nın vahid pəncərəsində birləşdirir, inkişafın istənilən anında əlçatandır.

Əsas məqamlar

  • Console Xcode — iOS tətbiqinin NSLog, os_log, print və crash-loqlarına baxmaq üçün Debug Area pəncərəsi
  • Unified Logging System — kateqoriyalar, səviyyələr və diskə yazma ilə müasir Apple loqlama sistemi
  • os_log — səviyyələrin dinamik konfiqurasiyası dəstəyi ilə tövsiyə edilən loqlama API-si
  • Crash-loqlar tətbiq cihazda və ya simulyatorda çökdükdə Console-da avtomatik göstərilir
  • Breakpoint-loqlar — Debugger Command vasitəsilə icranı dayandırmadan Console-da mesajların çıxışı

Xcode-da Console nədir

Console — Xcode-da Debug Area-nın bir hissəsi, redaktorun aşağı panelində yerləşir (View → Debug Area → Activate Console, Cmd + Shift + Y düymələri). Console işləyən tətbiqin bütün mətn çıxışını göstərir: NSLog, os_log, print mesajları, icra zamanı xəbərdarlıqlar (runtime warnings) və tətbiq çökdükdə avtomatik istisna zrzları.

Console həm simulyatorda, həm də fiziki cihazda işləyir. Simulyatorda mesajlar lokal pipe vasitəsilə dərhal gəlir, cihazda — USB bağlantısı ilə 1–3 kadr gecikmə ilə. İstehsal tətbiqləri üçün cihazda Console əlçatan deyil — tərtibatçı Crashlytics və ya log collect vasitəsilə uzaqdan toplama ilə Unified Logging-ə etibar edir.

Mac-dakı Console.app sistem tətbiqindən fərqli olaraq, Xcode-da Console pəncərəsi yalnız cari işləyən tətbiqin loqlarını göstərir (filtrləmə imkanı ilə). Console.app Mac-da bütün proseslərin, o cümlədən iOS simulyatorlarının loqlarını toplayır. Bununla belə, iOS tətbiqlərinin debug edilməsi üçün tərtibatçılar LLDB debuggeri ilə inteqrasiyaya görə daxili Xcode Console-dan istifadə edirlər.

Loqlama API-ləri: NSLog, os_log və print

Üç əsas API iOS tərtibatçısı üçün Console-da çıxış üçün mövcuddur: NSLog (köhnəlmiş), os_log (tövsiyə edilən) və print (yalnız Swift). Hər birinin performans, formatlaşdırma və Unified Logging System ilə uyğunluq baxımından öz xüsusiyyətləri var.

NSLog — klassik loqlama

NSLog — Foundation-dan funksiya, Objective-C və Swift-də mövcuddur. NSLog vaxt damğası, proses adı və PID ilə mesaj çıxarır. Çatışmazlıqlar: NSLog sistem buferinə sinxron yazır, yazma zamanı cari thread-i bloklayır. Tez-tez çağırışlarda (məsələn, dövrədə) NSLog nəzərə çarpan gecikmə yaradır. Apple yeni layihələr üçün NSLog tövsiyə etmir, lakin o, köhnə kod və üçüncü tərəf kitabxanaları ilə uyğun qalır.

os_log — müasir standart

os_log — iOS 10-da təqdim edilmiş os.framework-dən API. os_log asinxrondur: mesaj növbəyə qoyulur və çağıran thread-i bloklamadan buferə yazılır. WWDC 2016-ya görə, os_log yüksək yüklü ssenarilərdə NSLog-dan 50 dəfə sürətlidir. os_log həmçinin dinamik idarəetməni dəstəkləyir: DEBUG səviyyəli mesajlar yalnız Debug quruluşunda toplanır, Release-də performans itkisi olmadan nəzərə alınmır.

print() — yalnız Swift çıxışı

print() — Swift-də ən sadə çıxış üsulu. print stdout-a (standart çıxış) yazır, Xcode onu Console-a yönləndirir. print metadata (vaxt, səviyyə) əlavə etmir, lakin stdout buferləşməsini dəstəkləyir. Sürətli debug üçün print rahat alətdir, lakin daimi loqlama üçün funksionallıq və nəzarət baxımından os_log-dan geri qalır.

swift
import os.log

// NSLog — köhnəlmiş, bloklayan
NSLog("Application started")

// os_log — tövsiyə edilən, asinxron
let log = OSLog(
    subsystem: "com.myapp",
    category: "lifecycle"
)
os_log("Application started", log: log)

// print — sürətli Swift çıxışı
print("Application started")

Unified Logging: kateqoriyalar, səviyyələr və alt sistemlər

Unified Logging System (ULS) — iOS 10 və macOS Sierra-da təqdim edilmiş Apple-ın kompleks loqlama infrastrukturudur. ULS bütün sistem proseslərindən mesajları vahid anbarda toplayır və Mac-da log əmr sətri aləti vasitəsilə uzaqdan giriş imkanı verir. Tərtibatçı ULS-ə yazmaq üçün os_log, oxumaq üçün Console-dan istifadə edir.

Alt sistemlər və kateqoriyalar

Hər bir OSLog subsystem (məsələn, com.myapp.network) və category (məsələn, http, websocket) cütlüyü ilə identifikasiya olunur. Alt sistem tətbiqin domenidir (bir tətbiqin müxtəlif modullar üçün bir neçə alt sistemi ola bilər). Kateqoriya alt sistem daxilində komponentdir. subsystem + category kombinasiyası Console və log collect-da loqları çevik filtrləməyə imkan verir.

OSLog loqlama səviyyələri

SəviyyəOSLogTypeConsole-da göstərilməRelease-də toplama
Default.defaultHəmişəBəli
Info.infoos_log UI aktiv olduqdaBəli
Debug.debugYalnız Debug quruluşundaXeyr
Error.errorHəmişə qırmızı etiketləBəli
Fault.faultHəmişə bənövşəyi etiketləBəli

log collect — uzaqdan loq toplanması

log collect əmri Mac-da qoşulmuş iOS cihazından arxivləşdirilmiş loqları .logarchive faylına toplayır. Bu fayl Mac-da Console.app-da ətraflı analiz üçün açıla bilər, o cümlədən os_log mesajları, crash-loqlar və sistem diaqnostikası. Cihazda toplamanı aktivləşdirmək üçün Developer Mode-u yandırmaq və cihazı USB ilə qoşmaq lazımdır.

Console ilə iş: addım-addım debug və crash-loqların analizi

Praktiki iş Console ilə üç əsas ssenarini əhatə edir: inkişaf zamanı aktiv loqlama, çökdükdən sonra crash-loqların analizi və .logarchive vasitəsilə uzaqdan diaqnostika. Hər ssenari üçün optimal alət və parametrlər dəsti var.

İnkişaf üçün Console-un qurulması

Tövsiyə olunur hər bir tətbiq modulu üçün ayrıca OSLog yaratmaq: debug (ətraflı debug), info (əsas vəziyyət keçidləri), error (istisnalar və nasazlıqlar). Xcode Console-da tətbiqinizin alt sistemi üzrə filtri aktivləşdirin ki, səs-küy yaradan və tətbiq məntiqindən yayındıran sistem mesajlarını istisna edəsiniz.

Crash-loqun analizi

Tətbiq çökdükdə Xcode avtomatik olaraq icranı dayandırır və Console-da tam stack trace ilə çöküşün baş verdiyi thread-i göstərir. Crash-loqun ilk sətri istisna növünü (NSException, EXC_BAD_ACCESS) və səbəbini (reason) ehtiva edir. Stack trace-i aşağıdan yuxarıya öyrənin: son çağırılan metod çöküş yeridir. Şifrələnmiş ünvanlar üçün (Release-də) dSYM vasitəsilə symbolication tələb olunur.

swift
// OSLog-un modul konfiqurasiyası nümunəsi
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"
    )
}

// Səviyyələrlə istifadə
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)

Qabaqcıl imkanlar: breakpoint-loqlar və xüsusi formatlar

Xcode Console sadə loqlamadan kənara çıxan bir neçə qabaqcıl funksiyanı dəstəkləyir. Breakpoint-loqlar icranı dayandırmadan Console-da mesaj çıxarmağa imkan verir, Debugger Command-da LLDB əmrləri isə çıxışın formatlaşdırılması üzərində tam nəzarət verir.

Dayandırmadan breakpoint-loqlar

Breakpoint-i elə konfiqurasiya edə bilərsiniz ki, o, Console-da mesaj çıxarsın və avtomatik icranı davam etdirsin. Lazımi sətirdə breakpoint qoyun, sağ klik → Edit Breakpoint → Debugger Command əlavə edin: «po self» və ya «expr @import UIKit» + Debugger Command: «po self.view». Automatically continue after evaluating işarələyin. İşə saldıqdan sonra breakpoint hər dəfə sətirə çatdıqda thread-i kəsmədən əmr nəticəsini Console-da göstərəcək.

Console-da LLDB əmrləri

Xcode Console dəstəkləyir breakpoint-də dayanma zamanı ixtiyari LLDB əmrlərinin icrasını. po (print object) obyektin təsvirini, p (print) — primitiv dəyərləri, expr isə Swift/ObjC ifadələrini icra edir. Formatlaşdırılmış çıxış üçün p/CGRectGetWidth istifadə edin. LLDB çıxışı breakpoint-ə çatdıqdan dərhal sonra Console-da göstərilir.

swift
func processUserData(user: User) {
    // Burada Debugger Command ilə breakpoint:
    // po "User name: \(user.name)"
    // expr user.age = 30
    print("Processing user: \(user.name)")
}

// Ardıcıllıqla xüsusi loqlama nümunəsi
func trackMethodCall(
    file: String = #file,
    function: String = #function
) {
    os_log("[\(function)] called",
        log: .uiLifecycle, type: .debug)
}

Instruments ilə inteqrasiya

Xcode Console Instruments — Xcode profil aləti ilə sıx inteqrasiya olunub. Tətbiqi Product → Profile vasitəsilə Logging şablonu ilə işə saldıqda, bütün os_log mesajları vaxt damğaları ilə Instruments trekinə yazılır. Bu, loqları, performansı və sistem hadisələrini eyni vaxt şkalasında görməyə imkan verir ki, bu da race condition və performans reqresiyasının diaqnostikası üçün vacibdir.

Tez-tez verilən suallar

NSLog və os_log arasında nə fərq var?

NSLog — sinxron, thread-i bloklayır və həmişə mesaj çıxarır. os_log — asinxron, yüksək yüklü ssenarilərdə 50 dəfə sürətli, kateqoriyaları dəstəkləyir və performans itkisi olmadan Release quruluşunda debug səviyyələrinin dinamik söndürülməsini təmin edir.

Niyə Console tətbiqdən os_log göstərmir?

Loqlama səviyyəsini yoxlayın: standart olaraq Console yalnız default və yuxarısını göstərir. Info və debug-u görmək üçün Console Xcode-da os_log menyusunu açın və Include Info Messages və Include Debug Messages seçin, həmçinin sxem parametrlərində (Edit Scheme → Run → Arguments → OS_ACTIVITY_MODE = debug).

Console loqunu göndərmək üçün fayla necə saxlamaq olar?

Lazımi mesajları Console-da seçin, kopyalayın (Cmd + C) və istənilən mətn redaktoruna yapışdırın. Tam zrz üçün terminal əmrindən istifadə edin: sudo log collect --device --output /tmp/app_logs.logarchive — bu, iOS cihazından bütün loqları strukturlaşdırılmış formatda saxlayır.

Release quruluşunda os_log-u necə aktivləşdirmək olar?

.default və .error tipli os_log Release-də standart olaraq işləyir. Release-də .info və .debug üçün Xcode sxeminə -OSLogPreferencesApp «$(PRODUCT_BUNDLE_IDENTIFIER):debug» başlanğıc arqumentini əlavə etmək lazımdır. Bu arqument olmadan debug mesajları Release-də toplanmır ki, bu da cihaz resurslarına qənaət edir.

Tarixdə konkret crash-loqunu necə tapmaq olar?

Xcode-da Window → Organizer → Crashes açın. Organizer testçilərin cihazlarından toplanmış bütün crash-loqları istisna növünə görə qruplaşdırılmış şəkildə göstərir. Symbolication üçün çöküşün baş verdiyi quruluşdan .dSYM faylı lazımdır — Xcode arxiv mövcud olduqda onu avtomatik tapır.

Nəticə

  • Console Xcode — Debug Area-da NSLog, os_log, print və crash-loqlarına baxmaq üçün daxili alət
  • os_log — asinxron yazma, kateqoriyalar və Unified Logging System dəstəyi ilə tövsiyə edilən API
  • Unified Logging loqların modul təşkili üçün alt sistemlər və kateqoriyalar təqdim edir
  • Breakpoint-loqlar tətbiqin icrasını dayandırmadan Console-da mesaj çıxarır
  • LLDB əmrləri po, p, expr konsolda çıxışın formatlaşdırılması üzərində tam nəzarət verir
  • Crash-loqların analizi Console-da istisna ilə başlayır və Release üçün dSYM vasitəsilə symbolication tələb edir
  • Instruments ilə inteqrasiya loqları profil ilə bir vaxt şkalasında birləşdirməyə imkan verir

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun