Xcode'daki Konsol, NSLog, print, os_log çıktısını ve uygulama çökme günlüklerini gerçek zamanlı olarak görüntüleyen bir iOS geliştirme hata ayıklama aracıdır. Apple Unified Logging'e göre, iOS 10'dan itibaren Apple, Unified Logging System aracılığıyla merkezi mesaj toplama için NSLog yerine os_log kullanılmasını önermektedir. Konsol, hata ayıklayıcı çıktısını ve sistem mesajlarını tek bir Debug Area penceresinde birleştirir ve geliştirme sırasında her an erişilebilir.
Önemli Noktalar
Konsol, Xcode'da Debug Area'nın bir parçasıdır ve düzenleyicinin alt panelinde bulunur (View → Debug Area → Activate Console, kısayol Cmd + Shift + Y). Konsol, çalışan uygulamadaki tüm metin çıktısını gösterir: NSLog, os_log, print mesajları, çalışma zamanı uyarıları ve uygulama çöktüğünde otomatik istisna dökümleri.
Konsol, simülatörde ve fiziksel cihazda her ikisinde de çalışır. Simülatörde, mesajlar yerel bir kanal aracılığıyla anında ulaşır; bir cihazda, USB bağlantısı üzerinden 1–3 kare gecikmeyle gelirler. Üretim uygulamaları için, cihazdaki Konsol kullanılamaz — geliştiriciler Crashlytics veya log collect aracılığıyla uzaktan toplama özellikli Unified Logging'e güvenir.
Mac'teki sistem Console.app'ten farklı olarak, Xcode'daki Konsol penceresi yalnızca çalışan mevcut uygulamanın günlüklerini gösterir (filtreleme özelliğiyle). Console.app, iOS simülatörleri de dahil olmak üzere Mac'teki tüm işlemlerin günlüklerini toplar. Ancak, iOS uygulamalarında hata ayıklamak için geliştiriciler, LLDB hata ayıklayıcısıyla entegrasyonu nedeniyle yerleşik Xcode Konsol'u kullanır.
Konsol çıktısı için iOS geliştiricisine üç ana API sunulmuştur: NSLog (eski), os_log (önerilen) ve print (yalnızca Swift). Her birinin performans, biçimlendirme ve Unified Logging System ile uyumluluk açısından kendine özgü özellikleri vardır.
NSLog, Objective-C ve Swift'te bulunan bir Foundation işlevidir. NSLog, zaman damgası, işlem adı ve PID ile bir mesaj görüntüler. Dezavantajları: NSLog, sistematik olarak sistem arabelleğine yazar ve yazma sırasında mevcut iş parçacığını bloke eder. Sık çağrılarla (örneğin, bir döngüde), NSLog gözle görülür bir gecikme yaratır. Apple, yeni projeler için NSLog'u önermez, ancak eski kod ve üçüncü taraf kitaplıklarla uyumlu kalır.
os_log, iOS 10'da tanıtılan os.framework'ten bir API'dir. os_log eşzamansızdır: mesaj sıraya alınır ve çağıran iş parçacığını bloke etmeden arabelleğe yazılır. WWDC 2016'ya göre, os_log yüksek yük senaryolarında NSLog'dan 50 kat daha hızlıdır. os_log ayrıca dinamik kontrolü destekler: DEBUG seviyesindeki mesajlar yalnızca Debug yapılarında toplanır ve Release'de ek yük olmadan görmezden gelinir.
print(), Swift'teki en basit çıktı yöntemidir. print, Xcode'un Konsol'a yönlendirdiği stdout'a (standart çıktı) yazar. print, meta veri (zaman, seviye) eklemez ancak stdout arabelleğe almayı destekler. Hızlı hata ayıklama için print kullanışlı bir araçtır, ancak kalıcı günlükleme için işlevsellik ve kontrol açısından os_log'un gerisinde kalır.
import os.log
// NSLog — eski, engelleyici
NSLog("Application started")
// os_log — önerilen, eşzamansız
let log = OSLog(
subsystem: "com.myapp",
category: "lifecycle"
)
os_log("Application started", log: log)
// print — hızlı Swift çıktısı
print("Application started")
Unified Logging System (ULS), iOS 10 ve macOS Sierra'da tanıtılan Apple'ın uçtan uca günlükleme altyapısıdır. ULS, Mac'teki log komut satırı aracı aracılığıyla uzaktan erişim özelliğiyle tüm sistem işlemlerinden gelen mesajları tek bir depoda toplar. Geliştiriciler ULS'ye yazmak için os_log'u ve okumak için Konsol'u kullanır.
Her OSLog, bir subsystem (örn. com.myapp.network) ve category (örn. http, websocket) çiftiyle tanımlanır. Alt sistem, uygulama alanıdır (bir uygulamanın farklı modüller için birden çok alt sistemi olabilir). Kategori, alt sistem içindeki bir bileşendir. subsystem + category kombinasyonu, Konsol ve log collect'te esnek günlük filtrelemeye olanak tanır.
| Seviye | OSLogType | Konsol Görüntüleme | Release Toplama |
|---|---|---|---|
| Default | .default | Her zaman | Evet |
| Info | .info | os_log arayüzü etkinleştirildiğinde | Evet |
| Debug | .debug | Yalnızca Debug yapısı | Hayır |
| Error | .error | Her zaman kırmızı etiketle | Evet |
| Fault | .fault | Her zaman mor etiketle | Evet |
Mac'teki log collect komutu, bağlı bir iOS cihazından arşivlenmiş günlükleri bir .logarchive dosyasında toplar. Bu dosya, os_log mesajları, çökme günlükleri ve sistem teşhisleri dahil olmak üzere ayrıntılı analiz için Mac'te Console.app'te açılabilir. Cihazda toplamayı etkinleştirmek için Geliştirici Modu'nu etkinleştirmeniz ve cihazı USB üzerinden bağlamanız gerekir.
Konsol ile pratik çalışma üç ana senaryoyu içerir: geliştirme sırasında aktif günlükleme, çökme sonrası çökme günlüğü analizi ve .logarchive aracılığıyla uzaktan teşhis. Her senaryonun en uygun araç ve ayar kümesi vardır.
Her uygulama modülü için şu seviyelerle ayrı bir OSLog oluşturmanız önerilir: debug (ayrıntılı hata ayıklama), info (temel durum geçişleri), error (istisnalar ve hatalar). Xcode Konsol'unda, uygulamanızın alt sistemine göre filtrelemeyi etkinleştirerek gürültü yaratan ve uygulama mantığından uzaklaştıran sistem mesajlarını hariç tutun.
Uygulama çöktüğünde, Xcode otomatik olarak yürütmeyi durdurur ve Konsol'da tam yığın iziyle birlikte çökmenin meydana geldiği iş parçacığını gösterir. Çökme günlüğünün ilk satırı, istisna türünü (NSException, EXC_BAD_ACCESS) ve nedeni içerir. Yığın izini aşağıdan yukarıya doğru inceleyin: en son çağrılan yöntem çökme konumudur. Şifrelenmiş adresler için (Release'de), dSYM aracılığıyla sembolleştirme gerekir.
// Modüler OSLog yapılandırma örneği
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"
)
}
// Seviyelerle kullanım
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 Konsol'u, basit günlüklemenin ötesine geçen birkaç gelişmiş özelliği destekler. Kesme noktası günlükleri, yürütmeyi durdurmadan Konsol'a mesaj göndermenize olanak tanır ve Debugger Command'deki LLDB komutları, çıktı biçimlendirmesi üzerinde tam kontrol sağlar.
Konsol'a bir mesaj göndermek ve otomatik olarak yürütmeye devam etmek için bir kesme noktası yapılandırabilirsiniz. İstenen satıra bir kesme noktası yerleştirin, sağ tıklayın → Edit Breakpoint → Debugger Command ekleyin: “po self” veya “expr @import UIKit” + Debugger Command: “po self.view”. Automatically continue after evaluating'i işaretleyin. Başlattıktan sonra, kesme noktası satıra her ulaşıldığında komut sonucunu Konsol'a gönderecek ve iş parçacığını kesintiye uğratmayacaktır.
Xcode Konsol'u, bir kesme noktasında dururken rastgele LLDB komutlarının yürütülmesini destekler. po (print object) bir nesnenin açıklamasını görüntüler, p (print) ilkel değerleri görüntüler ve expr Swift/ObjC ifadelerini yürütür. Biçimlendirilmiş çıktı için p/CGRectGetWidth kullanın. LLDB çıktısı, kesme noktasına ulaşıldıktan hemen sonra Konsol'da görünür.
func processUserData(user: User) {
// Debugger Command ile kesme noktası:
// po "User name: \(user.name)"
// expr user.age = 30
print("Processing user: \(user.name)")
}
// Sıra ile özel günlük örneği
func trackMethodCall(
file: String = #file,
function: String = #function
) {
os_log("[\(function)] called",
log: .uiLifecycle, type: .debug)
}
Xcode Konsol'u, Instruments — Xcode'un profil oluşturma aracı — ile yakından entegredir. Uygulamayı Product → Profile aracılığıyla Logging şablonuyla çalıştırırken, tüm os_log mesajları zaman damgalarıyla Instruments izinde kaydedilir. Bu, tek bir zaman çizelgesinde günlükleri, performansı ve sistem olaylarını aynı anda görmenizi sağlar; bu, yarışma koşullarını ve performans düşüşlerini teşhis etmek için kritiktir.
Sıkça Sorulan Sorular
NSLog eşzamanlıdır, iş parçacığını bloke eder ve her zaman mesajı görüntüler. os_log eşzamansızdır, yüksek yük senaryolarında 50 kat daha hızlıdır, kategorileri destekler ve performans kaybı olmadan Release yapılarında hata ayıklama seviyelerini dinamik olarak devre dışı bırakır.
Günlük seviyesini kontrol edin: varsayılan olarak, Konsol yalnızca default ve üstünü gösterir. info ve debug'u görmek için, Xcode Konsol'unda os_log menüsünü açın ve şema ayarlarında Include Info Messages ve Include Debug Messages'i seçin (Edit Scheme → Run → Arguments → OS_ACTIVITY_MODE = debug).
Konsol'da istediğiniz mesajları seçin, kopyalayın (Cmd + C) ve herhangi bir metin düzenleyiciye yapıştırın. Tam bir döküm için terminal komutunu kullanın: sudo log collect --device --output /tmp/app_logs.logarchive — iOS cihazından tüm günlükleri yapılandırılmış bir biçimde kaydeder.
os_log türü .default ve .error varsayılan olarak Release'de çalışır. Release'de .info ve .debug için, Xcode şemasına -OSLogPreferencesApp “$(PRODUCT_BUNDLE_IDENTIFIER):debug” başlatma argümanını eklemeniz gerekir. Bu argüman olmadan, hata ayıklama mesajları Release'de toplanmaz ve cihaz kaynaklarından tasarruf sağlar.
Xcode'da Window → Organizer → Crashes'i açın. Düzenleyici, istisna türüne göre gruplandırılmış, test uzmanlarının cihazlarından toplanan tüm çökme günlüklerini gösterir. Sembolleştirme, çökmenin meydana geldiği yapıdan bir .dSYM dosyası gerektirir — Xcode, bir arşiv mevcutsa onu otomatik olarak bulur.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun