Nachdem ich all diese Antworten hier gelesen habe, um ein Absturzprotokoll zu symbolisieren (und schließlich erfolgreich zu sein), denke ich, dass hier einige Punkte fehlen, die wirklich wichtig sind, um festzustellen, warum der Aufruf von symbolicatecrash keine symbolisierte Ausgabe erzeugt.
Es gibt 3 Assets, die zusammenpassen müssen, wenn ein Absturzprotokoll symbolisiert wird:
- Die Absturzprotokolldatei selbst (dh
example.crash
), die entweder aus dem Organizer von XCode exportiert oder von iTunes Connect empfangen wurde.
- Das
.app
Paket (dh example.app
), das selbst die zum Absturzprotokoll gehörende App-Binärdatei enthält. Wenn Sie ein .ipa
Paket (dh example.ipa
) haben, können Sie das .app
Paket extrahieren , indem Sie das .ipa
Paket (dh unzip example.ipa
) entpacken . Danach befindet sich das .app
Paket im extrahierten Payload/
Ordner.
- Das
.dSYM
Paket mit den Debug-Symbolen (dh example.app.dSYM
)
Bevor Sie mit der Symbolisierung beginnen, sollten Sie überprüfen, ob alle diese Artefakte übereinstimmen. Dies bedeutet, dass das Absturzprotokoll zu Ihrer Binärdatei gehört und dass die Debug-Symbole diejenigen sind, die während der Erstellung dieser Binärdatei erstellt wurden.
Jede Binärdatei wird von einer UUID referenziert, die in der Absturzprotokolldatei angezeigt wird:
...
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ärbild mit dem Namen example.app/example mit 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
Anschließend sollten Sie überprüfen, ob die Debug-Symbole, 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, Ihre Stacktrace zu symbolisieren.
Fahren Sie mit dem symbolicatecrash
Skript fort:
In Xcode 8.3 sollten Sie das Skript über aufrufen können
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash -v example.crash 2> symbolicate.log
Wenn es nicht vorhanden ist, können Sie ein find . -name symbolicatecrash
in Ihrem Xcode.app-Verzeichnis ausführen, um es zu finden.
Wie Sie sehen, sind keine Parameter mehr angegeben. Das Skript muss also die Binär- und Debug-Symbole Ihrer Anwendung finden, indem eine Spotlight-Suche ausgeführt wird. Es durchsucht die Debug-Symbole 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 gibt Ihnen alle indizierten dSYM-Pakete und der zweite die .dSYM
Pakete mit einer bestimmten UUID. Wenn Spotlight Ihr .dSYM
Paket nicht findet , symbolicatecrash
wird es auch nicht. Wenn Sie all diese Dinge tun, z. B. in einem Unterordner Ihres ~/Desktop
Scheinwerfers, sollten Sie in der Lage sein, alles zu finden.
Wenn symbolicatecrash
Ihr .dSYM
Paket gefunden wird, sollte eine Zeile wie die folgende in angezeigt werden symbolicate.log
:
@dsym_paths = ( <SOME_PATH>/example.app.dSYM/Contents/Resources/DWARF/example )
Um Ihr .app
Paket zu finden, wird eine Spotlight-Suche wie die folgende aufgerufen symbolicatecrash
:
mdfind "kMDItemContentType == com.apple.application-bundle && (kMDItemAlternateNames == 'example.app' || kMDItemDisplayName == 'example' || kMDItemDisplayName == 'example.app')"
Wenn symbolicatecrash
Ihr .app
Paket gefunden wird, sollte der folgende Auszug enthalten sein 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 symbolicatecrash
, sollte die symbolisierte Version Ihres Absturzprotokolls ausgedruckt werden.
Wenn nicht, können Sie Ihre dSYM- und .app-Dateien direkt übergeben.
symbolicatecrash -v --dsym <SOME_PATH>/<App_URI>.app.dSYM/<APP_NAME>.app.dsym <CRASHFILE> <SOME_OTHER_PATH>/<APP_NAME>.app/<APP_NAME> > symbolicate.log
Hinweis: Die symbolisierte Rückverfolgung wird nicht an das Terminal ausgegeben symbolicate.log
.
symbolicatecrash
Befehl zu finden ist , wie er zu verwenden ist und wie die für die Symbolisierung erforderliche dSYM-Datei zu finden ist.