Registrar datos en el dispositivo y recuperar el registro

81

En una compilación de depuración en Xcode, independientemente de si estoy usando el simulador o un dispositivo real, las declaraciones NSLog, printf, fprintf assert y NSAssert aparecen en la consola

Si ahora ejecuto una versión de lanzamiento en el dispositivo (digamos que envío una versión de vuelo de prueba y la agrancio en mi iPhone; esta será una versión de lanzamiento), ¿cuáles de estas (si las hay) se grabarán?

¿Y cómo recupero el registro?

¿NSLog realmente genera algo en la compilación de la versión? ¿Cuál es el factor determinante? ¿Si está escribiendo en stdout o stderr? ¿Solo se escribe stderr en el registro del dispositivo? ¿Significa esto que tengo que usar fprintf? ¿Se escribe ALGO en el registro del dispositivo? ¿Existe tal cosa? Si es así, ¿cómo recogerlo?

¿Alguien podría aclarar la situación?

Pi
fuente
1
Para guardar las salidas como archivo, use esto: stackoverflow.com/questions/28114110/…
Kiran P Nair

Respuestas:

93
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *fileName =[NSString stringWithFormat:@"%@.log",[NSDate date]];
NSString *logFilePath = [documentsDirectory stringByAppendingPathComponent:fileName];
freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding],"a+",stderr);

Simplemente agregue este bloque de código en el application:didFinishLaunchingWithOptionsmétodo en el archivo delegado de la aplicación y creará un archivo de registro en el directorio de documentos de la aplicación en el iPhone que registra todos los eventos de registro de la consola. Necesita importar este archivo desde iTunes para ver todos los eventos de la consola.

Nota: En el archivo .plist, asegúrese de que Application supports iTunes file sharingexista y esté configurado para YESque pueda acceder a través de iTunes.

Para obtener archivos de registro: inicie iTunes, después de que su dispositivo se haya conectado, seleccione Aplicaciones - seleccione su Aplicación - en Augument Document obtendrá su archivo. Luego puede guardarlo en su disco

Shyla
fuente
1
¿Como funciona esto? con solo tener un .logarchivo en el directorio de documentos, iOS escribe la salida de su consola allí?
Ali
2
¿Cómo eliminar los archivos de registro mediante programación por orden de fecha para evitar fugas de memoria en el disco?
hkaraoglu
4
No estoy seguro de si NSDocumentDirectoryes apropiado para archivos de registro; generalmente está destinado al contenido generado por el propio usuario, pero los archivos de registro son contenido de soporte de la aplicación, por lo tanto, tal vez pertenezcan al NSLibraryDirectorysubdirectorio / Logs.
JustAMartin
¿Cómo puedo exportar los detalles del registro desde una PC con Windows?
Vineesh TP
1
@Ali funciona asociando el descriptor de archivo stderr (salida de error estándar) (es decir, el descriptor de archivo 2) a un archivo abierto para escritura. Entonces, cada vez que imprime en stderr, se imprime en el archivo. De esa manera, captura la salida stderr de la aplicación. El sistema de registro no sabe nada al respecto.
Ammo Goettsch
140

En Xcode 6.1.1, puede ver la salida de NSLog haciendo lo siguiente. Sin embargo, no estoy seguro de si le permite ver registros de tiempos muy lejanos. Solo lo he visto retroceder hasta un par de horas.

En cualquier caso, estos son los pasos:

  1. En Xcode, vaya a Ventana -> Dispositivos.
  2. Seleccione su dispositivo en el panel izquierdo.
  3. Haga clic en la pequeña flecha como se muestra en la captura de pantalla a continuación.

ingrese la descripción de la imagen aquí

Myxtic
fuente
3
Esta debería ser la respuesta correcta ... Pasé media hora buscando el botón de registro. Gracias por
ahorrarme
1
solo NSLog. No espere cout o printf allí.
Kiran
10
No puede obtener los registros de aplicaciones de producción / enviadas utilizando esta técnica. Es útil solo durante la depuración.
Satyam
7
me alegraste el día, ejemplo perfecto de cómo NO diseñar la interfaz de usuario, tal vez deberían leer developer.apple.com/library/mac/documentation/UserExperience/…
Hofi
1
Acabas de salvar mi tocino. He estado persiguiendo un error que solo aparece en la versión de lanzamiento, los registros revelaron el problema. Había mirado ese mismo cuadro de diálogo y nunca pensé en hacer clic en la flecha pequeña, que aparentemente es un símbolo universal para "mostrar registros de dispositivos en vivo". ¡Gracias!
chacmool
23

En swift 3.0, el código de Shyl cambiará a,

var paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
let documentsDirectory = paths[0]
let fileName = "\(Date()).log"
let logFilePath = (documentsDirectory as NSString).appendingPathComponent(fileName)
freopen(logFilePath.cString(using: String.Encoding.ascii)!, "a+", stderr)

todos los demás procesos son los mismos que explica Shyl

Simplemente agregue este bloque de código en la aplicación: método didFinishLaunchingWithOptions en el archivo delegado de la aplicación y creará un archivo de registro en el directorio de documentos de la aplicación en el iPhone que registra todos los eventos de registro de la consola. Necesita importar este archivo desde iTunes para ver todos los eventos de la consola.

Nota: En el archivo .plist, asegúrese de que Application supports iTunes file sharingexista y esté configurado para YESque pueda acceder a través de iTunes.

Para obtener archivos de registro: inicie iTunes, después de que su dispositivo se haya conectado, seleccione Aplicaciones - seleccione su aplicación - en Augument Document obtendrá su archivo. Luego puede guardarlo en su disco

Kiran P Nair
fuente
corrígeme si me equivoco: esto cambia el directorio de los registros, lo que significa que está escrito originalmente /var/db/diagnostics/. Vea aquí .
Cariño
@Honey, este registro se guardará en el directorio de documentos de la aplicación.
Kiran P Nair
Este código siempre crea un nuevo archivo cuando se inicia la aplicación
DURGESH
¿Alguna idea de cómo hacer que esto funcione cuando el registro se ejecuta dentro de una extensión de reloj?
user2623825
1
@KiranPNair: ¿puedo hacer esto para las declaraciones print () también o solo para NSLog?
Fra
12

NSLog está escrito en el registro del dispositivo en la versión de producción y puede verificar esto conectando su iPhone a su sistema y usando Organizador. Seleccione su iPhone en el organizador, haga clic en Registros del dispositivo. Vería todas las salidas de NSLog en el registro.

Bora
fuente
4
Actualización: en Xcode 6 ya no es posible leer las salidas NSLog a través de los registros del dispositivo. Ventana> Organizador ya no enumera los dispositivos. En su lugar, Ventana> Dispositivos enumera los dispositivos, pero solo muestra los registros de fallas.
Robert
1
Robert, en la pantalla Ventana> Dispositivos de Xcode 6 hay una línea invisible cerca del borde inferior de la pantalla. Si lo abre, verá el registro de la consola de su dispositivo seleccionado. Es invisible debido a un error de interfaz de usuario en Xcode, creo.
oradyvan
7

Encontré este enlace de APPLE muy informativo y completo. Prácticamente le brinda todas las opciones para ver o acceder a los registros del dispositivo, ya sea que estén conectados o no a su máquina de desarrollo.

https://developer.apple.com/library/ios/qa/qa1747/_index.html

GrandSteph
fuente
1
Este documento está sorprendentemente desactualizado. Solo menciona xCode 6. El método es completamente diferente para xCode 9 y 10
1800 INFORMACIÓN
2

Sí, salidas NSLog en el dispositivo. Puede ver sus salidas con su dispositivo conectado a su Mac y usando la herramienta Xcode Organizer.

Denis
fuente
¿Es posible que un usuario inspeccione estos registros a través de iTunes?
P i
3
Esta respuesta stackoverflow.com/questions/2334664/… indica que la Utilidad de configuración del iPhone es posible exportar el registro de la consola desde el dispositivo
Denis
2

Sé que este es un hilo antiguo, pero también puede tener acceso a los registros del dispositivo que van a:

Configuración -> Privacidad -> Análisis -> Datos

Espero que esto ayude

Saludos

Ramón Esteban
fuente