Xcode'da Console: temel kavramlar, veri çıktısı ve hata ayıklama

Yazar: IT Sectr Yayınlanma: 2026-05-06 Okuma süresi: 8 dk

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 — Debug Area'da NSLog, os_log, print ve iOS çökme günlüklerini görüntülemek için pencere
  • Unified Logging System — Apple'ın kategoriler, seviyeler ve diskte saklama özelliklerine sahip modern günlük sistem
  • os_log — dinamik seviye yapılandırmasını destekleyen önerilen günlük API'si
  • Çökme günlükleri uygulama bir cihaz veya simülatörde çöktüğünde Konsol'da otomatik olarak görünür
  • Kesme noktası günlükleri — Debugger Command aracılığıyla yürütmeyi durdurmadan Konsol'a mesaj gönderir

Xcode'da Konsol Nedir

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.

Günlük API'leri: NSLog, os_log ve print

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 — Klasik Günlük

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 — Modern Standart

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() — Yalnızca Swift Çıktısı

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.

swift
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: Kategoriler, Seviyeler ve Alt Sistemler

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.

Alt Sistemler ve Kategoriler

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.

OSLog Günlük Seviyeleri

SeviyeOSLogTypeKonsol GörüntülemeRelease Toplama
Default.defaultHer zamanEvet
Info.infoos_log arayüzü etkinleştirildiğindeEvet
Debug.debugYalnızca Debug yapısıHayır
Error.errorHer zaman kırmızı etiketleEvet
Fault.faultHer zaman mor etiketleEvet

log collect — Uzaktan Günlük Toplama

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 Çalışma: Adım Adım Hata Ayıklama ve Çökme Günlüğü Analizi

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.

Geliştirme İçin Konsol Kurulumu

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.

Çökme Günlüğü Analizi

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.

swift
// 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)

Gelişmiş Özellikler: Kesme Noktası Günlükleri ve Özel Biçimler

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.

Durdurmadan Kesme Noktası Günlükleri

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.

Konsol'da LLDB Komutları

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.

swift
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)
}

Instruments ile Entegrasyon

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 ve os_log arasındaki fark nedir?

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.

Konsol neden uygulamadan os_log göstermiyor?

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).

Paylaşmak için Konsol günlüğü dosyaya nasıl kaydedilir?

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.

Release yapısında os_log nasıl etkinleştirilir?

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.

Geçmişte belirli bir çökme günlüğü nasıl bulunur?

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

  • Konsol Xcode — Debug Area'da NSLog, os_log, print ve çökme günlüklerini görüntülemek için yerleşik araç
  • os_log — eşzamansız yazma, kategoriler ve Unified Logging System desteğiyle önerilen API
  • Unified Logging, modüler günlük organizasyonu için alt sistemler ve kategoriler sağlar
  • Kesme noktası günlükleri, uygulama yürütmesini durdurmadan Konsol'a mesaj gönderir
  • LLDB komutları po, p, expr konsol çıktısı biçimlendirmesi üzerinde tam kontrol sağlar
  • Çökme günlüğü analizi Konsol'daki istisnayla başlar ve Release için dSYM aracılığıyla sembolleştirme gerektirir
  • Instruments ile entegrasyon, tek bir zaman çizelgesinde günlükleri profillemeyle birleştirmeye olanak tanır

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.

Projeyi tartış

Ayrıca okuyun