Wie debugge ich iOS 8-Erweiterungen mit NSLog?

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

in viewDidLoadeiner iOS 8- Erweiterung . die NSLoggibt nichts in Xcode aus.NSLogfunktioniert aber wie gewohnt in der Container App.

Wie kann ich Debug-Nachrichten von einer Erweiterung ausgeben?

Oh ho
quelle
Ich habe auch dieses Problem. Vielleicht ist NSLog nur kaputt. Ich benutze momentan Haltepunkte, um Werte zu debuggen. Aber sie sind auch wirklich fehlerhaft.
Gallileo
Ich habe ein ähnliches Problem, bei dem der Debugger nie einrastet und in Xcode immer "Warten auf Anhängen" sagt. Leider sehe ich nichts Nützliches beim googeln und habe hier auf Stack eine Frage gepostet, die noch keine Antworten enthält.
Alex Bollbach

Antworten:

95
  1. Das Debuggen funktioniert für App-Erweiterungen.
  2. Es funktioniert auch auf dem Simulator.
  3. Wenn Ihre App ext im Simulator abstürzt, ist es möglicherweise nicht einfach, Ihre App ext neu zu starten. Ein Neustart Ihres Simulators ist eine schnelle Lösung.
  4. Schritte zum Debuggen einer App-Erweiterung:

    1. Führen Sie die Container-App aus. In diesem Schritt lädt Xcode die Container-App und die App-Erweiterung auf das Gerät oder den Simulator hoch.

    2. Stoppen Sie die Container-App. Dieser Schritt ist wichtig, wenn Sie im Simulator debuggen. Wenn Sie dies nicht tun, teilt Xcode Ihnen mit, dass der Simulator verwendet wird.

    3. Drücken Sie in Xcode auf Menü Debuggen -> An Prozess anhängen -> Nach Prozesskennung (PID) oder Name ... und geben Sie die Kennung der App ext ein, z. B. com.abc.ContainerApp.MyExtension, um das Debuggen zu starten. Vergessen Sie nicht, Haltepunkte zu setzen. (Update am 25. August 2014: Sie können MyExtension (den Namen Ihrer Erweiterung) direkt eingeben.)

    4. Öffnen Sie im Gerät oder Simulator Ihre App-Erweiterung.


Aktualisierungen am 23. August 2014:

Ich habe festgestellt, dass die obigen Debugging-Schritte unter Xcode 6 Beta 6 mit iOS 8 SDK Beta 5 im Simulator nicht gut funktionieren.

Lösung:

  1. Führen Sie Ihre Erweiterung im Simulator aus.
  2. Xcode-Menü Debug -> An Prozess anhängen -> Wählen Sie im Menü "System" im Menü "MyExtension (Name Ihrer Nebenstelle)".

Die Haltepunkte funktionieren. Ich weiß jedoch nicht, warum Protokolle nicht im Ausgabefenster angezeigt werden.

Vince Yuan
quelle
8
Der bisher einfachste Weg zum Debuggen (und siehe NSLog), den ich gefunden habe, besteht darin, die folgenden Schritte auszuführen: /// 1 /// Wählen Sie ein Container-App-Schema aus und führen Sie es aus. /// 2 /// Sobald es betriebsbereit ist, wechseln Sie zurück zu XCode und wählen Sie (ohne eine Stop-Taste zu drücken) ein Erweiterungsschema aus und drücken Sie dann die Run-Taste. /// 3 /// Wenn Sie aufgefordert werden, die auszuführende App auszuwählen, wählen Sie Heute. /// 4 /// Jetzt sollten Haltepunkte und NSLog ohne Probleme funktionieren.
Unterbrechen Sie den
1
Dies funktioniert auch heute noch nicht, insbesondere nach einem Absturz. Das ist sehr nervig, ich verstehe nicht, warum es so schwer zu beheben ist.
Cristi Băluță
3
Ich habe versucht, die aktualisierten Anweisungen oben zu verwenden, und es hat bei mir funktioniert. In Schritt 2 habe ich jedoch anstelle meines Nebenstellennamens "Nach Prozesskennung (PID) oder Name ..." verwendet und die PID des Prozesses eingegeben. Dies erlaubte mir auf magische Weise, meine Haltepunkte zu verwenden.
Tony.tc.leung
Debug> An Prozess an PID oder Namen anhängen
Geben Sie
Diese Antwort ist für die Frage nicht relevant. Das OP fragt, warum NSLog-Nachrichten nicht in einer Erweiterung in die Konsole geschrieben werden (ein berechtigtes Problem, da ich mit derselben Frage auf diese Seite gekommen bin). Er erwähnt nichts über Probleme, die mit dem Debugger verbunden sind.
Joey Carson
49

Ich habe auch dieses Problem. Es funktioniert bei mir, wenn Sie in Ihrem Simulator unter dem Menü Debug -> Systemprotokoll öffnen ...

Von hier aus können Sie alle Protokolle des iPhone Simulators anzeigen (einschließlich der Protokolle Ihrer Erweiterung).

Geben Sie hier die Bildbeschreibung ein

BalestraPatrick
quelle
Es wird "~ / Library / Logs / CoreSimulator / <DEVICE_IDENTIFIER> /system.log" geöffnet, sodass Sie dort auch alle Protokolle Ihrer anderen Simulatorgeräte leicht finden können. Ersetzen Sie einfach <DEVICE_IDENTIFIER> durch die Simulator-Geräte-ID
Hofi
32

NSLogfunktioniert perfekt .

Sie sehen nur nicht, was im Debug-Bereich von Xcode protokolliert wird, da der Xcode-Debugger nicht an Ihre Erweiterung angehängt ist. Erweiterungen sind nahezu unabhängig von ihrer enthaltenen App. Sie haben beispielsweise separate Bundle-IDs und sind auch separate Prozesse auf dem Betriebssystem.

Ich hatte unterschiedliche Erfolge darin, Xcode an Erweiterungen anzuhängen. Angeblich scheint es, dass es automatisch angehängt wird, und es erscheint im Debug-Navigator als "Warten auf Anhängen", wird aber nie angehängt.

Manchmal kann ich mein Erweiterungsziel in Xcode ausführen:

Geben Sie hier die Bildbeschreibung ein

Und dann haben Sie die Möglichkeit zu wählen, in welcher Anwendung meine Erweiterung ausgeführt werden soll. In diesem Fall würde ich die Empfehlung "Heute" wählen, bei der es sich um ein Benachrichtigungscenter handelt.

Geben Sie hier die Bildbeschreibung ein

Und dann hat es manchmal den Debugger an meine Erweiterung angehängt. Beachten Sie, dass diese Methode anscheinend nur auf physischen Geräten funktioniert.

Wenn es nicht angehängt wird, können Sie die manuelle Anhangsmethode in der Antwort von @ VinceYaun verwenden.

Ich hatte auch unterschiedliche Erfolge mit anderen Bindungsmethoden. Die meisten waren erfolglos und es scheint, dass es sich nur um Fehler handelt, die zu einem späteren Zeitpunkt behoben werden.

Um Ihre Protokollnachrichten anzuzeigen, gehen Sie zu Window-> Devicesin der oberen Leiste und wählen Sie Ihr Gerät aus. Sie können das Geräteprotokoll unten in diesem Fenster aufrufen. Wenn Sie auf einem Simulator testen, können Sie die Antwort von @ BalestraPatrick verwenden .

Einige der Fehler wurden in Beta 2 behoben, und ich vermute, dass der Debugger beim Starten der Erweiterung möglicherweise automatisch angehängt wird.

Update: In der iOS 8 Beta 4 Release Notes :

Erweiterungen

In Beta 4 behoben

  • Erweiterungen können beim Debuggen von Xcode manchmal nicht gestartet werden.
  • Wenn die Erweiterung mit Benutzeroberfläche beendet wird, wird sie neu gestartet und nicht verworfen.
  • Manchmal kann Ihre Freigabe- oder Aktionserweiterung hängen bleiben.
  • Durch das erneute Bereitstellen einer Erweiterung wird diese möglicherweise im Notification Center deaktiviert.
Weihnachtsmann
quelle
Haben Sie den gleichen Ansatz für Speichererweiterungen versucht?
SRP-Achiever
In Xcode 6 Beta 2 hat es bei mir nicht funktioniert, aber die Antwort von Vince Yuan hat funktioniert. Leider funktioniert das Debuggen von Xcode 6 Beta 3-Erweiterungen bei mir überhaupt nicht. Ich habe keine Lösung für dieses Problem gefunden, wahrscheinlich müssen wir auf die nächste Veröffentlichung warten.
Darrarski
@Darrarski Meine Antwort ist von Beta 1 übrig geblieben. Zu Ihrer Information, Beta 3 ist raus, also sollten Sie jetzt dabei sein.
Weihnachtsmann
@ SantaClaus ziemlich klar. Mein Kommentar war zu informieren, dass keine der angegebenen Lösungen in Xcode 6 Beta 3 für mich funktioniert. Es sieht so aus, als ob das Debuggen von Erweiterungen in dieser Version noch mehr kaputt ist. Hoffen wir, dass die nächste Beta das Problem behebt.
Darrarski
3
Keiner dieser Fehler schien mir in Beta 4 (jetzt Beta 5) behoben zu sein.
Matt
18

Ich habe auch dieses Problem. Xcode hängt meinen Debugger niemals an die Erweiterung an oder zeigt NSLog-Nachrichten an. Wenn Sie Ihren Xcode-Debugger manuell an Ihren Erweiterungsprozess anhängen, funktionieren zumindest Haltepunkte wie ein Zauber:

Debug->Attach to process->Your extension name (mine was "com.example.MyExtensionApp.MyExtension")
Masalis
quelle
5
Ich hatte gemischtes Glück damit.
Weihnachtsmann
2
upvote, aber nicht immer funktionierend, hoffe, Apple kann den Debugger in zukünftigen Versionen automatisch an Erweiterungen anhängen.
Jing
14
  1. Erstellen Sie ein Schema für Ihre Erweiterung
  2. Schema ausführen
  3. Wählen Sie in einem Dialog die Container-App
  4. Genießen

Es funktioniert bei mir :)

Maciek Czarnik
quelle
Dies ist genau das, was ich brauchte
pob21
1
NSLogfunktioniert nur, wenn Sie die Container-App ausführen. Es funktioniert nicht , wenn Sie die App-Erweiterung anstelle des Containers ausführen.
JaredH
Das hat auch bei mir funktioniert. Vielen Dank, Maciek Czarnik! Die oben genannten Lösungen haben bei mir nicht funktioniert. Ich benutze Xcode 8.1.
plam4u
5

Xcode 8 kann Erweiterungen debuggen:

  1. Wählen Sie das Erweiterungsschema in der Kombination neben der Stopp-Schaltfläche und führen Sie es aus.
  2. Wählen Sie die übergeordnete Anwendung im angezeigten Dialogfeld aus.

Ergebnis: Haltepunkte und Protokoll funktionieren wie gewohnt.

Jano
quelle
2
Funktioniert in meinem Fall einer Today-Erweiterung nicht. CLANG-Fehler erhalten: ld: Bibliothek für -lRPush nicht gefunden clang: Fehler: Linker-Befehl mit Exit-Code 1 fehlgeschlagen (verwenden Sie -v, um den Aufruf anzuzeigen)
BadmintonCat
Dies ist ein nicht verwandter Fehler. Sie versuchen, eine Verknüpfung zu einer fehlenden Bibliothek herzustellen. Fügen Sie Ihrem Ziel Liferay-Push hinzu.
Jano
4

Was mir schließlich erlaubt hat, das Protokoll im Debugging-Bereich zu sehen, basierend auf Michaels Vorschlag und Apples Dokumentation , ist:

Erstellen und Ausführen der App-Erweiterung im Simulator. Wenn Sie zur Eingabe einer Host-App aufgefordert werden, wählen Sie die spezifische App aus, von der aus Sie die Erweiterung aufrufen möchten . In meinem Fall habe ich meine Action-Erweiterung von Safari aus gestartet, indem ich ein Freigabeblatt in einer PDF-Datei aufgerufen habe.

Was vorher nicht funktionierte, war, den Vorschlägen anderer Leute zu folgen, Today als Host zu verwenden, dann aber diese App zu verlassen und zu Safari zu gehen, um meine Nebenstelle anzurufen. Ich muss meine enthaltene App nicht mehr zuerst ausführen, bevor ich die Erweiterung ausführen kann.

Aus Apples Dokumentation:

In der Ausführungsphase Ihres Erweiterungsschemas geben Sie eine Host-App als ausführbare Datei an. Beim Zugriff auf die Erweiterung über die Benutzeroberfläche des angegebenen Hosts wird der Xcode-Debugger an die Erweiterung angehängt.

Andrew
quelle
1

Ich habe die Protokolle tatsächlich ganz einfach in Xcode 6.3 laufen lassen. Erstellen und führen Sie zunächst die enthaltene App aus. Sobald die enthaltene App auf dem Gerät ausgeführt wird, erstellen Sie die App-Erweiterung und führen Sie sie aus, indem Sie das Schema in die App-Erweiterung ändern.

Apple verfügt über eine Dokumentation, die in direktem Zusammenhang mit dem Debuggen, Profilieren und Testen Ihrer App-Erweiterung steht.

Michael
quelle
1

Ein Trick, der für mich funktioniert (obwohl er ziemlich hässlich ist), besteht darin, UILabelirgendwo in der unteren Ecke meiner Erweiterung einen Dummy zu platzieren . Normalerweise nenne ich es logLabel. Es ist dann möglich, den Text dieses Etiketts mit einer beliebigen Protokollanweisung zu aktualisieren, die protokolliert werden soll. Ein solcher Ansatz ist nicht sehr gut, wenn Sie Anweisungen von Instanzen verschiedener Klassen protokollieren müssen. Und natürlich ist Ihre Benutzeroberfläche unübersichtlich.

Wenn Sie jedoch ein ziemlich einfaches Widget haben und sich nicht um leichte Unordnung in der Benutzeroberfläche kümmern, ist dies der Trick. Ich habe alle anderen in dieser Diskussion beschriebenen Lösungen ausprobiert und leider hat keine von ihnen für mich funktioniert.

Andriy Gordiychuk
quelle
1

Das Debuggen funktioniert bei mir nur, indem Sie Debug->> An Prozess nach PID oder Name anhängen auswählen. Geben Sie dann die PID ein, nicht den Namen der Erweiterung. Sie finden die PID, indem Sie die Erweiterung auf einem Gerät ausführen. Gehen Sie zu Fenster-> Geräte. Suchen Sie Ihr Gerät und zeigen Sie die Konsole an. Wenn Sie den Namen Ihrer Nebenstelle sehen, folgt eine 5-stellige Nummer. Das ist die PID

Ich habe auch eine Reihe von NSLogs in die Erweiterung eingefügt, um auch die PID zu finden. Dies ist auf xCode 7

Tony
quelle
1

Stoßen Sie auf dasselbe Problem bezüglich der Erweiterung für NSLogund Haltepunkte. Ich habe es mit vielen Tagen gekämpft.

Device logkann wie folgt gefunden werden. Es ist bei XCode -> Window -> Devices and Simulators.

Nach der Eingabe von Open Consolebefindet sich oben rechts im Dialogfeld ein Suchfeld. Ich kann dort Filterregeln anwenden. Beispielsweise enthält ein Prozessname ein NotificationSchlüsselwort, oder der Prozessname muss dem Namen des Erweiterungsziels entsprechen, z. B. dem MyNotificationServiceExtensionProzessnamen.

Geräteprotokoll

AechoLiu
quelle
0

In Xcode6-B5 ist eindeutig etwas kaputt.

Wenn ich versuche, eine Fotoerweiterung im Simulator auszuführen, kann ich keine Photos.app als Option für das Anhängen der Erweiterung sehen.

Debug-Optionen im Simulator

Das gleiche, das auf einem realen Gerät ausgeführt wird, gibt mir das richtige Verhalten.

Debug-Optionen mit einem realen Gerät

Im ersten Fall wird kein Haltepunkt berücksichtigt. Im letzteren Fall wirken Haltepunkte wie ein Zauber.

Valvolin
quelle
0

Sie sollten wissen, dass die Container-App und -Erweiterung in iOS zwei Unterschiede darstellen, während die LLVM jeweils nur einen Thread debuggt. Wenn Sie also debuggen, protokolliert die Konsole die Erweiterung niemals und stoppt niemals am Haltepunkt.

Sie können die meisten Probleme mit der Methode von @Vince Yuan lösen.

Mein Problem ist jedoch, dass der Xcode-Debugger meine Tastaturerweiterung sowohl auf dem iOS-Simulator als auch auf Geräten kaum einbindet, wie 1 Mal in 7-8 Läufen. Es ist eine Frage der Wahrscheinlichkeit. Die Methode von @Vince Yuan funktioniert auch nur manchmal.

Meine kleine Erfahrung ist, dass wenn Sie Ihr Debug-Schema ausführen und die Debug-Sitzung im linken Bereich "Keine Debug-Sitzung" anzeigt, es nicht erforderlich ist, Ihre Erweiterung zu öffnen und zu testen, der Debugger sich nicht angeschlossen hat, sondern nur ausgeführt wird wieder zum Glück.

Wenn Sie jedoch sehen, dass com.xxx.xxx.xxx auf das Anhängen wartet, kann die Erweiterung definitiv debuggt werden.

Dies ist ein kleiner Trick, für den die iOS-Erweiterung, insbesondere die Tastaturerweiterung, nicht debuggt werden kann.

Henry
quelle
0

Ab Xcode 6 Beta 5 konnte ich ein tatsächliches Gerät mit iOS8 zum Debuggen meiner Erweiterung verwenden. Versuchen Sie es auf einem Gerät auszuführen und wählen Sie Safari zum Starten aus

Rich86man
quelle
0

Um alle Zustände zu überwinden, die durch eine sich ständig ändernde IDE verursacht werden, verwende ich die iOS-Konsole vonitronejar.com. Sie zeigt ein Konsolenfenster für jedes verbundene iOS-Gerät an, das Syslog-Nachrichten unabhängig von der Prozess-ID rendert. Hier können Sie sowohl App- als auch Erweiterungs-Debug-Protokollnachrichten gleichzeitig anzeigen.

igraczech
quelle
0

Ich könnte meine Erweiterung mit der folgenden Beschreibung debuggen:

  1. Xcode : Debug->Attach to process by PID or Name . Der Name Ihres Erweiterungsschemas.
  2. Dann wählen Sie Ihre main app targetund laufen.

Ich hoffe es funktioniert auch für euch.

abdullahselek
quelle