Come eseguire il debug delle estensioni di iOS 8 con NSLog?


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

in viewDidLoaddi IOS 8 estensione . il NSLognulla uscite in Xcode. NSLogfunziona come al solito nell'app contenitore.

Come posso ottenere l'output dai messaggi di debug da un'estensione?


Anche io ho questo problema. Forse NSLog è solo rotto. Al momento utilizzo i punti di interruzione per eseguire il debug dei valori. Ma sono anche davvero bacati.
gallileo

Ho un problema simile in cui il debugger non si aggancia mai e dice sempre "in attesa di allegare" in Xcode. Sfortunatamente non vedo nulla di utile dal googling e ho pubblicato una domanda qui su Stack senza ancora risposte.
Alex Bollbach

Risposte:


95
  1. Il debug funziona per le estensioni di app.
  2. Funziona anche sul simulatore.
  3. Se la tua app ext si arresta in modo anomalo nel simulatore, potresti scoprire che non è facile riavviare la tua app ext. Il riavvio del simulatore è una soluzione rapida.
  4. Passaggi per eseguire il debug di un'estensione per app:

    1. Esegui l'app contenitore. In questo passaggio, Xcode carica l'app contenitore e l'estensione dell'app sul dispositivo o sul simulatore.

    2. Arresta l'app contenitore. Questo passaggio è importante quando si esegue il debug nel simulatore. Se non lo fai, Xcode ti dirà che il simulatore è in uso.

    3. In Xcode, premi menu Debug -> Collega a processo -> Per Identificatore di processo (PID) o Nome ..., inserisci l'identificatore dell'estensione dell'app, ad esempio com.abc.ContainerApp.MyExtension, per avviare il debug. Non dimenticare di impostare i punti di interruzione. (Aggiornamento del 25 agosto 2014: puoi inserire MyExtension (il nome della tua estensione) direttamente.)

    4. Nel dispositivo o nel simulatore, apri l'estensione dell'app.


Aggiornamenti il ​​23 agosto 2014:

Ho scoperto che i passaggi di debug sopra riportati non funzionano bene su Xcode 6 beta 6 con iOS 8 SDK beta 5 sul simulatore.

Soluzione:

  1. Esegui la tua estensione nel simulatore.
  2. Menu Xcode Debug -> Collega al processo -> Scegli "MyExtension (nome della tua estensione)" nella sezione Sistema del menu.

I punti di interruzione funzionano. Ma non so perché i log non vengono visualizzati nella finestra di output.


8
Finora il modo più semplice per eseguire il debug (e vedere NSLog) che ho trovato è seguire questi passaggi: /// 1 /// Seleziona uno schema dell'app contenitore ed eseguilo. /// 2 /// Quando è attivo e funzionante, torna a XCode e (senza nemmeno premere un pulsante Stop) seleziona uno schema di estensione, quindi premi il pulsante Esegui. /// 3 /// Quando viene richiesto di scegliere l'app da eseguire, selezionare Oggi. /// 4 /// Ora i breakpoint e NSLog dovrebbero funzionare senza problemi.
interrompe il

1
Questo non funziona nemmeno oggi, soprattutto dopo un incidente. Questo è molto fastidioso, non capisco perché sia ​​così difficile da risolvere.
Cristi Băluță

3
Ho provato a utilizzare le istruzioni aggiornate sopra e ha funzionato per me. Tuttavia, nel passaggio 2, invece di utilizzare il nome dell'estensione, ho utilizzato "By Process Identifier (PID) o Name ..." e ho inserito il pid del processo. Questo magicamente mi ha permesso di usare i miei break point.
tony.tc.leung

Debug> Allega al processo tramite PID o nome: nel campo di testo inserisci il nome del processo nel navigatore di debug, qualcosa come com.company.AppName.AppName-ExtensionName
TigerCoding

Questa risposta non è pertinente alla domanda. L'OP chiede perché i messaggi NSLog non vengono scritti sulla console in un'estensione (una preoccupazione legittima dato che sono arrivato a questa pagina con la stessa domanda). Non menziona nulla sui problemi di connessione al debugger.
Joey Carson

49

Anch'io ho questo problema. Per me funziona se vai nel tuo simulatore nel menu Debug -> Apri registro di sistema ...

Da qui puoi vedere tutti i log del simulatore iPhone (inclusi i log della tua estensione).

inserisci qui la descrizione dell'immagine


si aprirà "~ / Library / Logs / CoreSimulator / <DEVICE_IDENTIFIER> /system.log" in modo da poter trovare facilmente anche tutti gli altri registri dei dispositivi del simulatore, basta sostituire <DEVICE_IDENTIFIER> con l'ID del dispositivo del simulatore
Hofi

32

NSLogfunziona perfettamente .

Semplicemente non vedi cosa viene registrato nell'area di debug di Xcode perché il debugger di Xcode non è collegato alla tua estensione. Le estensioni sono quasi completamente indipendenti dalla loro app contenente. Hanno identificatori di bundle separati, ad esempio, e sono anche processi separati sul sistema operativo.

Ho avuto vari successi nell'ottenere Xcode da allegare alle estensioni. Presumibilmente sembra che si attaccherebbe automaticamente, e appare nel navigatore di debug come "In attesa di allegare", ma non si allega mai.

A volte, riesco a eseguire la mia estensione target in Xcode:

inserisci qui la descrizione dell'immagine

E poi ho la possibilità di scegliere in quale applicazione eseguire la mia estensione. In questo caso, sceglierei la sua raccomandazione di "oggi", che è il centro di notifica.

inserisci qui la descrizione dell'immagine

E poi a volte lo sarebbe collega il debugger alla mia estensione. Nota che questo metodo funziona solo su dispositivi fisici, a quanto pare.

Se non si collega, puoi utilizzare il metodo di allegato manuale nella risposta di @ VinceYaun,

Ho anche avuto vari successi usando altri metodi di attaccamento. La maggior parte non ha avuto successo e sembra che si tratti solo di bug che verranno corretti in un secondo momento.

Per visualizzare i tuoi messaggi di registro vai su Window-> Devicesnella barra in alto e seleziona il tuo dispositivo. È possibile visualizzare il registro del dispositivo dalla parte inferiore di quella finestra. Se stai testando su un simulatore, puoi usare la risposta di @ BalestraPatrick .

Alcuni bug sono stati corretti nella Beta 2 e la mia ipotesi è che alla fine il debugger si collegherà automaticamente all'avvio dell'estensione.

Aggiornamento: nelle note di rilascio di iOS 8 Beta 4 :

Estensioni

Risolto nella beta 4

  • Le estensioni a volte non si avviano durante il debug da Xcode.
  • Quando Extension with UI viene terminato, viene riavviato e non viene eliminato.
  • A volte la tua estensione di condivisione o azione può bloccarsi.
  • La ridistribuzione di un'estensione potrebbe disabilitarla nel Centro notifiche.

hai provato lo stesso approccio per le estensioni di archiviazione?
SRP-Achiever

Non ha funzionato per me in Xcode 6 beta 2, ma la risposta di Vince Yuan sì . Sfortunatamente, in Xcode 6 beta 3 il debug dell'estensione non funziona affatto per me. Non ho trovato soluzione a questo problema, probabilmente dovremo aspettare la prossima versione.
Darrarski

@Darrarski La mia risposta è rimasta dalla Beta 1. Cordiali saluti, Beta 3 è fuori quindi dovresti esserci già adesso.
Babbo Natale

@SantaClaus abbastanza chiaro. Il mio commento è stato per informare che nessuna delle soluzioni fornite funziona in Xcode 6 beta 3 per me. Sembra che il debug delle estensioni sia ancora più rotto in questa versione. Speriamo che la prossima beta risolva il problema.
Darrarski

3
Nessuno di questi bug mi sembrava corretto nella beta 4 (ora beta 5).
matt

18

Anch'io ho questo problema. Xcode non collega mai il mio debugger all'estensione né visualizza i messaggi NSLog. Se colleghi manualmente il tuo debugger Xcode al processo di estensione, almeno i punti di interruzione funzionano a meraviglia:

Debug->Attach to process->Your extension name (mine was "com.example.MyExtensionApp.MyExtension")

5
Ho avuto fortuna con questo.
Babbo Natale

2
upvote, ma non sempre funziona, spero che Apple possa allegare automaticamente il debugger alle estensioni nelle versioni future.
Jing

14
  1. Crea uno schema per la tua estensione
  2. Esegui schema
  3. In una finestra di dialogo scegli l'app contenitore
  4. Godere

Si lavora per me :)


Questo è esattamente ciò di cui avevo bisogno
pob21

1
NSLogfunzionerà solo se stai eseguendo l'app contenitore. Esso non funziona se si sta eseguendo l'app-estensione al posto del contenitore.
JaredH

Questo ha funzionato anche per me. Grazie, Maciek Czarnik! Le soluzioni di cui sopra non hanno funzionato per me. Sto usando Xcode 8.1.
plam4u

5

Xcode 8 è in grado di eseguire il debug delle estensioni:

  1. Scegli lo schema di estensione nella combo accanto al pulsante di arresto ed eseguilo.
  2. Seleziona l'applicazione principale nella finestra di dialogo che appare.

Risultato: i punti di interruzione e il registro funzionano normalmente.


2
Non funziona nel mio caso di un'estensione Today. ottenere l'errore CLANG: ld: libreria non trovata per -lRPush clang: errore: comando linker non riuscito con codice di uscita 1 (utilizzare -v per vedere l'invocazione)
BadmintonCat

Questo è un errore non correlato. Stai tentando di collegarti a una libreria mancante. Aggiungi Liferay-Push al tuo target.
Jano

4

Quello che finalmente mi ha permesso di vedere il log nell'area di debug, sulla base del suggerimento di Michael e della documentazione di Apple , è:

Compila ed esegui l'estensione per app nel simulatore e, quando ti viene richiesta un'app host, scegli l'app specifica da cui chiamerai l'estensione . Nel mio caso stavo lanciando la mia estensione Action da Safari tirando su un foglio di condivisione su un PDF.

Quello che prima non funzionava era seguire i suggerimenti di altre persone di utilizzare Today come host, ma poi lasciare l'app e andare su Safari per chiamare la mia estensione. Non ho più nemmeno bisogno di eseguire la mia app contenitore prima di eseguire l'estensione.

Dalla documentazione di Apple:

Nella fase di esecuzione dello schema di estensione, specifichi un'app host come eseguibile. Dopo aver effettuato l'accesso all'estensione tramite l'interfaccia utente dell'host specificato, il debugger Xcode si collega all'estensione.



1

Un trucco che funziona per me (anche se è piuttosto brutto) è posizionare un manichino UILabelda qualche parte nell'angolo inferiore della mia estensione. Di solito lo chiamo logLabel. È quindi possibile aggiornare il testo di questa etichetta con qualsiasi istruzione di registro che si desidera registrare. Tale approccio non è molto buono se è necessario registrare istruzioni da istanze di classi diverse. E, ovviamente, ingombra la tua interfaccia utente.

Tuttavia, se hai un widget abbastanza semplice e non ti dispiace per il leggero ingombro dell'interfaccia utente, questo fa il trucco. Ho provato tutte le altre soluzioni descritte in questa discussione e, purtroppo, nessuna di esse ha funzionato per me.


1

L'unico modo in cui il debug funziona per me è selezionare Debug-> Allega al processo tramite PID o Nome Quindi immettere il PID e non il nome dell'estensione. Puoi trovare il PID eseguendo l'estensione su un dispositivo, vai su Finestra-> Dispositivi. Trova il tuo dispositivo e visualizza la console. Quando vedi il nome della tua estensione, è seguito da un numero di 5 cifre. Questo è il PID

Ho anche inserito un sacco di NSLog nell'estensione per trovare anche il PID. Questo è su xCode 7


1

Incontra lo stesso problema sull'estensione per NSLoge sui punti di interruzione. L'ho combattuto per molti giorni.

Device logpuò essere trovato come immagine seguente. È a XCode -> Window -> Devices and Simulators.

Dopo aver inserito il Open Console, c'è un campo di ricerca in alto a destra della finestra di dialogo. Posso applicare la regola del filtro lì. Ad esempio, il nome di un processo contiene Notificationuna parola chiave o il nome del processo deve essere uguale al nome della destinazione dell'estensione, es: uguale al MyNotificationServiceExtensionnome del processo.

Registro del dispositivo


0

Chiaramente qualcosa è rotto in Xcode6-B5.

Se provo a eseguire un'estensione Photo sul simulatore, non riesco a vedere alcun Photos.app come opzione per il processo di collegamento dell'estensione.

opzioni di debug all'interno del simulatore

Lo stesso, in esecuzione su un dispositivo reale, mi dà il comportamento corretto.

opzioni di debug con un dispositivo reale

Nel primo caso qualsiasi punto di interruzione non è rispettato. In quest'ultimo caso, i punti di interruzione funzionano come un fascino.


0

Dovresti sapere che l'app contenitore e l'estensione sono totalmente due processi di differenza in iOS mentre LLVM esegue il debug solo un thread alla volta, quindi quando esegui il debug, la console non registra mai l'estensione e non si ferma mai al punto di interruzione.

Puoi risolvere la maggior parte dei problemi con il metodo di @Vince Yuan.

Tuttavia, il mio problema è che il debugger Xcode difficilmente si aggancia all'estensione della mia tastiera sia su iOS Simulator che sui dispositivi, come 1 volta in 7-8 esecuzioni, è totalmente una questione di probabilità. Il metodo di @Vince Yuan funziona anche solo per qualche volta.

La mia piccola esperienza è che quando esegui il tuo schema di debug, se la sessione di debug nel pannello di sinistra mostra che 'Nessuna sessione di debug', non è necessario aprire la tua estensione e testarla, il debugger non si è agganciato, basta eseguire di nuovo per fortuna.

ma quando vedi com.xxx.xxx.xxx è in attesa di allegare, l'estensione può sicuramente essere sottoposta a debug.

Questo è un piccolo trucco per chi non può eseguire il debug dell'estensione iOS, in particolare l'estensione della tastiera.


0

A partire da Xcode 6 Beta 5, sono stato in grado di utilizzare un dispositivo reale con iOS8 per eseguire il debug della mia estensione. Prova a eseguirlo su un dispositivo e seleziona Safari per l'avvio


0

Per superare tutti gli stati causati da un IDE in continua evoluzione, sto usando iOS Console di lemonjar.com: visualizza una finestra della console per qualsiasi dispositivo iOS connesso che visualizza i messaggi di syslog indipendentemente dall'ID del processo. Puoi visualizzare contemporaneamente i messaggi del registro di debug dell'app e dell'estensione qui.


0

Potrei eseguire il debug della mia estensione nel modo descritto di seguito:

  1. Xcode : Debug-> Attach to process by PID or Name. Il nome del tuo schema di estensione.
  2. Quindi seleziona il tuo main app targeted esegui.

Spero che funzioni anche per voi ragazzi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.