Nachdem ich all diese Antworten hier gelesen habe, um ein Absturzprotokoll zu symbolisieren (und schließlich erfolgreich war), denke ich, dass hier einige Punkte fehlen, die wirklich wichtig sind, um festzustellen, warum der Aufruf von symbolicatecrash keine symbolisierte Ausgabe erzeugt.
Bei der Symbolisierung eines Absturzprotokolls müssen 3 Elemente zusammenpassen:
- Die Absturzprotokolldatei selbst (d. h.
example.crash
), die entweder aus dem Organizer von XCode exportiert oder von iTunes Connect empfangen wurden.
- Le site
.app
Paket (d.h. example.app
), die ihrerseits die zum Absturzprotokoll gehörende App-Binärdatei enthält. Wenn Sie eine .ipa
Paket (d.h. example.ipa
), dann können Sie die .app
Paket durch Entpacken des .ipa
Paket (d.h. unzip example.ipa
). Danach wird die .app
Paket befindet sich in dem extrahierten Payload/
Ordner.
- Le site
.dSYM
Paket, das die Debugsymbole enthält (d. h. example.app.dSYM
)
Bevor Sie mit der Symbolisierung beginnen, sollten Sie überprüfen, ob alle diese Artefakte übereinstimmen, d.h. ob das Absturzprotokoll zu der vorhandenen Binärdatei gehört und ob die Debugsymbole die sind, die während der Erstellung dieser Binärdatei erzeugt wurden.
Jede Binärdatei wird durch eine UUID referenziert, die in der Absturzprotokolldatei zu sehen ist:
...
Binary Images:
0xe1000 - 0x1f0fff +example armv7 <aa5e633efda8346cab92b01320043dc3> /var/mobile/Applications/9FB5D11F-42C0-42CA-A336-4B99FF97708F/example.app/example
0x2febf000 - 0x2fedffff dyld armv7s <4047d926f58e36b98da92ab7a93a8aaf> /usr/lib/dyld
...
In diesem Auszug gehört das Absturzprotokoll zu einem App-Binärabbild namens example.app/example mit der UUID aa5e633efda8346cab92b01320043dc3
.
Sie können die UUID des Binärpakets, das Sie haben, mit dwarfdump überprüfen:
dwarfdump --uuid example.app/example
UUID: AA5E633E-FDA8-346C-AB92-B01320043DC3 (armv7) example.app/example
Danach sollten Sie überprüfen, ob die Debugsymbole, die Sie haben, auch zu dieser Binärdatei gehören:
dwarfdump --uuid example.app.dSYM
UUID: AA5E633E-FDA8-346C-AB92-B01320043DC3 (armv7) example.app.dSYM/Contents/Resources/DWARF/example
In diesem Beispiel passen alle Assets zusammen und Sie sollten in der Lage sein, Ihren Stacktrace zu symbolisieren.
Weiter geht es zum symbolicatecrash
Drehbuch:
In Xcode 8.3 sollte es möglich sein, das Skript über
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash -v example.crash 2> symbolicate.log
Wenn sie nicht vorhanden ist, können Sie eine find . -name symbolicatecrash
in Ihrem Xcode.app-Verzeichnis, um es zu finden.
Wie Sie sehen können, sind keine weiteren Parameter angegeben. Das Skript muss also die Binär- und Debugsymbole Ihrer Anwendung finden, indem es eine Spotlight-Suche durchführt. Es durchsucht die Debugsymbole mit einem bestimmten Index namens com_apple_xcode_dsym_uuids
. Sie können diese Suche selbst durchführen:
mdfind 'com_apple_xcode_dsym_uuids = *'
bzw.
mdfind "com_apple_xcode_dsym_uuids == AA5E633E-FDA8-346C-AB92-B01320043DC3"
Der erste Spotlight-Aufruf liefert Ihnen alle indizierten dSYM-Pakete und der zweite liefert Ihnen die .dSYM
Pakete mit einer bestimmten UUID. Wenn Spotlight Ihr Paket nicht findet .dSYM
Paket dann symbolicatecrash
wird auch nicht. Wenn Sie all diese Dinge z.B. in einem Unterordner Ihres ~/Desktop
Spotlight sollte alles finden können.
Wenn symbolicatecrash
findet Ihr .dSYM
Paket sollte eine Zeile wie die folgende enthalten sein symbolicate.log
:
@dsym_paths = ( <SOME_PATH>/example.app.dSYM/Contents/Resources/DWARF/example )
Zum Auffinden Ihrer .app
Paket wird eine Spotlight-Suche wie die folgende aufgerufen durch symbolicatecrash
:
mdfind "kMDItemContentType == com.apple.application-bundle && (kMDItemAlternateNames == 'example.app' || kMDItemDisplayName == 'example' || kMDItemDisplayName == 'example.app')"
Wenn symbolicatecrash
findet Ihr .app
Paket sollte der folgende Auszug in symbolicate.log
:
Number of symbols in <SOME_PATH>/example.app/example: 2209 + 19675 = 21884
Found executable <SOME_PATH>/example.app/example
-- MATCH
Wenn alle diese Ressourcen gefunden werden durch symbolicatecrash
sollte es die symbolisierte Version Ihres Absturzprotokolls ausdrucken.
Andernfalls können Sie Ihre dSYM- und .app-Dateien direkt einreichen.
symbolicatecrash -v --dsym <SOME_PATH>/<App_URI>.app.dSYM/<APP_NAME>.app.dsym <CRASHFILE> <SOME_OTHER_PATH>/<APP_NAME>.app/<APP_NAME> > symbolicate.log
Anmerkung: Der symbolisierte Backtrace wird auf dem Terminal ausgegeben, nicht symbolicate.log
.