iOS 10 no imprime NSLogs

88

No se imprime nada desde NSLogXcode 8.0 beta (8S128d). printfno ha cambiado

Aquí está mi código:

NSLog(@"hello from NSLog");
printf("hello from printf");

Aquí está la salida en iOS 9 Simulator:

2016-06-17 09:49:10.887 calmapp-dev[28517:567025] hello from NSLog
hello from printf

Aquí está el resultado en el simulador de iOS 10:

hello from printf
Tyler Sheaffer
fuente
Tuve un problema similar. Pero en iOS 8.1, Xcode 8. Revisé todas y cada una de las respuestas aquí. Resulta que estaba haciendo todo correctamente. Nada ayudó realmente. Entonces, apagué el dispositivo y lo encendí. Funciona. Escribí este comentario aquí para que pueda ayudar a otros que enfrentan un problema similar
KrishnaCA

Respuestas:

229

Podría ser que agregó la propiedad "OS_ACTIVITY_MODE": "disable" en las variables de entorno de Scheme (para ocultar la salida del sistema operativo del simulador) y se olvidó de ella, y ahora se está ejecutando en un dispositivo real.

En Xcode 8:

Product -> Scheme -> Edit Scheme -> Run -> Arguments -> Environment Variables

Solo agregue OS_ACTIVITY_MODEy verifique (No agregue un valor)

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Resumen: Este es un error de Xcode 8 + iOS10, lo podemos solucionar de esta manera:

  • Cuando utilice el simulador, agregue el Nombre "OS_ACTIVITY_MODE" y el Valor "deshabilitar" y márquelo.

  • Cuando esté en un dispositivo real, solo agregue "OS_ACTIVITY_MODE" y márquelo (No agregue el valor Value. Verá el NSLog en la consola Xcode8.

usuario6833743
fuente
4
> "No agregue el valor" ¡Lo configuré en "deshabilitar" y funciona! El campo vacío no me funciona.
m8labs
¿Estás seguro de que funciona cuando se depura el dispositivo iPhone real, no el simulador? Si lo configuro en "deshabilitar", la consola no puede NSLog cuando se realiza la depuración real del iPhone.
user6833743
Lo he comprobado ahora sin "deshabilitar", funciona en el dispositivo ahora, pero está roto en el simulador, muestra todo ahora de nuevo ...
m8labs
2
¿Hay alguna forma de automatizar este proceso? es realmente muy molesto que tengamos que recordar ir y venir así: /
invernadero
2
Esta solución ocultará todo NSLog que comience con Xcode 9. Para mantener NSLog, reemplace disablecon default.
Cœur
27

Si consulta las notas de la versión beta de Xcode 8 , encontrará que dice:

Al depurar una aplicación que se ejecuta en Simulator, es posible que los registros no estén visibles en la consola. Solución alternativa: use el comando + / en Simulator.app para abrir el registro del sistema en la aplicación de consola para ver NSLogs. (26457535)

Lucas
fuente
9
Tampoco puedo ver la salida NSLog en un dispositivo iOS 10 real. Si está utilizando dispositivos reales, puede abrir la ventana Dispositivos (Mayús + Comando + 2) y ver los registros del dispositivo allí, pero es difícil ver el registro de la aplicación de depuración porque la consola muestra todos los registros del sistema y las aplicaciones.
kientux
19

NSlog o print realmente se ejecuta pero está oculto entre muchas otras salidas de depuración de la consola para resolver este problema Abra Xcode8:

Product -> Scheme -> Edit Scheme -> Run -> Arguments -> Environment Variables

agregue "OS_ACTIVITY_MODE" y establezca el valor en "deshabilitar" y verifíquelo.

haga clic en cerrar

xcode9

agregue "OS_ACTIVITY_MODE" y establezca el valor en "predeterminado" y márquelo.

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

MiladiuM
fuente
Esto no funciona para mi. Los NSLogs no aparecen para las aplicaciones implementadas. Uso xcode 8.1 (que se ejecuta en Mac 10.11) con un dispositivo iOS 10.
mobjug
21
Esta solución ocultará todo NSLog que comience con Xcode 9. Para mantener NSLog, reemplace disablecon default.
Cœur
3
Esta respuesta debe actualizarse para tener en cuenta la corrección de @ Cœur para Xcode 9.
Joel
7

Tampoco puedo ver la salida NSLog en un dispositivo iOS 10 real. Si está utilizando dispositivos reales, puede abrir la ventana Dispositivos desde Xcode (Mayús + Comando + 2) y ver los registros del dispositivo allí, pero es difícil ver los registros de su aplicación porque la consola muestra los registros del sistema y todas las aplicaciones.

(Estoy usando Xcode 7, por lo que puede que no sea un problema de Xcode sino un problema de iOS 10)

Kientux
fuente
No veo los NSLogs de mi aplicación en la ventana de dispositivos en iOS 10 GM ... ¿tiene el mismo problema?
TahoeWolverine
Puedo ver registros en Xcode 7 con iOS 10 GM, ya no es necesario abrir la ventana de dispositivos.
kientux
2
Sin embargo, no estoy hablando de ejecutar desde Xcode, estoy hablando de que los registros se impriman desde una aplicación implementada.
TahoeWolverine
¿Algún progreso en esto?
jhurray
NSLogs y printf's se omiten del registro del dispositivo iOS 10 en las aplicaciones implementadas. Puede agregar una macro global para reemplazarla con una llamada directamente a os_log.
Elist
7

Además, asegúrese de que la consola esté realmente visible en Xcode (es decir, asegúrese de que el icono del lado derecho esté resaltado en azul, como se muestra en la imagen de abajo). Después de actualizar Xcode, ocultó la consola y me mostró solo la vista Variables. Esto hizo que pareciera que NSLog()no funcionaba correctamente, mientras que de hecho funcionaba correctamente, simplemente no podía ver el resultado.

ingrese la descripción de la imagen aquí

Stewart Macdonald
fuente
También puede activar la consola con Shift + ⌘ + CXcode versión 8.3.3
DJ2
5

Hmmm ... parece que la propiedad "OS_ACTIVITY_MODE": "deshabilitar" EVITA que NSlog aparezca en el registro de Xcode 9.

Al desmarcar este valor en mi esquema, se restauraron mis registros.

David Hersey
fuente
5

Para cualquiera que se encuentre con esto en el futuro. La razón por la que NSLog no imprime en syslog en iOS 10 e iOS 11 se debe a que Apple cambió a Unified Logging.

Puedes ver la WWDC hablar sobre esto aquí: https://developer.apple.com/videos/play/wwdc2016/721/

Documentación aquí: https://developer.apple.com/documentation/os/logging

A partir del 10, debería utilizar os_log en lugar de NSLog.

Cómo encontrar los registros en el disco: https://www.blackbagtech.com/blog/2017/09/22/accessing-unified-logs-image/

En resumen, los registros se encuentran en los /var/db/diagnosticsque se pueden encontrar para una VM en/Users/USERNAME/Library/Developer/CoreSimulator/Devices/SIMULATOR-GUID/data/var/db/

Copie todos los elementos dentro diagnosticsy uuidtexten una sola carpeta (no incluya los diagnósticos de carpetas o uuidtext solo lo que está adentro).

Cambie el nombre de esa carpeta foldername.xarchive.

Ábralo en Console.app o use la utilidad OSX log:log show <path to archive> --info --predicate <options>

shane
fuente
¿Y en iOS?
kakyo
1

Estoy usando Xcode 8, así que también encontré el mismo problema. Y resolví este problema agregando value = disableel simulador, pero en una máquina real no agrego valor.

usuario6733740
fuente
1
Tengo algunos problemas con Xcode 9. Inserté el argumento: OS_ACTIVITY_MODE pero parece que no funciona ...
Alessio Campanelli
4
Esta solución ocultará todo NSLog que comience con Xcode 9. Para mantener NSLog, reemplace disablecon default.
Cœur
En mi opinión, esta es la respuesta correcta. OS_ACTIVITY_MODEcon disableo defaultes directo
Greg
1

NSLoglos mensajes ya no se muestran cuando actualicé a Xcode 9.1 + iOS 11.1. Inicialmente, la respuesta aceptada me dio una manera de solucionar esto usando la aplicación Consola y habilitando el Simulador ( vea la respuesta de Lucas ).

En la aplicación de la Consola Action, intenté seleccionar Include Debug Messagesy anular la selección Include Info Messages(para que la Consola no esté inundada de mensajes del sistema). NSLogLos mensajes aparecieron en la ventana de la consola en Xcode pero no en la aplicación de la consola.

Me di cuenta de que tenía que haber una forma más directa de disablehabilitar o habilitar (es decir default) NSLogsgracias al comentario de Coeur en respuesta a esta respuesta. En mi opinión, es la mejor respuesta porque el establecimiento OS_ACTIVITY_MODEde disableo defaulttendrá más sentido para los principiantes.

Greg
fuente