2009-12-15 12 views
16

No me gusta usar 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.¿Se puede redirigir la salida de registro de la consola Xcode a la Terminal cuando se ejecuta el simulador de iPhone?

¿Hay alguna manera de lograr esto?

+2

buena pregunta. esto no me molestó hasta este momento. – pestilence669

+0

Encontré la respuesta a mi propia pregunta. Está en http://www.cocoadev.com/index.pl?NSLogToFile y en el comentario que comienza "Aún mejor, evite los arreglos C potencialmente desbordantes y use la bondad de Cocoa ..." – dan

+0

Gracias por el enlace dan. Creo que esta es la verdadera respuesta. – phatblat

Respuesta

4

No podría decir cómo funcionaría en el simulador, pero redirigir la salida estándar no es terriblemente difícil. Di que quieres tubería en su propio punto de vista:

#include <unistd.h> 

stderr->_write = RedirectOutputToView; 
stdout->_write = RedirectOutputToView; 

y el uso del prototipo:

int RedirectOutputToView(void *inFD, const char *buffer, int size); 
+2

Sé cómo redirigir stdout. Solo necesito saber cómo ejecutar una aplicación de iPhone en modo de depuración en XCode para enviarla a la salida estándar de la Terminal. – dan

+0

Gracias, pero debe haber una manera más simple de hacer esto. Por ejemplo, si hubiera una manera (que no conozco) de iniciar la aplicación para iPhone en el iPhoneSimulator directamente desde la Terminal, entonces, presumiblemente, la salida de registro aparecería en la ventana Terminal desde la que se lanzó la aplicación. – dan

+0

Así que redirigirlo a un archivo y ejecutar tail -f sobre eso. Si Terminal tiene un stdout, no puede escribir desde fuera de su espacio de direcciones. –

2

encontré el this answer para trabajar bien para mi propósito, aunque se requiere la ejecución del simulador con el fin de transmitir en directo en un terminal:

me quita el cheque simulador y añadí una declaración NSLog justo antes de la redirección de consola por lo que el 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 (p. CocoaLumberjack ) y configúrelo con el destino que desee.

5

En XCode 6, los registros se seleccionan aquí: /Users/<username>/Library/Logs/CoreSimulator/<app guid>/system.log. nombre de usuario es, por supuesto, su nombre de usuario del sistema, y ​​aplicación guid es algo que el XCode genera para el simulador.

La forma más fácil de determinar cuál es el GUID aplicación es, es la construcción de su aplicación para el simulador y ver qué directorio se cambió 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 o cualquier otra cosa que desee hacer con el registro activo.

+1

La mejor respuesta. Btw XCode 7 hace lo mismo – snayde

1

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 un terminal usando idevicedebug.

idevicedebug -u <device uuid> run com.myco.apps.myapp 

Dónde com.myco.apps.myapp es el ID de paquete que se puede ver en el panel '' aplicaciones instaladas en la ventana de dispositivos.

Yo creo idevicedebug se instala con ideviceinstaller y se puede hacer con la cerveza

brew install ideviceinstaller 

pero recomiendo la búsqueda de ideviceinstaller y libimobiledevice (la biblioteca que utiliza este) sólo para estar seguro.

Es una pequeña molestia, pero la mejor manera que he encontrado para obtener la salida del programa en una terminal.

0

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

Se mantendrá todo, pero me di cuenta si lo tengo abierto mientras mi sim se está ejecutando, también se recarga por sí mismo.

0

¿Por qué no utilizar Console.app? Una buena forma de ver y grep registros, en lugar de la ventana o terminal de depuración de xCode. Esto es parte de macOS por defecto.

enter image description here

Si tiene printf C entonces la siguientes SO dispone de mucha información útil: Get printf on Console.app

Cuestiones relacionadas