Το Console στο Xcode είναι ένα εργαλείο αποσφαλμάτωσης για ανάπτυξη iOS που εμφανίζει την έξοδο των NSLog, print, os_log και των crash logs της εφαρμογής σε πραγματικό χρόνο. Σύμφωνα με το Apple Unified Logging, από το iOS 10 η Apple συνιστά τη χρήση του os_log αντί του NSLog για συγκεντρωτική συλλογή μηνυμάτων μέσω του Unified Logging System. Console συνδυάζει την έξοδο του debugger και τα μηνύματα συστήματος σε ένα ενιαίο παράθυρο Debug Area, διαθέσιμο ανά πάσα στιγμή κατά την ανάπτυξη.
Κύρια σημεία
Console — μέρος του Debug Area στο Xcode, που βρίσκεται στο κάτω πλαίσιο του επεξεργαστή (View → Debug Area → Activate Console, συντόμευση Cmd + Shift + Y). Το Console εμφανίζει όλη την έξοδο κειμένου της εκτελούμενης εφαρμογής: μηνύματα από NSLog, os_log, print, προειδοποιήσεις χρόνου εκτέλεσης (runtime warnings) και αυτόματες dump εξαιρέσεων κατά την κατάρρευση της εφαρμογής.
Το Console λειτουργεί τόσο στον προσομοιωτή όσο και στη φυσική συσκευή. Στον προσομοιωτή, τα μηνύματα φτάνουν αμέσως μέσω τοπικού pipe, στη συσκευή — μέσω σύνδεσης USB με καθυστέρηση 1–3 καρέ. Για εφαρμογές παραγωγής, το Console στη συσκευή δεν είναι διαθέσιμο — ο προγραμματιστής βασίζεται στο Crashlytics ή στο Unified Logging με απομακρυσμένη συλλογή μέσω log collect.
Σε αντίθεση με την εφαρμογή συστήματος Console.app στο Mac, το παράθυρο Console στο Xcode εμφανίζει μόνο τα logs της τρέχουσας εκτελούμενης εφαρμογής (με δυνατότητα φιλτραρίσματος). Το Console.app συλλέγει logs όλων των διεργασιών στο Mac, συμπεριλαμβανομένων των προσομοιωτών iOS. Ωστόσο, για την αποσφαλμάτωση εφαρμογών iOS, οι προγραμματιστές χρησιμοποιούν το ενσωματωμένο Console Xcode λόγω της ενσωμάτωσης με τον debugger LLDB.
Τρία κύρια API είναι διαθέσιμα στον προγραμματιστή iOS για έξοδο στο Console: NSLog (παρωχημένο), os_log (συνιστώμενο) και print (μόνο Swift). Κάθε ένα έχει τα δικά του χαρακτηριστικά όσον αφορά την απόδοση, τη μορφοποίηση και τη συμβατότητα με το Unified Logging System.
NSLog — συνάρτηση από το Foundation, διαθέσιμη σε Objective-C και Swift. Το NSLog εξάγει μήνυμα με χρονική σήμανση, όνομα διεργασίας και PID. Μειονεκτήματα: το NSLog γράφει στο buffer του συστήματος σύγχρονα, μπλοκάροντας το τρέχον νήμα κατά τη διάρκεια της εγγραφής. Σε συχνές κλήσεις (π.χ. σε βρόχο), το NSLog δημιουργεί αισθητή καθυστέρηση. Η Apple δεν συνιστά το NSLog για νέα έργα, αλλά παραμένει συμβατό με παλαιό κώδικα και βιβλιοθήκες τρίτων.
os_log — API από το os.framework, που εισήχθη στο iOS 10. Το os_log είναι ασύγχρονο: το μήνυμα τοποθετείται σε ουρά και γράφεται στο buffer χωρίς να μπλοκάρει το νήμα που το καλεί. Σύμφωνα με το WWDC 2016, το os_log είναι 50 φορές ταχύτερο από το NSLog σε σενάρια υψηλού φορτίου. Το os_log υποστηρίζει επίσης δυναμική διαχείριση: τα μηνύματα επιπέδου DEBUG συλλέγονται μόνο στην έκδοση Debug, ενώ στο Release αγνοούνται χωρίς κόστος απόδοσης.
print() — η απλούστερη μέθοδος εξόδου στη Swift. Η print γράφει στο stdout (τυπική έξοδος), το οποίο το Xcode ανακατευθύνει στο Console. Η print δεν προσθέτει μεταδεδομένα (χρόνο, επίπεδο), αλλά υποστηρίζει buffering stdout. Για γρήγορη αποσφαλμάτωση, η print είναι ένα βολικό εργαλείο, αλλά για μόνιμη καταγραφή υστερεί σε σχέση με το os_log όσον αφορά τη λειτουργικότητα και τον έλεγχο.
import os.log
// NSLog — παρωχημένο, μπλοκάρισμα
NSLog("Application started")
// os_log — συνιστώμενο, ασύγχρονο
let log = OSLog(
subsystem: "com.myapp",
category: "lifecycle"
)
os_log("Application started", log: log)
// print — γρήγορη έξοδος Swift
print("Application started")
Unified Logging System (ULS) — η ολοκληρωμένη υποδομή καταγραφής της Apple, που εισήχθη στο iOS 10 και το macOS Sierra. Το ULS συλλέγει μηνύματα από όλες τις διεργασίες του συστήματος σε ένα ενιαίο αποθετήριο με απομακρυσμένη πρόσβαση μέσω του εργαλείου γραμμής εντολών log στο Mac. Ο προγραμματιστής χρησιμοποιεί το os_log για εγγραφή στο ULS και το Console για ανάγνωση.
Κάθε OSLog αναγνωρίζεται από ένα ζεύγος subsystem (π.χ., com.myapp.network) και category (π.χ., http, websocket). Το υποσύστημα είναι ο τομέας της εφαρμογής (μία εφαρμογή μπορεί να έχει πολλαπλά υποσυστήματα για διαφορετικές ενότητες). Η κατηγορία είναι ένα στοιχείο μέσα στο υποσύστημα. Ο συνδυασμός subsystem + category επιτρέπει ευέλικτο φιλτράρισμα των logs στο Console και το log collect.
| Επίπεδο | OSLogType | Εμφάνιση στο Console | Συλλογή στο Release |
|---|---|---|---|
| Default | .default | Πάντα | Ναι |
| Info | .info | Όταν είναι ενεργοποιημένο το os_log UI | Ναι |
| Debug | .debug | Μόνο στην έκδοση Debug | Όχι |
| Error | .error | Πάντα με κόκκινη ετικέτα | Ναι |
| Fault | .fault | Πάντα με μωβ ετικέτα | Ναι |
Η εντολή log collect στο Mac συλλέγει αρχειοθετημένα logs από τη συνδεδεμένη συσκευή iOS σε ένα αρχείο .logarchive. Αυτό το αρχείο μπορεί να ανοίξει στο Console.app στο Mac για λεπτομερή ανάλυση, συμπεριλαμβανομένων μηνυμάτων os_log, crash logs και διαγνωστικών συστήματος. Για να ενεργοποιηθεί η συλλογή στη συσκευή, απαιτείται ενεργοποίηση της λειτουργίας Developer Mode και σύνδεση της συσκευής μέσω USB.
Πρακτική εργασία με το Console περιλαμβάνει τρία κύρια σενάρια: ενεργή καταγραφή κατά την ανάπτυξη, ανάλυση crash logs μετά από κατάρρευση και απομακρυσμένη διάγνωση μέσω .logarchive. Για κάθε σενάριο υπάρχει ένα βέλτιστο σύνολο εργαλείων και ρυθμίσεων.
Συνιστάται η δημιουργία ξεχωριστού OSLog για κάθε ενότητα της εφαρμογής με επίπεδα: debug (λεπτομερής αποσφαλμάτωση), info (βασικές μεταβάσεις κατάστασης), error (εξαιρέσεις και αποτυχίες). Στο Console Xcode, ενεργοποιήστε το φίλτρο ανά υποσύστημα της εφαρμογής σας για να εξαιρέσετε μηνύματα συστήματος που δημιουργούν θόρυβο και αποσπούν την προσοχή από τη λογική της εφαρμογής.
Κατά την κατάρρευση της εφαρμογής, το Xcode σταματά αυτόματα την εκτέλεση και εμφανίζει το νήμα στο οποίο συνέβη η κατάρρευση, με πλήρη stack trace στο Console. Η πρώτη γραμμή του crash log περιέχει τον τύπο εξαίρεσης (NSException, EXC_BAD_ACCESS) και την αιτία (reason). Μελετήστε το stack trace από κάτω προς τα πάνω: η τελευταία κληθείσα μέθοδος είναι η θέση της κατάρρευσης. Για κρυπτογραφημένες διευθύνσεις (στο Release), απαιτείται symbolication μέσω dSYM.
// Παράδειγμα αρθρωτής διαμόρφωσης OSLog
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"
)
}
// Χρήση με επίπεδα
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 υποστηρίζει αρκετές προηγμένες λειτουργίες που ξεπερνούν την απλή καταγραφή. Τα breakpoint logs επιτρέπουν την έξοδο μηνυμάτων στο Console χωρίς διακοπή της εκτέλεσης, και οι εντολές LLDB στο Debugger Command παρέχουν πλήρη έλεγχο της μορφοποίησης εξόδου.
Μπορείτε να ρυθμίσετε ένα breakpoint ώστε να εξάγει ένα μήνυμα στο Console και να συνεχίσει αυτόματα την εκτέλεση. Τοποθετήστε breakpoint στην επιθυμητή γραμμή, κάντε δεξί κλικ → Edit Breakpoint → προσθέστε Debugger Command: “po self” ή “expr @import UIKit” + Debugger Command: “po self.view”. Τσεκάρετε το Automatically continue after evaluating. Μετά την εκκίνηση, το breakpoint θα εμφανίζει το αποτέλεσμα της εντολής στο Console κάθε φορά που φτάνει στη γραμμή, χωρίς να διακόπτει το νήμα.
Το Console Xcode υποστηρίζει την εκτέλεση αυθαίρετων εντολών LLDB κατά τη διακοπή σε breakpoint. Η po (print object) εμφανίζει την περιγραφή του αντικειμένου, η p (print) — πρωτόγονες τιμές, και η expr — εκτελεί εκφράσεις Swift/ObjC. Για μορφοποιημένη έξοδο, χρησιμοποιήστε p/CGRectGetWidth. Η έξοδος LLDB εμφανίζεται στο Console αμέσως μετά την επίτευξη του breakpoint.
func processUserData(user: User) {
// Breakpoint εδώ με Debugger Command:
// po "User name: \(user.name)"
// expr user.age = 30
print("Processing user: \(user.name)")
}
// Παράδειγμα προσαρμοσμένης καταγραφής με ακολουθία
func trackMethodCall(
file: String = #file,
function: String = #function
) {
os_log("[\(function)] called",
log: .uiLifecycle, type: .debug)
}
Console Xcode είναι στενά ενσωματωμένο με το Instruments — το εργαλείο profiling του Xcode. Κατά την εκκίνηση της εφαρμογής μέσω Product → Profile με το πρότυπο Logging, όλα τα μηνύματα os_log καταγράφονται στα ίχνη Instruments με χρονικές σημάνσεις. Αυτό επιτρέπει την ταυτόχρονη προβολή logs, απόδοσης και συμβάντων συστήματος στην ίδια χρονική κλίμακα, που είναι κρίσιμο για τη διάγνωση race condition και υποβάθμισης απόδοσης.
Συχνές Ερωτήσεις
NSLog — σύγχρονο, μπλοκάρει το νήμα και εξάγει πάντα το μήνυμα. Το os_log — ασύγχρονο, 50 φορές ταχύτερο σε σενάρια υψηλού φορτίου, υποστηρίζει κατηγορίες και δυναμική απενεργοποίηση επιπέδων debug στην έκδοση Release χωρίς απώλεια απόδοσης.
Ελέγξτε το επίπεδο καταγραφής: από προεπιλογή, το Console εμφανίζει μόνο default και άνω. Για να δείτε info και debug, ανοίξτε το μενού os_log στο Console Xcode και επιλέξτε Include Info Messages και Include Debug Messages, καθώς και στις ρυθμίσεις σχήματος (Edit Scheme → Run → Arguments → OS_ACTIVITY_MODE = debug).
Επιλέξτε τα επιθυμητά μηνύματα στο Console, αντιγράψτε (Cmd + C) και επικολλήστε σε οποιοδήποτε πρόγραμμα επεξεργασίας κειμένου. Για πλήρη dump, χρησιμοποιήστε την εντολή τερματικού: sudo log collect --device --output /tmp/app_logs.logarchive — αποθηκεύει όλα τα logs από τη συσκευή iOS σε δομημένη μορφή.
Το os_log τύπου .default και .error λειτουργούν στο Release από προεπιλογή. Για .info και .debug στο Release, πρέπει να προσθέσετε το όρισμα εκκίνησης -OSLogPreferencesApp “$(PRODUCT_BUNDLE_IDENTIFIER):debug” στο σχήμα Xcode. Χωρίς αυτό το όρισμα, τα μηνύματα debug δεν συλλέγονται στο Release, εξοικονομώντας πόρους συσκευής.
Ανοίξτε το Window → Organizer → Crashes στο Xcode. Ο οργανωτής εμφανίζει όλα τα crash logs που συλλέχθηκαν από συσκευές δοκιμαστών, ομαδοποιημένα ανά τύπο εξαίρεσης. Για symbolication, απαιτείται το αρχείο .dSYM από την έκδοση στην οποία συνέβη η κατάρρευση — το Xcode το βρίσκει αυτόματα όταν το αρχείο είναι διαθέσιμο.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης