La Consola en Xcode es una herramienta de depuración para el desarrollo iOS que muestra la salida de NSLog, print, os_log y los registros de fallos de la aplicación en tiempo real. Según Apple Unified Logging, a partir de iOS 10 Apple recomienda usar os_log en lugar de NSLog para la recopilación centralizada de mensajes a través de Unified Logging System. La Consola combina la salida del depurador y los mensajes del sistema en una única ventana de Debug Area, accesible en cualquier momento del desarrollo.
Puntos clave
La Consola es parte del Debug Area en Xcode, ubicada en el panel inferior del editor (View → Debug Area → Activate Console, atajo Cmd + Shift + Y). La Consola muestra toda la salida de texto de la aplicación en ejecución: mensajes de NSLog, os_log, print, advertencias en tiempo de ejecución y volcados automáticos de excepciones cuando la aplicación falla.
La Consola funciona tanto en el simulador como en un dispositivo físico. En el simulador, los mensajes llegan instantáneamente a través de una tubería local; en un dispositivo, llegan mediante conexión USB con un retraso de 1–3 fotogramas. Para aplicaciones en producción, la Consola en el dispositivo no está disponible — los desarrolladores confían en Crashlytics o Unified Logging con recopilación remota mediante log collect.
A diferencia de la aplicación de sistema Console.app en Mac, la ventana de Consola en Xcode solo muestra registros de la aplicación actual en ejecución (con capacidad de filtrado). Console.app recopila registros de todos los procesos en Mac, incluidos los simuladores iOS. Sin embargo, para depurar aplicaciones iOS, los desarrolladores usan la Consola integrada de Xcode debido a su integración con el depurador LLDB.
Tres API principales están disponibles para el desarrollador iOS para la salida en la Consola: NSLog (obsoleto), os_log (recomendado) y print (solo Swift). Cada una tiene sus propias características en cuanto a rendimiento, formato y compatibilidad con Unified Logging System.
NSLog es una función de Foundation, disponible en Objective-C y Swift. NSLog muestra un mensaje con marca de tiempo, nombre del proceso y PID. Desventajas: NSLog escribe en el búfer del sistema de forma síncrona, bloqueando el hilo actual durante la escritura. Con llamadas frecuentes (por ejemplo, en un bucle), NSLog crea un retardo notable. Apple no recomienda NSLog para proyectos nuevos, pero sigue siendo compatible con código heredado y bibliotecas de terceros.
os_log es una API de os.framework, introducida en iOS 10. os_log es asíncrono: el mensaje se pone en cola y se escribe en el búfer sin bloquear el hilo de llamada. Según WWDC 2016, os_log es 50 veces más rápido que NSLog en escenarios de alta carga. os_log también admite control dinámico: los mensajes de nivel DEBUG solo se recopilan en compilaciones Debug, y en Release se ignoran sin sobrecarga.
print() es el método de salida más simple en Swift. print escribe en stdout (salida estándar), que Xcode redirige a la Consola. print no añade metadatos (hora, nivel), pero admite el almacenamiento en búfer de stdout. Para depuración rápida, print es una herramienta conveniente, pero para registro permanente se queda corto frente a os_log en funcionalidad y control.
import os.log
// NSLog — obsoleto, bloqueante
NSLog("Application started")
// os_log — recomendado, asíncrono
let log = OSLog(
subsystem: "com.myapp",
category: "lifecycle"
)
os_log("Application started", log: log)
// print — salida Swift rápida
print("Application started")
Unified Logging System (ULS) es la infraestructura de registro integral de Apple, introducida en iOS 10 y macOS Sierra. ULS recopila mensajes de todos los procesos del sistema en un único almacenamiento con capacidad de acceso remoto mediante la herramienta de línea de comandos log en Mac. Los desarrolladores usan os_log para escribir en ULS y la Consola para leer.
Cada OSLog se identifica mediante un par de subsystem (por ejemplo, com.myapp.network) y category (por ejemplo, http, websocket). El subsistema es el dominio de la aplicación (una aplicación puede tener varios subsistemas para diferentes módulos). La categoría es un componente dentro del subsistema. La combinación subsistema + categoría permite filtrar registros de forma flexible en la Consola y log collect.
| Nivel | OSLogType | Visualización en Consola | Recopilación en Release |
|---|---|---|---|
| Default | .default | Siempre | Sí |
| Info | .info | Con UI de os_log activada | Sí |
| Debug | .debug | Solo en compilación Debug | No |
| Error | .error | Siempre con etiqueta roja | Sí |
| Fault | .fault | Siempre con etiqueta morada | Sí |
El comando log collect en Mac reúne registros archivados de un dispositivo iOS conectado en un archivo .logarchive. Este archivo se puede abrir en Console.app en Mac para un análisis detallado, incluidos mensajes de os_log, registros de fallos y diagnósticos del sistema. Para habilitar la recopilación en el dispositivo, es necesario activar el Modo Desarrollador y conectar el dispositivo por USB.
El trabajo práctico con la Consola incluye tres escenarios principales: registro activo durante el desarrollo, análisis de registros de fallos después de un fallo y diagnóstico remoto mediante .logarchive. Cada escenario tiene un conjunto óptimo de herramientas y configuraciones.
Se recomienda crear un OSLog separado para cada módulo de la aplicación con niveles: debug (depuración detallada), info (transiciones clave de estado), error (excepciones y fallos). En la Consola de Xcode, active el filtro por el subsistema de su aplicación para excluir los mensajes del sistema que crean ruido y distraen de la lógica de la aplicación.
Cuando la aplicación falla, Xcode detiene automáticamente la ejecución y muestra el hilo donde ocurrió el fallo, con un stack trace completo en la Consola. La primera línea del registro de fallo contiene el tipo de excepción (NSException, EXC_BAD_ACCESS) y el motivo. Estudie el stack trace de abajo arriba: el último método llamado es la ubicación del fallo. Para direcciones cifradas (en Release), se requiere symbolication mediante dSYM.
// Ejemplo de configuración modular de 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"
)
}
// Uso con niveles
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)
La Consola de Xcode admite varias funciones avanzadas que van más allá del registro simple. Los registros de breakpoints permiten enviar mensajes a la Consola sin detener la ejecución, y los comandos LLDB en Debugger Command brindan control completo sobre el formato de la salida.
Puede configurar un breakpoint para que muestre un mensaje en la Consola y continúe la ejecución automáticamente. Coloque un breakpoint en la línea deseada, haga clic derecho → Edit Breakpoint → agregue Debugger Command: “po self” o “expr @import UIKit” + Debugger Command: “po self.view”. Marque Automatically continue after evaluating. Después de ejecutar, el breakpoint mostrará el resultado del comando en la Consola cada vez que se alcance la línea, sin interrumpir el hilo.
La Consola de Xcode admite la ejecución de comandos LLDB arbitrarios mientras se está detenido en un breakpoint. po (print object) muestra la descripción de un objeto, p (print) muestra valores primitivos, y expr ejecuta expresiones Swift/ObjC. Para salida con formato, use p/CGRectGetWidth. La salida de LLDB aparece en la Consola inmediatamente después de alcanzar el breakpoint.
func processUserData(user: User) {
// Breakpoint aquí con Debugger Command:
// po "User name: \(user.name)"
// expr user.age = 30
print("Processing user: \(user.name)")
}
// Ejemplo de registro personalizado con secuencia
func trackMethodCall(
file: String = #file,
function: String = #function
) {
os_log("[\(function)] called",
log: .uiLifecycle, type: .debug)
}
La Consola de Xcode está estrechamente integrada con Instruments — la herramienta de perfilado de Xcode. Al ejecutar la aplicación mediante Product → Profile con la plantilla Logging, todos los mensajes de os_log se registran en la traza de Instruments con marcas de tiempo. Esto permite ver simultáneamente registros, rendimiento y eventos del sistema en una sola línea de tiempo, lo cual es crítico para diagnosticar condiciones de carrera y regresiones de rendimiento.
Preguntas frecuentes
NSLog es síncrono, bloquea el hilo y siempre muestra el mensaje. os_log es asíncrono, 50 veces más rápido en escenarios de alta carga, admite categorías y desactiva dinámicamente los niveles de depuración en compilaciones Release sin pérdida de rendimiento.
Verifique el nivel de registro: por defecto, la Consola solo muestra default y superior. Para ver info y debug, abra el menú de os_log en la Consola de Xcode y seleccione Include Info Messages e Include Debug Messages en la configuración del esquema (Edit Scheme → Run → Arguments → OS_ACTIVITY_MODE = debug).
Seleccione los mensajes deseados en la Consola, cópielos (Cmd + C) y péguelos en cualquier editor de texto. Para un volcado completo, use el comando de terminal: sudo log collect --device --output /tmp/app_logs.logarchive — guarda todos los registros del dispositivo iOS en un formato estructurado.
os_log de tipo .default y .error funcionan en Release por defecto. Para .info y .debug en Release, debe agregar el argumento de inicio -OSLogPreferencesApp “$(PRODUCT_BUNDLE_IDENTIFIER):debug” en el esquema de Xcode. Sin este argumento, los mensajes de depuración no se recopilan en Release, lo que ahorra recursos del dispositivo.
Abra Window → Organizer → Crashes en Xcode. El Organizador muestra todos los registros de fallos recopilados de los dispositivos de los testers, agrupados por tipo de excepción. La symbolication requiere un archivo .dSYM de la compilación en la que ocurrió el fallo — Xcode lo encuentra automáticamente si hay un archivo disponible.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también