debug - ¿Se puede redirigir la salida de registro de la consola Xcode a la Terminal cuando se ejecuta el simulador de iPhone?
swift debugging (5)
No me gusta utilizar la ventana de salida de la consola de Xcode al depurar una aplicación de iPhone en el simulador (o en un dispositivo para el caso). Me gustaría poder usar la caja de herramientas de Unix y hacer cosas como filtrar la salida de registro con grep. Pero para hacer esto, necesito que Xcode envíe la salida de registro para la aplicación iPhone en ejecución a la Terminal.
¿Hay alguna forma de lograr esto?
En Xcode 6 ya lo hace. Abra el archivo System.log asociado con la construcción de simuladores que está utilizando actualmente. Para mí está aquí: /Users/josh.lang/Library/Logs/CoreSimulator/3BB4CBFB-5A67-4E93-91B5-78E6E3658A16/system.log
Lo mantendrá todo, pero noté que si lo tengo abierto mientras mi sim se está ejecutando, también se recarga por sí mismo.
No podría decir cómo funcionaría en el simulador, pero redirigir la salida estándar no es terriblemente difícil. Digamos que quería canalizarlo a su propia vista:
#include <unistd.h>
stderr->_write = RedirectOutputToView;
stdout->_write = RedirectOutputToView;
Y usa el prototipo:
int RedirectOutputToView(void *inFD, const char *buffer, int size);
En XCode 6, los registros se pulsan aquí: /Users/<username>/Library/Logs/CoreSimulator/<app guid>/system.log
. el nombre de usuario es, por supuesto, el nombre de usuario de su sistema, y el guid de la aplicación es algo que el XCode genera para el simulador.
La forma más fácil de determinar cuál es la guía de la aplicación es construir su aplicación para el simulador y ver qué directorio se modificó por última vez:
~ ❯❯❯ cd ~/Library/Logs/CoreSimulator
~/L/L/CoreSimulator ❯❯❯ ls -latr
total 64
-rw-r--r-- 1 x staff 519 27 Aug 21:54 iOS Simulator.log
drwxr-xr-x 13 x staff 442 27 Aug 21:54 D283605A-0BA9-43B3-AB6B-F4858BE6E45E
drwxr-xr-x 15 x staff 510 8 Oct 03:56 425D8E41-0842-4F2D-BC22-8C3695E350EF
Claramente 425D8E41-0842-4F2D-BC22-8C3695E350EF es el último directorio modificado, por lo que ahora puede hacer tail -f ~/Library/Logs/CoreSimulator/425D8E41-0842-4F2D-BC22-8C3695E350EF/system.log | grep keyword
tail -f ~/Library/Logs/CoreSimulator/425D8E41-0842-4F2D-BC22-8C3695E350EF/system.log | grep keyword
o cualquier otra cosa que desee hacer con el registro en vivo.
Puedo obtener la salida del dispositivo en un terminal pero no he podido conectar una sesión de depuración en xcode simultáneamente (supongo que porque el terminal tiene una conexión de depuración).
Inicie la aplicación desde una terminal usando idevicedebug.
idevicedebug -u <device uuid> run com.myco.apps.myapp
Donde com.myco.apps.myapp es el ID del paquete que se puede ver en el panel de ''aplicaciones instaladas'' en la ventana de dispositivos.
Creo que idevicedebug se instala con ideviceinstaller y se puede hacer con brew
brew install ideviceinstaller
Pero recomiendo buscar ideviceinstaller y libimobiledevice (la biblioteca que usa) para estar seguro.
Es una pequeña molestia, pero la mejor manera que he encontrado para obtener la salida del programa en una terminal.
Encontré que esta respuesta funciona bien para mi propósito, aunque requiere ejecutar el simulador para transmitirlo en vivo en una terminal:
Eliminé la verificación del simulador y agregué una declaración NSLog justo antes de la redirección para que la consola XCode escupe la ubicación del archivo:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *logPath = [documentsDirectory stringByAppendingPathComponent:@"console.log"];
NSLog(@"redirecting STDERR: %@", logPath);
freopen([logPath cStringUsingEncoding:NSASCIIStringEncoding],"a+",stderr);
Creo que la solución más sólida sería usar una biblioteca de registro (por ejemplo, CocoaLumberjack ) y configurarla con el destino que desee.