Como depurar extensões iOS 8 com NSLog?

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

em viewDidLoadde uma extensão iOS 8 . a NSLogsaída não é nada no Xcode. NSLogfunciona normalmente no aplicativo de contêiner.

Como posso obter saída de mensagens de depuração de uma extensão?

Oh Ho
fonte
eu tenho esse problema também. Talvez o NSLog esteja apenas quebrado. Eu uso Breakpoints para depurar valores no momento. Mas eles também têm muitos erros.
gallileo
Eu tenho um problema semelhante onde o depurador nunca trava e sempre diz "esperando para anexar" no Xcode. Infelizmente, não vejo nada de útil no Google e postei uma pergunta aqui no Stack sem respostas ainda.
Alex Bollbach

Respostas:

95
  1. A depuração funciona para extensões de aplicativo.
  2. Também funciona no simulador.
  3. Se a extensão do seu aplicativo travar no simulador, você pode achar que não é fácil reiniciá-la. Reiniciar seu simulador é uma solução rápida.
  4. Etapas para depurar uma extensão de aplicativo:

    1. Execute o aplicativo de contêiner. Nesta etapa, o Xcode carrega o aplicativo de contêiner e a extensão de aplicativo para o dispositivo ou simulador.

    2. Pare o aplicativo do contêiner. Esta etapa é importante quando você depura no simulador. Se você não fizer isso, o Xcode informará que o simulador está em uso.

    3. No Xcode, pressione o menu Depurar -> Anexar ao Processo -> Por Identificador de Processo (PID) ou Nome ..., insira o identificador do ext do aplicativo, por exemplo, com.abc.ContainerApp.MyExtension, para iniciar a depuração. Não se esqueça de definir pontos de interrupção. (Atualização em 25 de agosto de 2014: você pode inserir MyExtension (o nome da sua extensão) diretamente.)

    4. No dispositivo ou simulador, abra sua extensão de aplicativo.


Atualizações em 23 de agosto de 2014:

Descobri que as etapas de depuração acima não funcionam bem no Xcode 6 beta 6 com iOS 8 SDK beta 5 no simulador.

Solução:

  1. Execute sua extensão no simulador.
  2. Menu Xcode Debug -> Attach to Process -> Escolha "MyExtension (nome da sua extensão)" na seção Sistema no menu.

Os pontos de interrupção funcionam. Mas não sei por que os logs não aparecem na janela de saída.

Vince Yuan
fonte
8
Até agora, a maneira mais fácil de depurar (e ver NSLog) que encontrei é seguir estas etapas: /// 1 /// Selecione um esquema de aplicativo de contêiner e execute-o. /// 2 /// Assim que estiver instalado e funcionando - volte para o XCode e (sem nem mesmo pressionar o botão Parar) selecione um esquema de extensão e pressione o botão Executar. /// 3 /// Quando solicitado a escolher o aplicativo a ser executado, selecione Hoje. /// 4 /// Agora os pontos de interrupção e NSLog devem funcionar sem problemas.
interromper
1
Isso não está funcionando até hoje, especialmente depois de um acidente. Isso é muito chato, eu não entendo porque é tão difícil de consertar.
Cristi Băluță
3
Tentei usar as instruções atualizadas acima e funcionou para mim. No entanto, na etapa 2, em vez de usar meu nome de extensão, usei "Por identificador de processo (PID) ou nome ..." e digitei o pid do processo. Isso magicamente me permitiu usar meus pontos de interrupção.
tony.tc.leung
Depurar> Anexar ao processo por PID ou nome: no campo de texto, insira o nome do processo no navegador de depuração, algo como com.company.AppName.AppName-ExtensionName
TigerCoding
Esta resposta não é relevante para a pergunta. O OP está perguntando por que as mensagens NSLog não são gravadas no console em uma extensão (uma preocupação legítima, pois vim para esta página com a mesma pergunta). Ele não menciona nada sobre problemas de conexão com o depurador.
Joey Carson
49

Eu também estou tendo esse problema. Funciona para mim se você acessar seu Simulador no menu Depurar -> Abrir Log do Sistema ...

A partir daqui, você pode ver todos os logs do Simulador do iPhone (incluindo os logs de sua extensão).

insira a descrição da imagem aqui

BalestraPatrick
fonte
ele abrirá "~ / Library / Logs / CoreSimulator / <DEVICE_IDENTIFIER> /system.log" para que você possa encontrar facilmente todos os seus outros registros de dispositivos simuladores, basta substituir <DEVICE_IDENTIFIER> pelo ID do dispositivo simulador
Hofi
32

NSLogestá funcionando perfeitamente .

Você simplesmente não vê o que está sendo registrado na área de depuração do Xcode porque o depurador Xcode não está conectado à sua extensão. As extensões são quase completamente independentes do aplicativo que as contém. Eles têm identificadores de pacote separados, por exemplo, e também são processos separados no SO.

Tive sucesso variado em fazer com que o Xcode fosse anexado a extensões. Supostamente, parece que ele seria anexado automaticamente e aparece no navegador de depuração como "Aguardando anexar", mas nunca é anexado.

Às vezes, consigo executar meu destino de extensão no Xcode:

insira a descrição da imagem aqui

E então tenho a opção de escolher em qual aplicativo executar minha extensão. Nesse caso, eu escolheria sua recomendação de "hoje", que é a central de notificações.

insira a descrição da imagem aqui

E às vezes ele anexava o depurador à minha extensão. Observe que este método só funciona em dispositivos físicos, ao que parece.

Se não anexar, você pode usar o método de anexação manual na resposta de @VinceYaun,

Também tive sucesso variado usando outros métodos de fixação. A maioria não teve êxito e parece que são apenas bugs que serão corrigidos posteriormente.

Para visualizar suas mensagens de log, vá para Window-> Devicesna barra superior e selecione seu dispositivo. Você pode abrir o registro do dispositivo na parte inferior dessa janela. Se você estiver testando em um simulador, pode usar a resposta de @BalestraPatrick .

Alguns dos bugs foram corrigidos no Beta 2, e meu palpite é que, eventualmente, o depurador será anexado automaticamente ao iniciar a extensão.

Atualização: nas notas de lançamento do iOS 8 Beta 4 :

Extensões

Corrigido em beta 4

  • As extensões às vezes falham ao iniciar durante a depuração do Xcode.
  • Quando a extensão com IU é eliminada, ela é reiniciada e não é descartada.
  • Às vezes, sua extensão de compartilhamento ou ação pode travar.
  • Reimplantar uma extensão pode desativá-la na Central de Notificações.
Papai Noel
fonte
você tentou a mesma abordagem para extensões de armazenamento?
SRP-Achiever
Não funcionou para mim no Xcode 6 beta 2, mas a resposta de Vince Yuan sim. Infelizmente, a depuração de extensões beta 3 do Xcode 6 não funciona para mim. Não encontrei solução para esse problema, provavelmente teremos que esperar o próximo lançamento.
Darrarski
@Darrarski Minha resposta sobrou do Beta 1. Para sua informação, o Beta 3 foi lançado, então você já deve estar trabalhando nisso.
Papai Noel
@SantaClaus muito claro. Meu comentário foi para informar que nenhuma das soluções fornecidas funciona no Xcode 6 beta 3 para mim. Parece que a depuração de extensão está ainda mais corrompida nesta versão. Esperamos que o próximo beta resolva o problema.
Darrarski
3
Nenhum desses bugs parecia corrigido para mim no beta 4 (agora beta 5).
Mateus
18

Eu também estou tendo esse problema. O Xcode nunca anexa meu depurador à extensão ou exibe mensagens NSLog. Se você anexar o depurador Xcode manualmente ao processo de extensão, pelo menos os pontos de interrupção funcionam perfeitamente:

Debug->Attach to process->Your extension name (mine was "com.example.MyExtensionApp.MyExtension")
Masalis
fonte
5
Eu tive sorte misturada com isso.
Papai Noel de
2
upvote, mas nem sempre funcionando, espero que a apple possa anexar automaticamente o depurador a extensões em versões futuras.
Jing de
14
  1. Crie um esquema para sua extensão
  2. Executar esquema
  3. Em uma caixa de diálogo, escolha o aplicativo de contêiner
  4. Aproveitar

Ele funciona para mim :)

Maciek Czarnik
fonte
Isso é exatamente o que eu precisava
pob21
1
NSLogsó funcionará se você estiver executando o aplicativo de contêiner. Ele não vai funcionar se você estiver executando o aplicativo de extensão em vez do recipiente.
JaredH
Isso funcionou para mim também. Obrigado, Maciek Czarnik! As soluções acima não funcionaram para mim. Estou usando o Xcode 8.1.
plam4u
5

O Xcode 8 é capaz de depurar extensões:

  1. Escolha o esquema de extensão na combinação ao lado do botão Parar e execute-o.
  2. Selecione o aplicativo pai na caixa de diálogo que aparece.

Resultado: pontos de interrupção e log funcionam normalmente.

Jano
fonte
2
Não funciona no meu caso de extensão do Today. obtendo erro CLANG: ld: biblioteca não encontrada para -lRPush clang: erro: o comando do linker falhou com o código de saída 1 (use -v para ver a invocação)
BadmintonCat
Este é um erro não relacionado. Você está tentando se conectar a uma biblioteca ausente. Adicione Liferay-Push ao seu alvo.
Jano,
4

O que finalmente me permitiu ver o log na área de depuração, com base na sugestão de Michael e na documentação da Apple , foi:

Crie e execute a extensão de aplicativo no simulador e, quando solicitado por um aplicativo host, escolha o aplicativo específico do qual você vai chamar a extensão . No meu caso, eu estava lançando minha extensão Action do Safari puxando uma folha de compartilhamento em um PDF.

O que não funcionava antes era seguir as sugestões de outras pessoas de usar o Today como host, mas depois deixar o aplicativo e ir para o Safari para ligar para o meu ramal. Não preciso mais executar meu aplicativo de conteúdo antes de executar a extensão.

Da documentação da Apple:

Na fase de execução do seu esquema de extensão, você especifica um aplicativo host como o executável. Ao acessar a extensão por meio da IU do host especificado, o depurador Xcode se conecta à extensão.

Andrew
fonte
1

Um truque que funciona para mim (embora seja bastante feio) é colocar um manequim UILabelem algum lugar no canto inferior da minha extensão. Eu geralmente chamo isso logLabel. Então, é possível atualizar o texto desse rótulo com qualquer declaração de log que você deseja registrar. Essa abordagem não é muito boa se você precisar registrar instruções de instâncias de classes diferentes. E, obviamente, isso confunde sua IU.

No entanto, se você tiver um widget bastante simples e não se importar com uma pequena desordem da IU, isso resolverá o problema. Tentei todas as outras soluções descritas nesta discussão e, infelizmente, nenhuma delas funcionou para mim.

Andriy Gordiychuk
fonte
1

A única maneira de depurar funciona para mim é selecionando Depurar-> Anexar ao processo por PID ou nome Em seguida, insira o PID, não o nome da extensão. Você pode encontrar o PID executando a extensão em um dispositivo, vá para Janela-> Dispositivos. Encontre o seu dispositivo e visualizando o console. Quando você vir o nome do seu ramal, ele será seguido por um número de 5 dígitos. Esse é o PID

Eu também coloquei um monte de NSLogs na extensão para encontrar o PID também. Isso está no xCode 7

Tony
fonte
1

Encontre o mesmo problema sobre a extensão NSLoge os pontos de interrupção. Lutei contra isso por muitos dias.

Device logpode ser encontrado como imagem a seguir. É às XCode -> Window -> Devices and Simulators.

Depois de inserir o Open Console, há um campo de pesquisa no canto superior direito da caixa de diálogo. Posso aplicar a regra do filtro lá. Por exemplo, um nome de processo contém Notificationuma palavra-chave ou o nome do processo deve ser igual ao nome do destino da extensão, ex: igual ao MyNotificationServiceExtensionnome do processo.

Registro do dispositivo

AechoLiu
fonte
0

É claro que algo está quebrado no Xcode6-B5.

Se tento executar uma extensão do Photo no Simulador, não consigo ver nenhum Photos.app como uma opção para o processo de anexação da extensão.

opções de depuração no simulador

O mesmo, rodando em um dispositivo real, me dá o comportamento correto.

opções de depuração dentro de um dispositivo real

No primeiro caso, qualquer ponto de interrupção não é honrado. No último caso, os pontos de interrupção funcionam perfeitamente.

valvoline
fonte
0

Você deve saber que o aplicativo de contêiner e a extensão são processos totalmente diferentes no iOS, enquanto o LLVM depura apenas um thread por vez, portanto, quando você está depurando, o console nunca registra a extensão e nunca para no ponto de interrupção.

Você pode resolver a maioria dos problemas pelo método de @Vince Yuan.

No entanto, meu problema é que o depurador Xcode dificilmente engancha na minha extensão de teclado no simulador iOS e dispositivos, como 1 vez em 7-8 execuções, é totalmente uma questão de probabilidade. O método de @Vince Yuan também funciona apenas algumas vezes.

Minha pouca experiência é que quando você executa o esquema de depuração, se a sessão de depuração no painel esquerdo mostra que 'Sem sessão de depuração', não há necessidade de abrir sua extensão e testá-la, o depurador não conectou, apenas execute novamente com sorte.

mas quando você vir com.xxx.xxx.xxx esperando para anexar, a extensão pode definitivamente ser depurada.

Este é um pequeno truque para quem não pode depurar a extensão do iOS, especialmente a extensão do teclado.

Henry
fonte
0

A partir do Xcode 6 Beta 5, fui capaz de usar um dispositivo real executando iOS8 para depurar minha extensão. Tente executá-lo em um dispositivo e selecione Safari para iniciar em

Rich86man
fonte
0

Para superar todos os estados causados ​​pela mudança constante do IDE, estou usando o iOS Console da lemonjar.com - ele exibe uma janela de console para qualquer dispositivo iOS conectado que renderiza mensagens syslog, independentemente da ID do processo. Você pode ver as mensagens de log de depuração de aplicativos e extensões ao mesmo tempo aqui.

igraccheco
fonte
0

Eu poderia depurar minha extensão da maneira que descrevo abaixo:

  1. Xcode : Debug-> Attach to process by PID or Name. Seu nome de esquema de extensão.
  2. Em seguida, selecione o seu main app targete execute.

Espero que também funcione para vocês.

Abdullahselek
fonte