¿Cómo depurar extensiones de iOS 8 con NSLog?

90
- (void)viewDidLoad
{
    NSLog(@"%s", __func__);
    // ...
}

en viewDidLoaduna extensión de iOS 8 . las NSLogsalidas no tienen nada en Xcode. NSLogSin embargo, funciona como de costumbre en la aplicación de contenedor.

¿Cómo puedo obtener resultados de los mensajes de depuración de una extensión?

Oh ho
fuente
Yo también tengo este problema. Quizás NSLog simplemente esté roto. Utilizo Breakpoints para depurar valores en este momento. Pero también tienen errores.
gallileo
Tengo un problema similar en el que el depurador nunca se engancha y siempre dice "esperando para adjuntar" en Xcode. Desafortunadamente, no veo nada útil en buscar en Google y publiqué una pregunta aquí en Stack sin respuestas aún.
Alex Bollbach

Respuestas:

95
  1. La depuración funciona para las extensiones de aplicaciones.
  2. También funciona en el simulador.
  3. Si la extensión de la aplicación se bloquea en el simulador, es posible que no sea fácil reiniciar la extensión de la aplicación. Reiniciar su simulador es una solución rápida.
  4. Pasos para depurar una extensión de aplicación:

    1. Ejecute la aplicación de contenedor. En este paso, Xcode carga la aplicación contenedora y la extensión de la aplicación en el dispositivo o simulador.

    2. Detenga la aplicación del contenedor. Este paso es importante cuando depura en el simulador. Si no lo hace, Xcode le dirá que el simulador está en uso.

    3. En Xcode, presione el menú Depurar -> Adjuntar al proceso -> Por identificador de proceso (PID) o Nombre ..., ingrese el identificador de la extensión de la aplicación, por ejemplo, com.abc.ContainerApp.MyExtension, para iniciar la depuración. No olvide establecer puntos de quiebre. (Actualización del 25 de agosto de 2014: puede ingresar MyExtension (el nombre de su extensión) directamente).

    4. En el dispositivo o simulador, abra la extensión de su aplicación.


Actualizaciones el 23 de agosto de 2014:

Encontré que los pasos de depuración anteriores no funcionan bien en Xcode 6 beta 6 con iOS 8 SDK beta 5 en el simulador.

Solución:

  1. Ejecute su extensión en el simulador.
  2. Menú de Xcode Depurar -> Adjuntar al proceso -> Elija "MyExtension (el nombre de su extensión)" en la sección Sistema del menú.

Los puntos de interrupción funcionan. Pero no sé por qué los registros no se muestran en la ventana de salida.

Vince Yuan
fuente
8
Hasta ahora, la forma más fácil de depurar (y ver NSLog) que encontré es siguiendo estos pasos: /// 1 /// Seleccione un esquema de aplicación de contenedor y ejecútelo. /// 2 /// Una vez que esté en funcionamiento, vuelva a XCode y (sin siquiera presionar un botón Detener) seleccione un esquema de extensión, luego presione el botón Ejecutar. /// 3 /// Cuando se le solicite elegir la aplicación para ejecutar, seleccione Hoy. /// 4 /// Ahora los puntos de interrupción y NSLog deberían funcionar sin problemas.
interrumpir el
1
Esto no funciona incluso hoy, especialmente después de un accidente. Esto es muy molesto, no entiendo por qué es tan difícil de solucionar.
Cristi Băluță
3
Traté de usar las instrucciones actualizadas anteriores y funcionó para mí. Sin embargo, en el paso 2, en lugar de usar mi nombre de extensión, usé "Por identificador de proceso (PID) o nombre ..." e ingresé el pid del proceso. Esto mágicamente me permitió usar mis puntos de ruptura.
tony.tc.leung
Depurar> Adjuntar al proceso por PID o nombre: en el campo de texto ingrese el nombre del proceso en el navegador de depuración, algo como com.company.AppName.AppName-ExtensionName
TigerCoding
Esta respuesta no es relevante para la pregunta. El OP pregunta por qué los mensajes de NSLog no se escriben en la consola en una extensión (una preocupación legítima ya que llegué a esta página con la misma pregunta). No menciona nada sobre problemas de conexión con el depurador.
Joey Carson
49

Yo también tengo este problema. Me funciona si vas a tu Simulador en el menú Depurar -> Abrir registro del sistema ...

Desde aquí puede ver todos los registros del iPhone Simulator (incluidos los registros de su extensión).

ingrese la descripción de la imagen aquí

BalestraPatrick
fuente
abrirá "~ / Library / Logs / CoreSimulator / <DEVICE_IDENTIFIER> /system.log" para que pueda encontrar fácilmente todos los registros de sus otros dispositivos simuladores también, simplemente reemplace <DEVICE_IDENTIFIER> con el ID del dispositivo simulador
Hofi
32

NSLog está trabajando perfectamente .

Simplemente no ve lo que se está registrando en el área de depuración de Xcode porque el depurador de Xcode no está adjunto a su extensión. Las extensiones son casi completamente independientes de la aplicación que las contiene. Tienen identificadores de paquete separados, por ejemplo, y también son procesos separados en el sistema operativo.

He tenido varios éxitos en lograr que Xcode se adjunte a las extensiones. Supuestamente parece que se adjunta automáticamente, y aparece en el navegador de depuración como "Esperando adjuntar", pero nunca se adjunta.

A veces, puedo ejecutar mi destino de extensión en Xcode:

ingrese la descripción de la imagen aquí

Y luego tengo la opción de elegir en qué aplicación ejecutar mi extensión. En este caso, elegiría su recomendación de "hoy", que es el centro de notificaciones.

ingrese la descripción de la imagen aquí

Y luego a veces adjuntaba el depurador a mi extensión. Tenga en cuenta que este método solo funciona en dispositivos físicos, al parecer.

Si no se adjunta, puede usar el método de adjunto manual en la respuesta de @ VinceYaun,

También he tenido un éxito variado utilizando otros métodos de apego. La mayoría no han tenido éxito y parece que son solo errores que se solucionarán en una fecha posterior.

Para ver sus mensajes de registro, vaya a Window-> Devicesen la barra superior y seleccione su dispositivo. Puede abrir el registro del dispositivo desde la parte inferior de esa ventana. Si está probando en un simulador, puede usar la respuesta de @ BalestraPatrick .

Algunos de los errores se han corregido en Beta 2, y supongo que eventualmente el depurador se adjuntará automáticamente al iniciar la extensión.

Actualización: en las notas de la versión de iOS 8 Beta 4 :

Extensiones

Corregido en beta 4

  • Las extensiones a veces no se inician al depurar desde Xcode.
  • Cuando se mata Extension with UI, se vuelve a iniciar y no se descarta.
  • A veces, su extensión Compartir o Acción puede bloquearse.
  • Volver a implementar una extensión puede deshabilitarla en el Centro de notificaciones.
Papá Noel
fuente
¿Intentó el mismo enfoque para las extensiones de almacenamiento?
SRP-Achiever
No funcionó para mí en Xcode 6 beta 2, pero la respuesta de Vince Yuan sí lo hizo. Desafortunadamente, en la depuración de la extensión Xcode 6 beta 3 no me funciona en absoluto. No encontré solución a ese problema, probablemente tengamos que esperar al próximo lanzamiento.
Darrarski
@Darrarski Mi respuesta queda de Beta 1. Para su información, Beta 3 está disponible, así que ya debería estar en eso.
Santa Claus
@SantaClaus bastante claro. Mi comentario fue informar que ninguna de las soluciones dadas funciona en Xcode 6 beta 3 para mí. Parece que la depuración de extensiones está aún más rota en esta versión. Esperemos que la próxima beta solucione el problema.
Darrarski
3
Ninguno de esos errores me pareció corregido en la beta 4 (ahora beta 5).
Matt
18

Yo también tengo este problema. Xcode nunca adjunta mi depurador a la extensión ni muestra mensajes NSLog. Si adjunta su depurador Xcode manualmente a su proceso de extensión, al menos los puntos de interrupción funcionan como un encanto:

Debug->Attach to process->Your extension name (mine was "com.example.MyExtensionApp.MyExtension")
Masalis
fuente
5
He tenido suerte con esto.
santa claus
2
upvote, pero no siempre funciona, espero que Apple pueda adjuntar automáticamente el depurador a las extensiones en futuras versiones.
Jing
14
  1. Crea un esquema para tu extensión
  2. Ejecutar esquema
  3. En un cuadro de diálogo, elija la aplicación contenedora
  4. Disfrutar

Se trabaja para mí :)

Maciek Czarnik
fuente
Esto es exactamente lo que necesitaba
pob21
1
NSLogsolo funcionará si está ejecutando la aplicación de contenedor. Que no va a funcionar si se está ejecutando la aplicación extensión en lugar del contenedor.
JaredH
Esto funcionó para mí también. ¡Gracias, Maciek Czarnik! Las soluciones anteriores no funcionaron para mí. Estoy usando Xcode 8.1.
plam4u
5

Xcode 8 puede depurar extensiones:

  1. Elija el esquema de extensión en el combo junto al botón de parada y ejecútelo.
  2. Seleccione la aplicación principal en el cuadro de diálogo que aparece.

Resultado: los puntos de interrupción y el registro funcionan como de costumbre.

Jano
fuente
2
No funciona en mi caso de una extensión de hoy. obteniendo el error CLANG: ld: biblioteca no encontrada para -lRPush clang: error: el comando del vinculador falló con el código de salida 1 (use -v para ver la invocación)
BadmintonCat
Este es un error no relacionado. Está intentando vincular a una biblioteca que falta. Agrega Liferay-Push a tu objetivo.
Jano
4

Lo que finalmente me permitió ver el registro en el área de depuración, según la sugerencia de Michael y la documentación de Apple , es:

Cree y ejecute la extensión de la aplicación en el simulador y, cuando se le solicite una aplicación de host, elija la aplicación específica desde la que va a llamar a la extensión . En mi caso, estaba lanzando mi extensión Action desde Safari abriendo una hoja para compartir en un PDF.

Lo que no funcionaba antes era seguir las sugerencias de otras personas de usar Today como host, pero luego dejar esa aplicación y pasar a Safari para llamar a mi extensión. Ya ni siquiera necesito ejecutar mi aplicación contenedora antes de ejecutar la extensión.

De la documentación de Apple:

En la fase de ejecución de su esquema de extensión, especifica una aplicación de host como ejecutable. Al acceder a la extensión a través de la interfaz de usuario de ese host especificado, el depurador de Xcode se adjunta a la extensión.

Andrés
fuente
1

De hecho, logré que los registros se ejecutaran de manera bastante simple en Xcode 6.3. En primer lugar, compile y ejecute la aplicación que lo contiene. Una vez que la aplicación contenedora se esté ejecutando en el dispositivo, compile y ejecute la extensión de la aplicación cambiando el esquema a la extensión de la aplicación.

Apple tiene documentación directamente relacionada con la depuración, la creación de perfiles y la prueba de la extensión de su aplicación.

Miguel
fuente
1

Un truco que me funciona (aunque es bastante feo) es colocar un muñeco UILabelen algún lugar de la esquina inferior de mi extensión. Normalmente lo llamo logLabel. Luego, es posible actualizar el texto de esta etiqueta con cualquier declaración de registro que desee registrar. Este enfoque no es muy bueno si necesita registrar declaraciones de instancias de diferentes clases. Y, obviamente, satura tu interfaz de usuario.

Sin embargo, si tiene un widget bastante simple y no le importa un ligero desorden de la interfaz de usuario, este es el truco. Probé todas las demás soluciones descritas en esta discusión y, lamentablemente, ninguna de ellas funcionó para mí.

Andriy Gordiychuk
fuente
1

La única forma en que la depuración funciona para mí es seleccionando Depurar-> Adjuntar al proceso por PID o Nombre Luego ingrese el PID, no el nombre de la extensión. Puede encontrar el PID ejecutando la extensión en un dispositivo, vaya a Ventana-> Dispositivos. Encuentra tu dispositivo y visualiza la consola. Cuando vea el nombre de su extensión, estará seguido de un número de 5 dígitos. Ese es el PID

También puse un montón de NSLog en la extensión para encontrar el PID. Esto está en xCode 7

Tony
fuente
1

Encuentra el mismo problema sobre la extensión NSLogy los puntos de ruptura. Lo he combatido con muchos días.

Device logse puede encontrar como la siguiente imagen. Es enXCode -> Window -> Devices and Simulators .

Después de ingresar Open Console, hay un campo de búsqueda en la parte superior derecha del cuadro de diálogo. Puedo aplicar la regla de filtro allí. Por ejemplo, el nombre de un proceso contiene Notificationuna palabra clave, o el nombre del proceso debe ser igual al nombre del destino de la extensión, por ejemplo: igual al MyNotificationServiceExtensionnombre del proceso.

Registro de dispositivo

AechoLiu
fuente
0

Claramente, algo está roto en Xcode6-B5.

Si intento ejecutar una extensión de foto en el simulador, no puedo ver ninguna aplicación de fotos como una opción para el proceso de adjuntar la extensión.

opciones de depuración dentro del simulador

Lo mismo, ejecutándose en un dispositivo real, me da el comportamiento correcto.

opciones de depuración dentro de un dispositivo real

En el primer caso, no se respeta ningún punto de interrupción. En el último caso, los puntos de interrupción funcionan a la perfección.

valvolina
fuente
0

Debe saber que la aplicación contenedora y la extensión son procesos totalmente diferentes en iOS, mientras que LLVM depura solo un hilo por vez, por lo que cuando está depurando, la consola nunca registra la extensión y nunca se detiene en el punto de interrupción.

Puede resolver la mayoría de los problemas con el método de @Vince Yuan.

Sin embargo, mi problema es que el depurador de Xcode apenas se engancha en la extensión de mi teclado tanto en el simulador de iOS como en los dispositivos, como 1 vez en 7-8 ejecuciones. Es totalmente una cuestión de probabilidad. El método de @Vince Yuan también funciona solo a veces.

Mi pequeña experiencia es que cuando ejecuta su esquema de depuración, si la sesión de depuración en el panel izquierdo muestra que 'Sin sesión de depuración', no hay necesidad de abrir su extensión y probarla, el depurador no se enganchó, simplemente ejecute de nuevo por suerte.

pero cuando vea que com.xxx.xxx.xxx está esperando para adjuntar, la extensión definitivamente se puede depurar.

Este es un pequeño truco para quienes no pueden depurar la extensión de iOS, especialmente la extensión del teclado.

Enrique
fuente
0

A partir de Xcode 6 Beta 5, he podido usar un dispositivo real con iOS8 para depurar mi extensión. Intente ejecutarlo en un dispositivo y seleccione Safari para iniciar

Rich86man
fuente
0

Para superar todos los estados causados ​​por el IDE en constante cambio, estoy usando iOS Console de lemonjar.com: muestra una ventana de consola para cualquier dispositivo iOS conectado que muestre mensajes de syslog independientemente del ID del proceso. Puede ver los mensajes de registro de depuración de aplicaciones y extensiones a la vez aquí.

igraczech
fuente
0

Podría depurar mi extensión de la forma que describo a continuación:

  1. Xcode : Debug->Attach to process by PID or Name . El nombre de su esquema de extensión.
  2. Luego seleccione su main app targety ejecute.

Espero que también les funcione a ustedes.

abdullahselek
fuente