Die Konsole in Xcode ist ein Debugging-Tool für die iOS-Entwicklung, das NSLog-, print-, os_log-Ausgaben und App-Absturzprotokolle in Echtzeit anzeigt. Laut Apple Unified Logging empfiehlt Apple ab iOS 10 die Verwendung von os_log anstelle von NSLog für die zentrale Nachrichtensammlung über das Unified Logging System. Die Konsole vereint Debugger-Ausgabe und Systemmeldungen in einem einzigen Debug-Area-Fenster, das zu jedem Zeitpunkt der Entwicklung zugänglich ist.
Wichtige Punkte
Die Konsole ist Teil des Debug-Bereichs in Xcode, der sich im unteren Bereich des Editors befindet (View → Debug Area → Activate Console, Tastenkombination Cmd + Umschalt + Y). Die Konsole zeigt die gesamte Textausgabe der laufenden Anwendung an: Nachrichten von NSLog, os_log, print, Laufzeitwarnungen und automatische Ausnahmeprotokolle beim Absturz der App.
Die Konsole funktioniert sowohl im Simulator als auch auf einem physischen Gerät. Im Simulator kommen Nachrichten sofort durch eine lokale Pipe an; auf einem Gerät kommen sie über eine USB-Verbindung mit einer Verzögerung von 1–3 Bildern. Für Produktions-Apps ist die Konsole auf dem Gerät nicht verfügbar — Entwickler verlassen sich auf Crashlytics oder Unified Logging mit Fernsammlung über log collect.
Anders als die System-App Console.app auf dem Mac zeigt das Konsolenfenster in Xcode nur Protokolle der aktuell laufenden Anwendung an (mit Filtermöglichkeit). Die Console.app sammelt Protokolle aller Prozesse auf dem Mac, einschließlich iOS-Simulatoren. Für das Debugging von iOS-Apps verwenden Entwickler jedoch die integrierte Xcode-Konsole aufgrund ihrer Integration mit dem LLDB-Debugger.
Drei Haupt-APIs stehen dem iOS-Entwickler für die Konsolenausgabe zur Verfügung: NSLog (veraltet), os_log (empfohlen) und print (nur Swift). Jede hat ihre eigenen Merkmale in Bezug auf Leistung, Formatierung und Kompatibilität mit dem Unified Logging System.
NSLog ist eine Funktion aus Foundation, verfügbar in Objective-C und Swift. NSLog gibt eine Nachricht mit Zeitstempel, Prozessnamen und PID aus. Nachteile: NSLog schreibt synchron in den Systempuffer und blockiert dabei den aktuellen Thread. Bei häufigen Aufrufen (z. B. in einer Schleife) erzeugt NSLog eine spürbare Verzögerung. Apple empfiehlt NSLog nicht für neue Projekte, aber es bleibt mit Altcode und Bibliotheken von Drittanbietern kompatibel.
os_log ist eine API aus dem os.framework, eingeführt in iOS 10. os_log ist asynchron: Die Nachricht wird in die Warteschlange gestellt und in den Puffer geschrieben, ohne den aufrufenden Thread zu blockieren. Laut WWDC 2016 ist os_log in Hochlastszenarien 50-mal schneller als NSLog. os_log unterstützt auch die dynamische Steuerung: DEBUG-Level-Nachrichten werden nur in Debug-Builds gesammelt und in Release ohne Overhead ignoriert.
print() ist die einfachste Ausgabemethode in Swift. print schreibt in stdout (Standardausgabe), das Xcode an die Konsole weiterleitet. print fügt keine Metadaten hinzu (Zeit, Ebene), unterstützt aber die stdout-Pufferung. Für schnelles Debuggen ist print ein praktisches Werkzeug, aber für dauerhafte Protokollierung bleibt es hinter os_log in Funktionalität und Kontrolle zurück.
import os.log
// NSLog — veraltet, blockierend
NSLog("Application started")
// os_log — empfohlen, asynchron
let log = OSLog(
subsystem: "com.myapp",
category: "lifecycle"
)
os_log("Application started", log: log)
// print — schnelle Swift-Ausgabe
print("Application started")
Unified Logging System (ULS) ist Apples durchgängige Protokollierungsinfrastruktur, eingeführt in iOS 10 und macOS Sierra. ULS sammelt Nachrichten von allen Systemprozessen in einem einzigen Speicher mit Fernzugriffsmöglichkeit über das log-Befehlszeilentool auf dem Mac. Entwickler verwenden os_log zum Schreiben in ULS und die Konsole zum Lesen.
Jeder OSLog wird durch ein Paar aus subsystem (z. B. com.myapp.network) und category (z. B. http, websocket) identifiziert. Das Subsystem ist die Anwendungsdomäne (eine App kann mehrere Subsysteme für verschiedene Module haben). Die Kategorie ist eine Komponente innerhalb des Subsystems. Die Kombination aus subsystem + category ermöglicht eine flexible Protokollfilterung in der Konsole und log collect.
| Ebene | OSLogType | Konsolenanzeige | Erfassung in Release |
|---|---|---|---|
| Default | .default | Immer | Ja |
| Info | .info | Bei aktivierter os_log-Oberfläche | Ja |
| Debug | .debug | Nur im Debug-Build | Nein |
| Error | .error | Immer mit roter Markierung | Ja |
| Fault | .fault | Immer mit violetter Markierung | Ja |
Der Befehl log collect auf dem Mac sammelt archivierte Protokolle von einem verbundenen iOS-Gerät in einer .logarchive-Datei. Diese Datei kann in der Console.app auf dem Mac zur detaillierten Analyse geöffnet werden, einschließlich os_log-Nachrichten, Absturzprotokollen und Systemdiagnosen. Zum Aktivieren der Sammlung auf dem Gerät müssen Sie den Entwicklermodus aktivieren und das Gerät über USB verbinden.
Die praktische Arbeit mit der Konsole umfasst drei Hauptszenarien: aktive Protokollierung während der Entwicklung, Absturzprotokollanalyse nach einem Absturz und Ferndiagnose über .logarchive. Jedes Szenario hat einen optimalen Satz von Werkzeugen und Einstellungen.
Es wird empfohlen, für jedes Anwendungsmodul einen separaten OSLog mit Ebenen zu erstellen: debug (detailliertes Debugging), info (wichtige Zustandsübergänge), error (Ausnahmen und Fehler). Aktivieren Sie in der Xcode-Konsole die Filterung nach dem Subsystem Ihrer Anwendung, um Systemmeldungen auszuschließen, die Rauschen erzeugen und von der Anwendungslogik ablenken.
Wenn die App abstürzt, hält Xcode die Ausführung automatisch an und zeigt den Thread an, in dem der Absturz aufgetreten ist, mit einer vollständigen Stack-Trace in der Konsole. Die erste Zeile des Absturzprotokolls enthält den Ausnahmetyp (NSException, EXC_BAD_ACCESS) und den Grund. Untersuchen Sie die Stack-Trace von unten nach oben: Die zuletzt aufgerufene Methode ist der Absturzort. Für verschlüsselte Adressen (in Release) ist eine Symbollisierung über dSYM erforderlich.
// Beispiel für modulare OSLog-Konfiguration
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"
)
}
// Verwendung mit Ebenen
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)
Die Xcode-Konsole unterstützt mehrere erweiterte Funktionen, die über die einfache Protokollierung hinausgehen. Breakpoint-Protokolle ermöglichen die Ausgabe von Nachrichten in der Konsole ohne Anhalten der Ausführung, und LLDB-Befehle im Debugger Command bieten volle Kontrolle über die Formatierung der Ausgabe.
Sie können einen Breakpoint konfigurieren, um eine Nachricht in der Konsole auszugeben und die Ausführung automatisch fortzusetzen. Setzen Sie einen Breakpoint auf die gewünschte Zeile, klicken Sie mit der rechten Maustaste → Edit Breakpoint → fügen Sie Debugger Command hinzu: „po self“ oder „expr @import UIKit“ + Debugger Command: „po self.view“. Aktivieren Sie Automatically continue after evaluating. Nach dem Start gibt der Breakpoint das Befehlsergebnis jedes Mal in der Konsole aus, wenn die Zeile erreicht wird, ohne den Thread zu unterbrechen.
Die Xcode-Konsole unterstützt die Ausführung beliebiger LLDB-Befehle während des Haltens an einem Breakpoint. po (print object) gibt eine Objektbeschreibung aus, p (print) gibt primitive Werte aus, und expr führt Swift/ObjC-Ausdrücke aus. Für formatierte Ausgabe verwenden Sie p/CGRectGetWidth. Die LLDB-Ausgabe erscheint sofort in der Konsole, nachdem der Breakpoint erreicht wurde.
func processUserData(user: User) {
// Breakpoint hier mit Debugger Command:
// po "User name: \(user.name)"
// expr user.age = 30
print("Processing user: \(user.name)")
}
// Beispiel für benutzerdefiniertes Logging mit Sequenz
func trackMethodCall(
file: String = #file,
function: String = #function
) {
os_log("[\(function)] called",
log: .uiLifecycle, type: .debug)
}
Die Xcode-Konsole ist eng mit Instruments integriert — dem Profilerstellungstool von Xcode. Wenn Sie die App über Product → Profile mit der Logging-Vorlage ausführen, werden alle os_log-Nachrichten mit Zeitstempeln in der Instruments-Spur aufgezeichnet. Dies ermöglicht die gleichzeitige Anzeige von Protokollen, Leistung und Systemereignissen auf einer einzigen Zeitachse, was für die Diagnose von Wettlaufsituationen und Leistungsregressionen entscheidend ist.
Häufig gestellte Fragen
NSLog ist synchron, blockiert den Thread und gibt immer die Nachricht aus. os_log ist asynchron, 50-mal schneller in Hochlastszenarien, unterstützt Kategorien und deaktiviert dynamisch Debug-Ebenen in Release-Builds ohne Leistungseinbußen.
Überprüfen Sie die Protokollierungsebene: Standardmäßig zeigt die Konsole nur default und höher an. Um info und debug anzuzeigen, öffnen Sie das os_log-Menü in der Xcode-Konsole und wählen Sie Include Info Messages und Include Debug Messages in den Scheme-Einstellungen (Edit Scheme → Run → Arguments → OS_ACTIVITY_MODE = debug).
Wählen Sie die gewünschten Nachrichten in der Konsole aus, kopieren Sie sie (Cmd + C) und fügen Sie sie in einen beliebigen Texteditor ein. Für einen vollständigen Dump verwenden Sie den Terminalbefehl: sudo log collect --device --output /tmp/app_logs.logarchive — er speichert alle Protokolle vom iOS-Gerät in einem strukturierten Format.
os_log vom Typ .default und .error funktionieren standardmäßig in Release. Für .info und .debug in Release müssen Sie das Startargument -OSLogPreferencesApp „$(PRODUCT_BUNDLE_IDENTIFIER):debug“ im Xcode-Schema hinzufügen. Ohne dieses Argument werden Debug-Nachrichten in Release nicht gesammelt, was Geräteressourcen spart.
Öffnen Sie Window → Organizer → Crashes in Xcode. Der Organizer zeigt alle von den Geräten der Tester gesammelten Absturzprotokolle, gruppiert nach Ausnahmetyp. Für die Symbollisierung wird eine .dSYM-Datei von dem Build benötigt, in dem der Absturz aufgetreten ist — Xcode findet sie automatisch, wenn ein Archiv verfügbar ist.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch