Protokollieren von Daten auf dem Gerät und Abrufen des Protokolls

81

Bei einem Debug-Build in Xcode werden unabhängig davon, ob ich den Simulator oder ein tatsächliches Gerät verwende, die Anweisungen NSLog, printf, fprintf assert und NSAssert auf der Konsole ausgegeben

Wenn ich jetzt einen Release-Build auf dem Gerät ausführe (z. B. sende ich einen Testflug-Build und vergrößere ihn auf meinem iPhone; dies wird ein Release-Build sein), welche davon (falls vorhanden) werden aufgezeichnet?

Und wie rufe ich das Protokoll ab?

Gibt NSLog beim Release-Build tatsächlich etwas aus? Was ist der bestimmende Faktor? Ob es an stdout oder stderr schreibt? wird nur stderr in das Geräteprotokoll geschrieben? Bedeutet das, dass ich fprintf verwenden muss? Wird ALLES in das Geräteprotokoll geschrieben? gibt es überhaupt so etwas? Wenn ja, wie kann man es abholen?

Könnte jemand die Situation klären?

P i
quelle
1
Um die Ausgaben einfach als Datei zu speichern, verwenden Sie diese: stackoverflow.com/questions/28114110/…
Kiran P Nair

Antworten:

93
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *fileName =[NSString stringWithFormat:@"%@.log",[NSDate date]];
NSString *logFilePath = [documentsDirectory stringByAppendingPathComponent:fileName];
freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding],"a+",stderr);

Fügen Sie einfach diesen Codeblock in der application:didFinishLaunchingWithOptionsMethode in die App-Delegatendatei ein und es wird eine Protokolldatei im App-Dokumentverzeichnis auf dem iPhone erstellt, die alle Konsolenprotokollereignisse protokolliert. Sie müssen diese Datei aus iTunes importieren, um alle Konsolenereignisse anzuzeigen.

Hinweis: Stellen Sie in der .plist-Datei sicher, dass diese Application supports iTunes file sharingvorhanden und auf eingestellt ist, YESdamit Sie über iTunes darauf zugreifen können.

So erhalten Sie Protokolldateien: Starten Sie iTunes. Nachdem Ihr Gerät eine Verbindung hergestellt hat, wählen Sie Apps - wählen Sie Ihre App aus. Im Augument-Dokument erhalten Sie Ihre Datei. Sie können es dann auf Ihrer Festplatte speichern

Shyla
quelle
1
Wie funktioniert das? Nur indem Sie eine .logDatei im Dokumentenverzeichnis haben, schreibt iOS Ihre Konsolenausgabe dort?
Ali
1
Wie lösche ich Protokolldateien programmgesteuert nach Datumsreihenfolge, um ein Auslaufen des Festplattenspeichers zu verhindern?
Hkaraoglu
4
Ich bin mir nicht sicher, ob NSDocumentDirectoryes für Protokolldateien geeignet ist. Es ist normalerweise für vom Benutzer selbst generierte Inhalte gedacht. Protokolldateien sind jedoch Inhalte, die von der App unterstützt werden. Daher gehören sie möglicherweise zum NSLibraryDirectoryUnterverzeichnis / Logs.
JustAMartin
Wie kann ich die Protokolldetails vom Windows-PC exportieren?
Vineesh TP
1
@Ali funktioniert, indem der Dateideskriptor stderr (Standardfehlerausgabe) (dh Dateideskriptor 2) einer zum Schreiben geöffneten Datei zugeordnet wird. Jedes Mal, wenn Sie auf stderr drucken, wird stattdessen in die Datei gedruckt. Auf diese Weise erfassen Sie die stderr-Ausgabe der Anwendung. Das Protokollsystem weiß nichts darüber.
Munition
140

In Xcode 6.1.1 können Sie die NSLog-Ausgabe wie folgt anzeigen. Ich bin mir jedoch nicht sicher, ob Sie damit Protokolle von zu weit zurück in der Zeit sehen können. Ich habe nur gesehen, dass es wieder ein paar Stunden dauert.

In jedem Fall sind hier die Schritte:

  1. Gehen Sie in Xcode zu Fenster -> Geräte.
  2. Wählen Sie Ihr Gerät im linken Bereich aus.
  3. Klicken Sie auf den kleinen Pfeil, wie im folgenden Screenshot gezeigt.

Geben Sie hier die Bildbeschreibung ein

Myxtic
quelle
3
Dies sollte die richtige Antwort sein ... Ich habe eine halbe Stunde damit verbracht, nach der Protokollschaltfläche zu suchen. Vielen Dank für die Zeitersparnis ...
PrimaryChicken
1
nur NSLog. Erwarten Sie dort kein Cout oder Printf.
Kiran
10
Mit dieser Technik können Sie die Protokolle nicht von produzierten / übermittelten Apps abrufen. Es ist nur beim Debuggen nützlich.
Satyam
7
Sie haben meinen Tag gemacht, ein perfektes Beispiel dafür, wie man eine Benutzeroberfläche NICHT entwirft. Vielleicht sollten sie developer.apple.com/library/mac/documentation/UserExperience/…
Hofi
1
Du hast gerade meinen Speck gerettet. Haben einen Fehler verfolgt, der nur in der Release-Version auftritt, haben Protokolle das Problem aufgedeckt. Ich hatte mir denselben Dialog angesehen und nie daran gedacht, auf den kleinen Pfeil zu klicken, der anscheinend ein universelles Symbol für "Live-Geräteprotokolle anzeigen" ist. Vielen Dank!
Chacmool
23

In Swift 3.0 ändert sich der Code von Shyl in:

var paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
let documentsDirectory = paths[0]
let fileName = "\(Date()).log"
let logFilePath = (documentsDirectory as NSString).appendingPathComponent(fileName)
freopen(logFilePath.cString(using: String.Encoding.ascii)!, "a+", stderr)

Alle anderen Prozesse sind die gleichen, die von Shyl erklärt wurden

Fügen Sie einfach diesen Codeblock in der Anwendung hinzu: didFinishLaunchingWithOptions-Methode in der App-Delegatendatei, und es wird eine Protokolldatei im App-Dokumentverzeichnis auf dem iPhone erstellt, die alle Konsolenprotokollereignisse protokolliert. Sie müssen diese Datei aus iTunes importieren, um alle Konsolenereignisse anzuzeigen.

Hinweis: Stellen Sie in der .plist-Datei sicher, dass diese Application supports iTunes file sharingvorhanden und auf eingestellt ist, YESdamit Sie über iTunes darauf zugreifen können.

So erhalten Sie Protokolldateien: Starten Sie iTunes. Nachdem Ihr Gerät eine Verbindung hergestellt hat, wählen Sie Apps - wählen Sie Ihre App aus. Im Augument-Dokument erhalten Sie Ihre Datei. Sie können es dann auf Ihrer Festplatte speichern

Kiran P Nair
quelle
Korrigieren Sie mich, wenn ich falsch liege: Dies ändert das Verzeichnis der Protokolle, was bedeutet, dass es ursprünglich geschrieben wurde /var/db/diagnostics/. Siehe hier .
Honey
@Honey, dieses Protokoll wird im App-Dokumentverzeichnis gespeichert.
Kiran P Nair
Dieser Code erstellt immer eine neue Datei, wenn die App gestartet wird
DURGESH
Haben Sie eine Idee, wie dies funktioniert, wenn das Protokoll in einer Überwachungserweiterung ausgeführt wird?
user2623825
1
@KiranPNair - kann ich dies auch für print () -Anweisungen oder nur für NSLog tun?
Fra
12

NSLog wurde in die Produktionsversion des Geräts geschrieben. Sie können dies überprüfen, indem Sie Ihr iPhone an Ihr System anschließen und Organizer verwenden. Wählen Sie Ihr iPhone im Organizer aus und klicken Sie auf Geräteprotokolle. Sie würden alle NSLog-Ausgaben im Protokoll sehen.

Bora
quelle
4
Update: In Xcode 6 ist es nicht mehr möglich, die NSLog-Ausgaben über die Geräteprotokolle zu lesen. Fenster> Organizer listet die Geräte nicht mehr auf. Stattdessen listet Fenster> Geräte die Geräte auf, zeigt jedoch nur die Absturzprotokolle an.
Robert
1
Robert, auf dem Bildschirm Fenster> Geräte von Xcode 6 befindet sich eine unsichtbare Linie am unteren Rand des Bildschirms. Wenn Sie es aufrufen, wird das Konsolenprotokoll des ausgewählten Geräts angezeigt. Es ist unsichtbar wegen eines UI-Fehlers in Xcode, denke ich.
Oradyvan
7

Ich fand diesen Link von APPLE sehr informativ und vollständig. Es bietet Ihnen so ziemlich alle Optionen, um Protokolle des Geräts anzuzeigen oder darauf zuzugreifen, unabhängig davon, ob sie mit Ihrem Entwicklungscomputer verbunden sind oder nicht.

https://developer.apple.com/library/ios/qa/qa1747/_index.html

GrandSteph
quelle
1
Dieses Dokument ist erstaunlich veraltet. Es wird nur xCode 6 erwähnt. Die Methode ist für xCode 9 und 10
1800
2

Ja, NSLog wird auf dem Gerät ausgegeben. Sie können die Ausgaben sehen, wenn Ihr Gerät an Ihren Mac angeschlossen ist und das Xcode Organizer-Tool verwendet.

Denis
quelle
Kann ein Benutzer diese Protokolle über iTunes überprüfen?
P i
3
Diese Antwort stackoverflow.com/questions/2334664/… besagt, dass das iPhone-Konfigurationsdienstprogramm das Konsolenprotokoll vom Gerät exportieren kann
Denis
2

Ich weiß, dass dies ein alter Thread ist, aber Sie können auch auf die Geräteprotokolle zugreifen:

Einstellungen -> Datenschutz -> Analytics -> Daten

Ich hoffe das hilft

Grüße

Ramón Esteban
quelle