Xcode-da Console: asosiy tushunchalar, ma'lumot chiqarish va nosozliklardan tozalash

Muallif: IT Sectr Nashr etilgan: 2026-05-06 O'qish vaqti: 8 daq

Xcode-dagi Console iOS-ishlab chiqish uchun nosozliklarni tuzatish vositasi bo'lib, NSLog, print, os_log va ilovaning crash-log'larini real vaqtda ko'rsatadi. Apple Unified Logging ma'lumotlariga ko'ra, iOS 10 dan boshlab Apple Unified Logging System orqali markazlashtirilgan xabarlarni yig'ish uchun NSLog o'rniga os_log dan foydalanishni tavsiya qiladi. Console debugger chiqishi va tizim xabarlarini Debug Area ning yagona oynasida birlashtiradi, ishlab chiqishning istalgan vaqtida mavjud.

Asosiy fikrlar

  • Console Xcode — iOS ilovasining NSLog, os_log, print va crash-log'larini ko'rish uchun Debug Area oynasi
  • Unified Logging System — kategoriyalar, darajalar va diskka saqlash bilan zamonaviy Apple log tizimi
  • os_log — darajalarni dinamik sozlashni qo'llab-quvvatlovchi tavsiya etilgan log API-si
  • Crash-log'lar ilova qurilmada yoki simulyatorda ishdan chiqqanda Console-da avtomatik ko'rsatiladi
  • Breakpoint-log'lar — Debugger Command orqali bajarishni to'xtatmasdan Console-da xabarlarni chiqarish

Xcode-da Console nima

Console — Xcode-dagi Debug Area qismi, muharrirning pastki panelida joylashgan (View → Debug Area → Activate Console, Cmd + Shift + Y tugmalari). Console ishlayotgan ilovaning barcha matn chiqishini ko'rsatadi: NSLog, os_log, print xabarlari, ish vaqti ogohlantirishlari (runtime warnings) va ilova ishdan chiqqanda avtomatik istisno zrzlari.

Console simulyatorda ham, fizik qurilmada ham ishlaydi. Simulyatorda xabarlar mahalliy pipe orqali darhol keladi, qurilmada — USB ulanish orqali 1–3 kadr kechikish bilan. Ishlab chiqarish ilovalari uchun qurilmada Console mavjud emas — dasturchi Crashlytics yoki log collect orqali masofaviy yig'ish bilan Unified Logging-ga tayanadi.

Mac-dagi Console.app tizim dasturidan farqli o'laroq, Xcode-dagi Console oynasi faqat joriy ishlayotgan ilovaning log'larini ko'rsatadi (filtrlash imkoniyati bilan). Console.app Mac-dagi barcha jarayonlarning, jumladan iOS simulyatorlarining log'larini yig'adi. Biroq, iOS ilovalarini nosozliklardan tozalash uchun dasturchilar LLDB debuggeri bilan integratsiya tufayli o'rnatilgan Xcode Console-dan foydalanadilar.

Log API-lari: NSLog, os_log va print

Uchta asosiy API iOS dasturchisi uchun Console-da chiqish uchun mavjud: NSLog (eskirgan), os_log (tavsiya etilgan) va print (faqat Swift). Har biri ishlash, formatlash va Unified Logging System bilan moslik jihatidan o'ziga xos xususiyatlarga ega.

NSLog — klassik loglash

NSLog — Foundation-dan funksiya, Objective-C va Swift-da mavjud. NSLog vaqt belgisi, jarayon nomi va PID bilan xabar chiqaradi. Kamchiliklari: NSLog tizim buferiga sinxron yozadi, yozish vaqtida joriy thread-ni bloklaydi. Tez-tez chaqiruvlarda (masalan, siklda) NSLog sezilarli kechikish hosil qiladi. Apple yangi loyihalar uchun NSLog ni tavsiya etmaydi, ammo u eski kod va uchinchi tomon kutubxonalari bilan mos keladi.

os_log — zamonaviy standart

os_log — iOS 10 da taqdim etilgan os.framework API-si. os_log asinxrondir: xabar navbatga qo'yiladi va chaqiruvchi thread-ni bloklamasdan buferga yoziladi. WWDC 2016 ga ko'ra, os_log yuqori yuklangan stsenariylarda NSLog-dan 50 marta tezroq. os_log shuningdek dinamik boshqaruvni qo'llab-quvvatlaydi: DEBUG darajali xabarlar faqat Debug qurilishida yig'iladi, Release-da ishlash xarajatisiz e'tiborga olinmaydi.

print() — faqat Swift chiqishi

print() — Swift-dagi eng sodda chiqish usuli. print stdout-ga (standart chiqish) yozadi, Xcode uni Console-ga yo'naltiradi. print metama'lumot (vaqt, daraja) qo'shmaydi, ammo stdout buferlashni qo'llab-quvvatlaydi. Tezkor nosozliklarni tuzatish uchun print qulay vosita, ammo doimiy loglash uchun funksionallik va nazorat jihatidan os_log-dan past turadi.

swift
import os.log

// NSLog — eskirgan, bloklovchi
NSLog("Application started")

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

// print — tez Swift chiqishi
print("Application started")

Unified Logging: kategoriyalar, darajalar va quyi tizimlar

Unified Logging System (ULS) — iOS 10 va macOS Sierra da taqdim etilgan Apple-ning kompleks loglash infratuzilmasi. ULS barcha tizim jarayonlaridan xabarlarni yagona omborda to'playdi va Mac-da log buyruq qatori vositasi orqali masofaviy kirish imkoniyatini beradi. Dasturchi ULS-ga yozish uchun os_log, o'qish uchun Console-dan foydalanadi.

Quyi tizimlar va kategoriyalar

Har bir OSLog subsystem (masalan, com.myapp.network) va category (masalan, http, websocket) juftligi bilan aniqlanadi. Quyi tizim ilova domenidir (bitta ilova turli modullar uchun bir nechta quyi tizimga ega bo'lishi mumkin). Kategoriya quyi tizim ichidagi komponentdir. subsystem + category kombinatsiyasi Console va log collect-da log'larni moslashuvchan filtrlash imkonini beradi.

OSLog loglash darajalari

DarajaOSLogTypeConsole-da ko'rsatishRelease-da yig'ish
Default.defaultHar doimHa
Info.infoos_log UI yoqilgandaHa
Debug.debugFaqat Debug qurilishidaYo'q
Error.errorHar doim qizil belgi bilanHa
Fault.faultHar doim binafsha belgi bilanHa

log collect — masofaviy log yig'ish

log collect buyrug'i Mac-da ulangan iOS qurilmasidan arxivlangan log'larni .logarchive fayliga yig'adi. Bu faylni Mac-da Console.app da batafsil tahlil uchun ochish mumkin, jumladan os_log xabarlari, crash-log'lar va tizim diagnostikasi. Qurilmada yig'ishni yoqish uchun Developer Mode-ni yoqish va qurilmani USB orqali ulash kerak.

Console bilan ishlash: bosqichma-bosqich nosozliklarni tuzatish va crash-log'larni tahlil qilish

Amaliy ish Console bilan uchta asosiy stsenariyni o'z ichiga oladi: ishlab chiqish vaqtida faol loglash, ishdan chiqqandan keyin crash-log'larni tahlil qilish va .logarchive orqali masofaviy diagnostika. Har bir stsenariy uchun optimal vositalar va sozlamalar to'plami mavjud.

Ishlab chiqish uchun Console-ni sozlash

Tavsiya etiladi har bir ilova moduli uchun alohida OSLog yaratish: debug (batafsil nosozliklarni tuzatish), info (asosiy holat o'tishlari), error (istisnolar va nosozliklar). Xcode Console-da ilovangizning quyi tizimi bo'yicha filtrni yoqing, shovqin yaratadigan va ilova mantiqidan chalg'itadigan tizim xabarlarini istisno qilish uchun.

Crash-log tahlili

Ilova ishdan chiqqanda Xcode avtomatik ravishda bajarishni to'xtatadi va Console-da to'liq stack trace bilan ishdan chiqish sodir bo'lgan thread-ni ko'rsatadi. Crash-logning birinchi qatori istisno turini (NSException, EXC_BAD_ACCESS) va sababni (reason) o'z ichiga oladi. Stack trace-ni pastdan yuqoriga o'rganing: oxirgi chaqirilgan metod ishdan chiqish joyidir. Shifrlangan manzillar uchun (Release-da) dSYM orqali symbolication talab qilinadi.

swift
// OSLog modulli sozlash namunasi
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"
    )
}

// Darajalar bilan foydalanish
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)

Ilg'or imkoniyatlar: breakpoint-log'lar va maxsus formatlar

Xcode Console oddiy loglashdan tashqari bir nechta ilg'or funksiyalarni qo'llab-quvvatlaydi. Breakpoint-log'lar bajarishni to'xtatmasdan Console-da xabarlarni chiqarishga imkon beradi, Debugger Command-dagi LLDB buyruqlari esa chiqishni formatlash ustidan to'liq nazorat beradi.

To'xtatmasdan breakpoint-log'lar

Breakpoint-ni shunday sozlashingiz mumkinki, u Console-da xabar chiqarsin va avtomatik bajarishni davom ettirsin. Kerakli qatorda breakpoint qo'ying, o'ng tugma → Edit Breakpoint → Debugger Command qo'shing: «po self» yoki «expr @import UIKit» + Debugger Command: «po self.view». Automatically continue after evaluating ni belgilang. Ishga tushirgandan so'ng, breakpoint har safar qatorga yetganda thread-ni to'xtatmasdan buyruq natijasini Console-da ko'rsatadi.

Console-da LLDB buyruqlari

Xcode Console qo'llab-quvvatlaydi breakpoint-da to'xtash vaqtida ixtiyoriy LLDB buyruqlarini bajarishni. po (print object) obyekt tavsifini, p (print) — primitiv qiymatlarni, expr esa Swift/ObjC ifodalarini bajaradi. Formatlangan chiqish uchun p/CGRectGetWidth dan foydalaning. LLDB chiqishi breakpoint-ga yetgandan so'ng darhol Console-da ko'rsatiladi.

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

// Ketma-ketlik bilan maxsus loglash namunasi
func trackMethodCall(
    file: String = #file,
    function: String = #function
) {
    os_log("[\(function)] called",
        log: .uiLifecycle, type: .debug)
}

Instruments bilan integratsiya

Xcode Console Instruments — Xcode profiling vositasi bilan chambarchas integratsiyalangan. Ilovani Product → Profile orqali Logging shabloni bilan ishga tushirganda, barcha os_log xabarlari vaqt belgilari bilan Instruments treklariga yoziladi. Bu log'lar, ishlash va tizim hodisalarini bir vaqt shkalasida ko'rish imkonini beradi, bu race condition va ishlash regressiyasini diagnostika qilish uchun muhimdir.

Tez-tez beriladigan savollar

NSLog va os_log o'rtasidagi farq nima?

NSLog — sinxron, thread-ni bloklaydi va har doim xabar chiqaradi. os_log — asinxron, yuqori yuklangan stsenariylarda 50 marta tezroq, kategoriyalarni qo'llab-quvvatlaydi va Release qurilishida ishlash yo'qotmasdan debug darajalarini dinamik o'chirish imkonini beradi.

Nega Console ilovadan os_log ko'rsatmaydi?

Loglash darajasini tekshiring: standart bo'yicha Console faqat default va undan yuqorisini ko'rsatadi. Info va debug ni ko'rish uchun Console Xcode da os_log menyusini oching va Include Info Messages va Include Debug Messages ni tanlang, shuningdek sxema sozlamalarida (Edit Scheme → Run → Arguments → OS_ACTIVITY_MODE = debug).

Console log-ni yuborish uchun faylga qanday saqlash mumkin?

Kerakli xabarlarni Console-da tanlang, nusxalang (Cmd + C) va istalgan matn muharririga joylashtiring. To'liq zrz uchun terminal buyrug'idan foydalaning: sudo log collect --device --output /tmp/app_logs.logarchive — bu iOS qurilmasidan barcha log'larni tuzilgan formatda saqlaydi.

Release qurilishida os_log-ni qanday yoqish mumkin?

.default va .error turidagi os_log Release-da standart bo'yicha ishlaydi. Release-da .info va .debug uchun Xcode sxemasiga -OSLogPreferencesApp «$(PRODUCT_BUNDLE_IDENTIFIER):debug» ishga tushirish argumentini qo'shish kerak. Bu argumentsiz debug xabarlari Release-da yig'ilmaydi, bu qurilma resurslarini tejaydi.

Tarixda aniq crash-log-ni qanday topish mumkin?

Xcode-da Window → Organizer → Crashes ni oching. Organizer testerlar qurilmalaridan yig'ilgan barcha crash-log'larni istisno turi bo'yicha guruhlangan holda ko'rsatadi. Symbolication uchun ishdan chiqish sodir bo'lgan qurilishdan .dSYM fayli kerak — Xcode arxiv mavjud bo'lganda uni avtomatik topadi.

Xulosa

  • Console Xcode — Debug Area-da NSLog, os_log, print va crash-log'larini ko'rish uchun o'rnatilgan vosita
  • os_log — asinxron yozish, kategoriyalar va Unified Logging System qo'llab-quvvatlashi bilan tavsiya etilgan API
  • Unified Logging log'larni modulli tashkil qilish uchun quyi tizimlar va kategoriyalarni taqdim etadi
  • Breakpoint-log'lar ilova bajarilishini to'xtatmasdan Console-da xabarlarni chiqaradi
  • LLDB buyruqlari po, p, expr konsolda chiqishni formatlash ustidan to'liq nazorat beradi
  • Crash-log tahlili Console-da istisno bilan boshlanadi va Release uchun dSYM orqali symbolication talab qiladi
  • Instruments bilan integratsiya log'larni profil bilan bir vaqt shkalasida birlashtirish imkonini beradi

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing