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-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.
Üç ə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 — 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 — 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() — 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.
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 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.
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.
| Səviyyə | OSLogType | Console-da göstərilmə | Release-də toplama |
|---|---|---|---|
| Default | .default | Həmişə | Bəli |
| Info | .info | os_log UI aktiv olduqda | Bəli |
| Debug | .debug | Yalnız Debug quruluşunda | Xeyr |
| Error | .error | Həmişə qırmızı etiketlə | Bəli |
| Fault | .fault | Həmişə bənövşəyi etiketlə | Bəli |
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.
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.
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.
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.
// 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)
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.
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.
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.
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)
}
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 — 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.
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).
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.
.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.
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ə
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.
Həm də oxuyun