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-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.
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 — 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 — 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() — 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.
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 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.
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.
| Daraja | OSLogType | Console-da ko'rsatish | Release-da yig'ish |
|---|---|---|---|
| Default | .default | Har doim | Ha |
| Info | .info | os_log UI yoqilganda | Ha |
| Debug | .debug | Faqat Debug qurilishida | Yo'q |
| Error | .error | Har doim qizil belgi bilan | Ha |
| Fault | .fault | Har doim binafsha belgi bilan | Ha |
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.
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.
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.
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.
// 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)
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.
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.
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.
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)
}
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 — 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.
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).
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.
.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.
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
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.