Symbolisieren von iPhone App Crash Reports


432

Ich möchte versuchen, die Absturzberichte meiner iPhone-App zu symbolisieren.

Ich habe die Absturzberichte von iTunes Connect abgerufen. Ich habe die Anwendungsbinärdatei, die ich an den App Store gesendet habe, und ich habe die dSYM-Datei, die als Teil des Builds generiert wurde.

Ich habe alle diese Dateien zusammen in einem einzigen Verzeichnis, das durch Spotlight indiziert wird.

Was jetzt?

Ich habe versucht, Folgendes aufzurufen:

symbolicatecrash crashreport.crash myApp.app.dSYM

und es wird nur derselbe Text ausgegeben, der zu Beginn im Absturzbericht enthalten ist, nicht symbolisiert.

Mache ich etwas falsch?


3
Sie können meine Antwort auch im iPhone SDK sehen: Wo befindet sich symbolicatecrash.sh? . Ich liste auf, wo der symbolicatecrashBefehl zu finden ist , wie er zu verwenden ist und wie die für die Symbolisierung erforderliche dSYM-Datei zu finden ist.
Sam

6
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources/symbolicatecrash
logancautrell

5
Ich habe ein Skript erstellt, das helfen kann: github.com/amleszk/scripts/blob/master/…
amleszk

1
Wenn sich jemand fragt, wo Sie * .app, * .dSYM & Absturzprotokolle finden können, dann schauen Sie sich meine Antwort unten an.
Sam B

Antworten:


688

Schritte zum Analysieren des Absturzberichts von Apple:

  1. Kopieren Sie die .app-App-Datei, die in den Appstore verschoben wurde, die zum Zeitpunkt der Veröffentlichung erstellte .dSYM-Datei und den von APPLE empfangenen Absturzbericht in einen ORDNER .

  2. Öffnen Sie die Terminalanwendung und wechseln Sie in den oben erstellten Ordner (mit dem cdBefehl).

  3. Ausführen atos -arch armv7 -o APPNAME.app/APPNAME MEMORY_LOCATION_OF_CRASH. Der Speicherort sollte derjenige sein, an dem die App gemäß dem Bericht abgestürzt ist.

Ex: atos -arch armv7 -o 'APPNAME.app'/'APPNAME' 0x0003b508

Dies würde Ihnen die genaue Zeile und den Methodennamen anzeigen, die zum Absturz geführt haben.

Ex: [classname functionName:]; -510

IPA symbolisieren

Wenn wir IPA zum Symbolisieren verwenden - benennen Sie einfach die Erweiterung .ipa mit .zip um, extrahieren Sie sie, dann können wir einen Payload-Ordner erhalten, der eine App enthält. In diesem Fall benötigen wir keine .dSYM-Datei.

Hinweis

Dies kann nur funktionieren, wenn in der App-Binärdatei keine Symbole entfernt wurden. Standardmäßig haben Release-Builds die Symbole entfernt. Wir können es in den Projekterstellungseinstellungen "Debug-Symbole während des Kopierens entfernen" auf NEIN ändern.

Weitere Details finden Sie in diesem Beitrag


12
Nur ein Tipp zur Antwort von @NaveenShan, ein Beispiel atos -o myApp.app/Contents/MacOS/myApp 0x0000000100001f2c aus der -[HUDWindow sizedHUDBackground] (in myApp) + 1197
Praxis

3
Welche Adresse verwenden Sie jedoch? Die Protokolle haben nach jeder Funktion zwei Adressenspalten, und die zweite hat ein + und einen Offset. Gefällt mir 0x332da010 0x332d9000 + 4112.
Oscar

7
@OscarGoldman Die zweite Adresse, z. B.: - In 0x332da010 0x332d9000 + 4112. Verwenden Sie 0x332d9000.
Naveen Shan

4
Wenn Sie keine Adresse verwenden, können Sie mehrere Standorte analysieren, indem Sie sie einzeln senden.
Paul Ardeleanu

42
Bei dieser Antwort gibt es mehrere Probleme: 1. Dies kann nur funktionieren, wenn in der App-Binärdatei keine Symbole entfernt wurden. Bei Release-Builds werden diese standardmäßig entfernt. 2. Selbst wenn die Symbole verfügbar sind, wird die Zeilennummer niemals angezeigt. Nur das Symbolisieren mit dem dSYM bietet dies. 3. Sie können nicht einfach die im Stack-Trace angegebene Speicheradresse verwenden. Die Adresse muss gegen die Startspeicheradresse normalisiert werden, in die die App geladen wird. Weitere Details finden Sie diese Antwort: stackoverflow.com/questions/13574933/...
Kerni

173

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:

  1. Die Absturzprotokolldatei selbst (dh example.crash), die entweder aus dem Organizer von XCode exportiert oder von iTunes Connect empfangen wurde.
  2. Das .appPaket (dh example.app), das selbst die zum Absturzprotokoll gehörende App-Binärdatei enthält. Wenn Sie ein .ipaPaket (dh example.ipa) haben, können Sie das .appPaket extrahieren , indem Sie das .ipaPaket (dh unzip example.ipa) entpacken . Danach befindet sich das .appPaket im extrahierten Payload/Ordner.
  3. Das .dSYMPaket 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 symbolicatecrashSkript 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 symbolicatecrashin 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 .dSYMPakete mit einer bestimmten UUID. Wenn Spotlight Ihr .dSYMPaket nicht findet , symbolicatecrashwird es auch nicht. Wenn Sie all diese Dinge tun, z. B. in einem Unterordner Ihres ~/DesktopScheinwerfers, sollten Sie in der Lage sein, alles zu finden.

Wenn symbolicatecrashIhr .dSYMPaket 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 .appPaket 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 symbolicatecrashIhr .appPaket 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.


Ich kann alle Dateien finden, aber ich bekomme dies und keine symbolisierte AusgabeNo crash report version in testlog.crash at /usr/bin/symbolicatecrash line 921.
nur

1
Das war wirklich hilfreich! In meinem Fall hat die .app-Datei einen anderen Namen als der ausführbare Name (ich weiß nicht warum, aber sie wird auf diese Weise von Xcode erstellt). Nach dem Umbenennen der AP-Datei im XCode-Archiv funktionierte die Symbolisierung.
Hrissan

28
Dies ist eine großartige Erklärung und sollte die beste Antwort sein, IMO, danke. Beachten Sie, dass Sie möglicherweise Ihre DEVELOPER_DIRUmgebungsvariable festlegen müssen, wenn sich das Skript wie folgt darüber beschwert : export DEVELOPER_DIR=`xcode-select --print-path` . Ich habe diese Zeile zu meiner hinzugefügt ~/.bash_profile. Siehe stackoverflow.com/q/11682789/350761
Eliot

1
Beachten Sie, dass für Xcode 5, hat dies umgezogen: <PATH_TO_Xcode.app> /Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKitBase.framework/Versions/Current/Resources/symbolicatecrash
Eliot

1
symbolicate Absturz hat auch mehrere hilfreiche Optionen. <SYMBOL_PATH> Additional search paths in which to search for symbol rich binaries -o | --output <OUTPUT_FILE> The symbolicated log will be written to OUTPUT_FILE. Defaults to "-" (i.e. stdout) if not specified -d | --dsym <DSYM_BUNDLE> Adds additional dSYM that will be consulted if and when a binary's UUID matches (may be specified more than once)
Benuuu

115

Mit der neuesten Version von Xcode (3.2.2) können Sie Absturzberichte per Drag & Drop in den Abschnitt Geräteprotokolle des Xcode Organizers ziehen und sie werden automatisch für Sie symbolisiert. Ich denke, das funktioniert am besten, wenn Sie diese Version der App mit Build & Archive (ebenfalls Teil von Xcode 3.2.2) erstellt haben.


3
Dies funktioniert bei einer Neuinstallation einfach nicht mit Xcode4. Scheint ein neuer Fehler zu sein :(
Adam

1
Ich bin nicht sicher, ob dies das gleiche Problem löst, das Sie haben, aber jemand hat das symbolisierte Skript github.com/nskboy/symbolicatecrash-fix YMMV gepatcht :)
Alan Rogers

2
Dieser Tipp funktioniert mit Xcode 4.2. Platzieren Sie Crashlogs in den Geräteprotokollen des Organizers. Beim Neustart des Organizers werden symbolisierte Absturzprotokolle angezeigt !!! Vielen Dank.
hardit2811

2
Dies funktionierte bei mir nicht, als ich eine Archivdatei von einem anderen Computer importierte, um ein Absturzprotokoll zu erhalten. :( Aus diesem Grund musste ich die Datei manuell symbolisieren. Schritte zur Symbolisierung finden Sie hier: iPhone SDK: Wo befindet sich symbolicatecrash.sh?
Sam

3
Arbeiten Sie bei mir nicht mit heruntergeladenen Absturzberichten von iTunes Connect.
Dmitry

72

Ich habe dies erfolgreich mit den folgenden Schritten durchgeführt.

Schritt 1: Erstellen Sie einen Ordner auf dem Desktop, geben Sie "CrashReport" den Namen und legen Sie drei Dateien ("MYApp.app", "MyApp.app.dSYM", "MYApp_2013-07-18.crash") darin ab.

Schritt 2: Öffnen Sie den Finder und gehen Sie zu Anwendungen, wo Sie die Xcode-Anwendung finden. Klicken Sie mit der rechten Maustaste darauf und klicken Sie auf "Paketinhalt anzeigen". Folgen Sie anschließend diesem einfachen Pfad. "Inhalt-> Entwickler-> Plattformen-> iPhoneOS.platform-> Entwickler-> Bibliothek-> PrivateFrameworks-> DTDeviceKit.framework -> Versionen-> A-> Ressourcen"

ODER

"Inhalt-> Entwickler-> Plattformen-> iPhoneOS.platform-> Entwickler-> Bibliothek-> PrivateFrameworks-> DTDeviceKitBase.framework -> Versionen-> A-> Ressourcen"

ODER

Für Xcode 6 und höher lautet der Pfad Applications / Xcode.app / Contents / SharedFrameworks / DTDeviceKitBase.framework / Versions / A / Resources

Wenn Sie die Datei "symbolicatecrash" finden, kopieren Sie diese und fügen Sie sie in den Ordner "CrashReport" ein.

Schritt 3: Starten Sie das Terminal und führen Sie diese 3 Befehle aus

  1. cd / Users / mac38 / Desktop / CrashReport und drücken Sie die Eingabetaste

  2. exportiere DEVELOPER_DIR = "/ Applications / Xcode.app / Contents / Developer" und drücke die Eingabetaste

  3. ./symbolicatecrash -A -v MYApp_2013-07-18.crash MyApp.app.dSYM und drücken Sie die Eingabetaste. Jetzt fertig. (HINWEIS: Versionen ab 6.4 oder höher haben die Option -A nicht - lassen Sie sie einfach weg).

3
Für DTServiceKit schauen Sie in Applications / Xcode.app / Contents / SharedFrameworks
Ryan Heitner

3
Danke Danke ... ab dem 9. April 2015 hat dies für mich einwandfrei funktioniert. Eine Sache ist, dass ich Unknown option: Afür symbolicatecrash bekam , aber der Prozess lief trotzdem
Matt Fiocca

1
Ich wünschte, ich könnte dieser Antwort tausend Punkte geben. Es gibt so viele Anleitungen zu diesem Thema ... aber dies ist diejenige, die auf der untersten Ebene funktioniert, so dass es IMMER funktioniert. Es ist ein Schmerz im Heck, alle Schritte zu treffen, aber wenn alles andere fehlschlägt, erledigt dies den Job.
Chad Robinson

35

Schritte zum automatischen Symbolisieren eines Absturzberichts mit XCode:

AKTUALISIERT FÜR XCODE 9

  1. Verbinden Sie jedes iOS-Gerät mit Ihrem Mac (ja, ein physisches, ja, ich weiß, das ist dumm)

  2. Wählen Sie "Geräte" aus dem Menü "Fenster" Geben Sie hier die Bildbeschreibung ein

  3. Klicken Sie links auf Ihr Gerät und rechts auf VIEW DEVICE LOGS Geben Sie hier die Bildbeschreibung ein

  4. Warten. Es kann eine Minute dauern, bis es angezeigt wird. Vielleicht tun Command-Adann Deletewird dies beschleunigen.

  5. Kritischer undokumentierter Schritt: Benennen Sie den Absturzbericht, den Sie von iTunesConnect erhalten haben, von.txtErweiterung zu.crashErweiterung um

  6. Ziehen Sie den Absturzbericht in diesen Bereich links Geben Sie hier die Bildbeschreibung ein

Und dann symbolisiert Xcode den Absturzbericht und zeigt die Ergebnisse an.

Quelle: https://developer.apple.com/library/ios/technotes/tn2151/_index.html


1
Dies ist das offizielle Apple-Verfahren. Sollte die Antwort sein.
Giammy

2
Danke, ich füge jetzt Bilder hinzu. Enthält auch den Schritt SUPER UNDOCUMENTED. Ich dachte darüber nach, einen roten Text zu machen und ihn dort einzuspleißen, damit er wirklich auffällt. Dann hörte ich auf darüber nachzudenken.
William Entriken

1
Vielen Dank! Keine der anderen Antworten besagt tatsächlich, dass das von Ihnen verwendete Gerät nicht das Gerät (oder sogar der Gerätetyp) sein muss, auf dem der Absturz aufgetreten ist.
Galactikuh

Kurzer Hinweis, denn für mich würde es nicht neu symbolisieren. Ich musste auch Organizer öffnen, auf das Build in Archives klicken und auf Debug-Symbole herunterladen klicken. Dann könnte ich in der Geräteprotokollansicht erneut symbolisieren. Dies war für ein Absturzprotokoll, das nach einer abgelehnten Überprüfung von Apple heruntergeladen wurde.
Gregthegeek

28

Ich verwende Airbrake in meinen Apps, die die Remote-Fehlerprotokollierung recht gut erledigen.

So symbolisiere ich sie mit atos, wenn der Backtrace es braucht:

  1. Gehen Sie in Xcode (4.2) zum Organizer und klicken Sie mit der rechten Maustaste auf das Archiv, aus dem die IPA-Datei generiert wurde.

  2. CD in Terminal zum Beispiel in das xcarchiveMyCoolApp 10-27-11 1.30 PM.xcarchive

  3. Geben Sie Folgendes ein atos -arch armv7 -o 'MyCoolApp.app'/'MyCoolApp' (vergessen Sie nicht die einfachen Anführungszeichen)

  4. Ich füge mein Symbol nicht in diesen Anruf ein. Was Sie erhalten, ist ein Blockcursor in einer leeren Zeile.

  5. Dann kopiere ich meinen Symbolcode an diesem Blockcursor und drücke die Eingabetaste. Sie werden so etwas sehen wie:

    -[MyCoolVC dealloc] (in MyCoolApp) (MyCoolVC.m:34)

  6. Sie kehren zu einem Blockcursor zurück und können andere Symbole einfügen.

Es ist eine schöne Zeitersparnis, einen Gegenstand durchgehen zu können, ohne das erste Bit erneut einzugeben.

Genießen!


28

Ich habe auch dsym, das App-Bundle und das Absturzprotokoll im selben Verzeichnis zusammengefasst, bevor ich den symbolischen Absturz ausführe

Dann verwende ich diese in meinem .profile definierte Funktion, um das Ausführen von symbolicatecrash zu vereinfachen:

function desym
{
    /Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources/symbolicatecrash -A -v $1 | more
}

Die dort hinzugefügten Argumente können Ihnen helfen.

Sie können überprüfen, ob Spotlight Ihre Dysm-Dateien "sieht", indem Sie den folgenden Befehl ausführen:

mdfind 'com_apple_xcode_dsym_uuids = *'

Suchen Sie nach dem dsym, das Sie in Ihrem Verzeichnis haben.

HINWEIS: Ab dem neuesten Xcode gibt es kein Entwicklerverzeichnis mehr. Sie finden dieses Dienstprogramm hier:

/Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versionen / A / Resources / symbolicatecrash


1
Ich habe mir die mdfind-Ausgabe angesehen, und die dSYM-Datei ist definitiv im Rampenlicht zu sehen. Das symbolicatecrash-Skript gibt jedoch immer noch nichts anderes als den Absturzbericht selbst aus. Auch mit den von Ihnen angegebenen Argumenten.
Jasarien

Das Skript sollte am Anfang einen Warnungstext erzeugen, wenn es das dsym nicht finden kann - können Sie danach suchen und sehen, was es sagt?
Kendall Helmstetter Gelner

Versuchen Sie auch, "." Nach dem Befehl wäre es also "symbolicatecrash -A -v MyApp.crashlog". . Das zwingt es, im aktuellen Verzeichnis zu suchen, falls dies noch nicht geschehen ist.
Kendall Helmstetter Gelner

Bedeutung "Kann nicht ausgeführt werden" / usr / bin / xcode-select ": Keine solche Datei oder kein solches Verzeichnis unter /Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Plug-ins/iPhoneRemoteDevice.xcodeplugin/Contents/Resources/ symbolicatecrash line 49. "
Papa

Ups, anscheinend gibt es eine andere SO-Frage für diesen stackoverflow.com/questions/1859852/…
bpapa

21

Nur eine einfache und aktualisierte Antwort für xcode 6.1.1.

SCHRITTE

1.Xcode> Fenster> Geräte.

2.Wählen Sie ein Gerät aus einer Liste von Geräten im Abschnitt GERÄTE aus.

3.Wählen Sie Geräteprotokolle anzeigen.

4. Im Abschnitt Alle Protokolle können Sie die Datei report.crash direkt ziehen

5.Xcode symbolisiert automatisch den Absturzbericht für Sie.

6.Sie können den symbolisierten Absturzbericht finden, indem Sie Datum / Uhrzeit mit dem in Ihrem Absturzbericht angegebenen Datum / Uhrzeit abgleichen.


3
Absturzberichte, die ich aus dem Apple Resolution Center heruntergeladen habe, haben normalerweise die Erweiterung .txt. Denken Sie daran, sie in .crash umzubenennen, da sich Geräteprotokolle sonst möglicherweise weigern, sie hinzuzufügen. Arbeite gut für meinen aktuellen XCode 6.3.1
Tony

3
Dies ist das offizielle Apple-Verfahren. Sollte die Antwort sein. Apple Link: Technischer Hinweis TN2151: Grundlegendes zu und Analysieren von Absturzberichten für iOS-Anwendungen
Giammy

Wie machen wir das, wenn der Absturz von Apple / iTunesConnect kam? Mit anderen Worten, wir kennen das Gerät, auf dem der Absturz aufgetreten ist, nicht oder haben es nicht?
Galactikuh

14

Obwohl ich seit einigen Jahren Apps entwickle, war dies das erste Mal, dass ich eine Binärdatei debuggte, und ich fühlte mich wie ein kompletter NOOB, der herausfand, wo sich alle Dateien befanden, dh wo sich * .app * .dSYM und Absturzprotokolle befinden. Ich musste mehrere Beiträge lesen, um es herauszufinden. Das Bild sagt mehr als tausend Worte und ich hoffe, dieser Beitrag hilft in Zukunft allen anderen.

1- Gehen Sie zuerst zu itunesconnect und laden Sie Ihre Absturzprotokolle herunter. HINWEIS: In den meisten Fällen wird möglicherweise Folgendes angezeigt: "Es wurden zu wenige Berichte eingereicht, damit ein Bericht angezeigt werden kann." Grundsätzlich haben nicht genügend Benutzer Absturzprotokollberichte an Apple gesendet. In diesem Fall können Sie zu diesem Zeitpunkt noch nicht viel tun.

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

2- Wenn Sie Ihren Code nicht geändert haben, seit Sie Ihre Binärdatei an Apple gesendet haben, starten Sie Xcode für dieses Projekt und führen Sie Produkt -> Archivieren erneut aus. Andernfalls finden Sie einfach Ihre zuletzt eingereichte Binärdatei und klicken Sie mit der rechten Maustaste darauf.

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein


8

Öffnen Sie in Xcode 4.2.1 Organizer , gehen Sie zu Bibliothek / Geräteprotokolle und ziehen Sie Ihre .crash-Datei in die Liste der Absturzprotokolle. Es wird nach einigen Sekunden für Sie symbolisiert.

Beachten Sie, dass Sie dieselbe Xcode-Instanz verwenden müssen, auf der der ursprüngliche Build archiviert wurde (dh das Archiv für Ihren Build muss in Organizer vorhanden sein ).


8

Mit Xcode 4 ist die Aufgabe noch einfacher:

  • Organisator öffnen ,
  • Klicken Sie auf Bibliothek | Geräteprotokoll in der linken Spalte
  • Klicken Sie unten auf dem Bildschirm auf die Schaltfläche " Importieren " ...

und voilà. Die Protokolldatei wird automatisch für Sie importiert und symbolisiert. Vorausgesetzt, Sie haben den Build zuerst mit Xcode -> Produkt -> Archiv archiviert .


1
Seltsamerweise hat der Import keine Auswirkung. Das Setzen von .app, .dSYM und .crash und das anschließende Ausführen von symbolicatecrash in der .crash-Datei (ohne zusätzliche Argumente) funktionierte jedoch (XCode 4)
Russisch

7

Der magische Xcode Organizer ist nicht so magisch, wenn es darum geht, meine App zu symbolisieren. Ich habe überhaupt keine Symbole für die Absturzberichte erhalten, die ich von Apple aufgrund einer fehlgeschlagenen App-Übermittlung erhalten habe.

Ich habe versucht, über die Befehlszeile den Absturzbericht in denselben Ordner zu legen wie die .app-Datei (die ich an den Store gesendet habe) und die .dSYM-Datei:

$ symbolicatecrash "My App_date_blahblah-iPhone.crash" "My App.app"

Dies lieferte nur Symbole für meine App und nicht den Kerncode der Grundlage, aber es war besser als der Nummern-Dump, den Organizer mir gibt, und es reichte mir, um den Absturz meiner App zu finden und zu beheben. Wenn jemand weiß, wie man dies erweitert, um Foundation-Symbole zu erhalten, wäre er dankbar.


Für Core Foundation dSYM hatte ein (möglicherweise chinesischer) Typ das dSYM auf sein freigegebenes Google-Laufwerk hochgeladen. Laden Sie es einfach herunter und werfen Sie es in den Ordner "Geräte unterstützt", und es wird behoben. github.com/Zuikyo/iOS-System-Symbols
Harunaga

6

In meinem Fall habe ich Absturzberichte direkt von Mail in den Organizer gezogen. Aus irgendeinem Grund wurde dadurch verhindert, dass die Absturzberichte symbolisiert wurden (ich würde gerne wissen, warum).

Wenn Sie die Absturzberichte zuerst auf den Desktop kopieren und dann von dort auf den Organizer ziehen, werden sie ordnungsgemäß symbolisiert.

Sehr spezieller Fall, ich weiß. Aber dachte, ich würde nur für den Fall teilen.


Ich kann mir vorstellen, dass dies etwas mit Scheinwerferlicht zu tun hat. Gibt es eine Möglichkeit, dass der Ort, an dem der Veranstalter Ihre Protokolle aufbewahrt, nicht im Rampenlicht indiziert wurde?
Jasarien

4

Hier ist ein weiteres Problem, das ich mit symbolicatecrash habe - es funktioniert nicht mit Apps, deren Bundle Leerzeichen enthält (z. B. 'Test App.app'). Hinweis Ich glaube nicht, dass Sie beim Senden Leerzeichen in ihrem Namen haben können, daher sollten Sie diese trotzdem entfernen. Wenn Sie jedoch bereits Abstürze haben, die analysiert werden müssen, patchen Sie symbolicatecrash (4.3 GM) als solches:

240c240
<         my $cmd = "mdfind \"kMDItemContentType == com.apple.application-bundle && kMDItemFSName == $exec_name.app\"";
---
>         my $cmd = "mdfind \"kMDItemContentType == com.apple.application-bundle && kMDItemFSName == '$exec_name.app'\"";
251c251
<             my $cmd = "find \"$archive_path/Products\" -name $exec_name.app";
---
>             my $cmd = "find \"$archive_path/Products\" -name \"$exec_name.app\"";

Für das, was es wert ist, habe ich ein rdar darüber gefüllt und es ist in [redigiert]
Alastair Stuart

4

Für diejenigen, die Airbrake verwenden, gibt es oben eine solide Antwort, aber es würde für mich nicht funktionieren, ohne zu optimieren:

Funktioniert für einige Speicheradressen, aber nicht für andere, nicht sicher warum ...

  • Erstellen Sie ein neues Verzeichnis auf dem Desktop oder wo auch immer
  • Finden Sie das betreffende Archiv im Xcode Organizer
  • Doppeltippen, um im Finder anzuzeigen
  • Tippen Sie zweimal auf, um den Bundle-Inhalt anzuzeigen
  • Kopieren Sie die .dSYM-Datei und die .app-Datei in ein neues Verzeichnis
  • cd in neues dir
  • Führen Sie diesen Befehl aus: atos -arch armv7 -o 'Vimeo.app' / 'Vimeo'
  • Das Terminal gibt einen interaktiven Zug ein
  • Fügen Sie die Speicheradresse ein und drücken Sie die Eingabetaste. Der Methodenname und die Zeilennummer werden ausgegeben
  • Alternativ können Sie diesen Befehl eingeben: atos -arch armv7 -o 'Vimeo.app' / 'Vimeo' Um Informationen nur für eine Adresse abzurufen

4

Die Kombination, die für mich funktioniert hat, war:

  1. Kopieren Sie die dSYM-Datei in das Verzeichnis, in dem sich der Absturzbericht befand
  2. Entpacken Sie die IPA-Datei mit der App ('MyApp.ipa entpacken')
  3. Kopieren Sie die Anwendungsbinärdatei aus der resultierenden explodierten Nutzlast in denselben Ordner wie den Absturzbericht und die Symboldatei (etwa "MyApp.app/MyApp").
  4. Importieren oder symbolisieren Sie den Absturzbericht aus dem Xcode-Organizer heraus

Mit atos konnte ich die korrekten Symbolinformationen mit den Adressen und Offsets im Absturzbericht nicht auflösen. Wenn ich das getan habe, sehe ich etwas Bedeutenderes und es scheint eine legitime Stapelverfolgung zu sein.


3

Ich musste das Symbolicatecrash-Skript viel hacken, damit es richtig lief.

Soweit ich das beurteilen kann, muss sich die .app derzeit für symbolicatecrash im selben Verzeichnis wie die .dsym-Datei befinden. Es wird das .dsym verwenden, um die .app zu finden, aber es wird nicht das dsym verwenden, um die Symbole zu finden.

Sie sollten eine Kopie Ihres symbolischen Absturzes erstellen, bevor Sie diese Patches verwenden, damit er im dsym angezeigt wird:

Um Zeile 212 in der Funktion getSymbolPathFor_dsymUuid

212     my @executablePath = grep { -e && ! -d } glob("$dsymdir" . "/Contents/Resources/DWARF/" . $executable);

Um die Zeile 265 in der Funktion matchUUID

265             return 1;

1

Dies ist einfach, nachdem ich viel gesucht habe, habe ich klare Schritte gefunden, um die gesamte Absturzprotokolldatei zu symbolisieren.

  • Kopieren Sie .app-, crash_report- und DSYM-Dateien in einen Ordner.
  • Verbinden Sie das Gerät mit xcode
  • Gehen Sie dann zu Fenster -> Geräte auswählen -> Geräteprotokolle anzeigen
  • Wählen Sie dann dieses Gerät aus und löschen Sie alle Protokolle.
  • Ziehen Sie Ihren Absturz per Drag & Drop in den Geräteprotokollbereich. Es wird automatisch den Absturz symbolisieren. Klicken Sie einfach mit der rechten Maustaste auf Bericht und exportieren Sie ihn.

Viel
Spaß beim Codieren, Riyaz


Beste kurze und süße Ans, folgen Sie jedem Schritt in dieser Ans geschrieben. developer.apple.com/library/content/technotes/tn2151/… Folgen Sie diesem Link, um den Unterschied zwischen nicht symbolisiert und vollständig symbolisiert zu ermitteln.
Ninad Kambli

1

Ich bevorzuge ein Skript , das alle meine Absturzprotokolle symbolisiert.

Voraussetzungen

Erstellen Sie einen Ordner und legen Sie dort 4 Dinge ab:

  1. symbolicatecrash Perl-Skript - Es gibt viele SO-Antworten, die den Standort angeben

  2. Das Archiv des Show in FinderBuilds , das den Abstürzen entspricht (von Xcode Organizer. Einfach wie und kopieren) [Ich bin mir nicht sicher, ob dies notwendig ist]

  3. Alle xccrashpointPakete - (aus Xcode Organizer Show in Finderkönnen Sie alle Pakete in das Verzeichnis oder den einzelnen xccrashpoint kopieren, den Sie symbolisieren möchten.)

  4. Fügen Sie das kurze Skript zum Verzeichnis hinzu:

    #!/bin/sh
    
    echo "cleaning old crashes from directory"
    rm -P *.crash
    rm -P *.xccrashpoint
    rm -r allCrashes
    echo "removed!"
    echo ""
    echo "--- START ---"
    echo ""
    
    mkdir allCrashes
    mkdir symboledCrashes
    find `ls -d *.xccrashpoint` -name "*.crash" -print -exec cp {} allCrashes/ \;
    
    cd allCrashes
    for crash in *.crash; do
        ../symbolicatecrash $crash > ../symboledCrashes/V$crash
    done
    cd ..
    
    echo ""
    echo "--- DONE ---"
    echo ""

Das Drehbuch

Wenn Sie das Skript ausführen, erhalten Sie 2 Verzeichnisse.

  1. allCrashes- Alle Abstürze von allen xccrashpointwerden da sein.

  2. symboledCrashes - das gleiche stürzt aber jetzt mit allen Symbolen ab.

  3. Sie müssen das Verzeichnis NICHT von alten Abstürzen bereinigen, bevor Sie das Skript ausführen. es wird automatisch gereinigt. Viel Glück!


1

Ich fand heraus, dass die meisten vorgeschlagenen Alternativen im neuesten XCode (getestet mit Xcode 10) nicht funktionierten. Zum Beispiel hatte ich kein Glück, .crash-Protokolle in Xcode -> Organizer -> Geräteprotokoll-Ansicht per Drag & Drop zu verschieben.

Ich empfehle die Verwendung des Symbolicator-Tools https://github.com/agentsim/Symbolicator

  • Git-Klon Symbolicator-Repository und kompilieren und mit Xcode ausführen
  • Kopieren Sie die .crash-Datei (ASCII-Datei, mit Stack-Trace beim Betteln der Datei) und das .xarchive der abstürzenden Version in denselben temporären Ordner
  • Ziehen Sie die .crash-Datei per Drag & Drop auf das Symbolicator-Symbol im Dock
  • In 5-30 Sekunden wird eine symbolisierte Absturzdatei im selben Ordner wie .crash und .xarchive erstellt

0

Um Abstürze zu symbolisieren, muss Spotlight in der Lage sein, die .dSYM-Datei zu finden, die gleichzeitig mit der von Ihnen an Apple gesendeten Binärdatei generiert wurde. Da es die Symbolinformationen enthält, haben Sie Pech, wenn sie nicht verfügbar sind.


Wenn Sie die Frage lesen, habe ich angegeben, dass ich die ursprüngliche dSYM-Datei gespeichert habe, die zum Zeitpunkt der Übermittlung der Binärdatei generiert wurde.
Jasarien

0

Ich wurde ein bisschen mürrisch darüber, dass hier nichts "nur zu funktionieren" scheint, also habe ich einige Nachforschungen angestellt und das Ergebnis ist:

Einrichten: QuincyKit-Backend, das Berichte empfängt. Es wurde keine Symbolisierung eingerichtet, da ich nicht einmal herausfinden konnte, was sie mir vorschlugen, damit es funktioniert.

Die Lösung: Laden Sie Absturzberichte online vom Server herunter. Sie heißen "Absturz" und gehen standardmäßig in den Ordner ~ / Downloads /. In diesem Sinne wird dieses Skript "das Richtige tun" und die Absturzberichte werden in Xcode (Organizer, Geräteprotokolle) gespeichert und die Symbolisierung wird durchgeführt.

Das Skript:

#!/bin/bash
# Copy crash reports so that they appear in device logs in Organizer in Xcode

if [ ! -e ~/Downloads/crash ]; then 
   echo "Download a crash report and save it as $HOME/Downloads/crash before running this script."
   exit 1
fi

cd ~/Library/Logs/CrashReporter/MobileDevice/
mkdir -p actx # add crash report to xcode abbreviated
cd actx

datestr=`date "+%Y-%m-%d-%H%M%S"`

mv ~/Downloads/crash "actx-app_"$datestr"_actx.crash"

Wenn Sie QuincyKit / PLCR verwenden, können die Dinge automatisiert werden, wo Sie sie in Xcode Organizer ziehen und ablegen können, indem Sie zwei Dinge tun.

Zunächst müssen Sie das Remote-Skript admin / actionapi.php ~ Zeile 202 bearbeiten. Es scheint nicht den richtigen Zeitstempel zu haben, sodass die Datei den Namen 'Absturz' enthält, den Xcode nicht erkennt (er möchte etwas Punktabsturz):

header('Content-Disposition: attachment; filename="crash'.$timestamp.'.crash"');

Zweitens ändern Sie @"[TODO]"auf der iOS-Seite in QuincyKit BWCrashReportTextFormatter.m ~ Zeile 176 @"TODO"in, um die schlechten Zeichen zu umgehen .


0

atos ist veraltet. Wenn Sie OSX 10.9 oder höher ausführen, müssen Sie möglicherweise ausführen

xcrun atos

Warnung: / usr / bin / atos wird verschoben und aus einer zukünftigen OS X-Version entfernt. Es ist jetzt in den Xcode-Entwicklertools verfügbar und kann aufgerufen werden über:xcrun atos


Anscheinend lässt Apple zu, dass sich das DWARF-Format mit jeder Version der Tools ändert (was besonders mit dem Aufkommen von Swift sinnvoll ist), sodass es in die Tool-Distribution verschoben wird.
David Gish

0

Ich verwende gerne Textwrangler, um Fehler in einer binären Ablehnung eines ursprünglichen App-Uploads zu lokalisieren. (Die Absturzdaten finden Sie in Ihrem itunesConnect-Konto.) Mit der obigen Sachin-Methode kopiere ich die Datei original.crash in TextWrangler und kopiere dann die von mir erstellte symbolicatecrash-Datei in eine andere TextWrangler-Datei. Beim Vergleich der beiden Dateien werden Unterschiede festgestellt. Die symbolicateash-Datei weist Unterschiede auf, die auf die Datei und die Zeilennummer der Probleme hinweisen.


-2

Wir verwenden Google Crashlytics, um Absturzprotokolle zu überwachen. Das Gefühl ist sehr aktuell und bequem zu verwenden.

Dokumentlinks: https://docs.fabric.io/apple/crashlytics/missing-dsyms.html#missing-dsyms

Alles über fehlende dSYMs Fabric enthält ein Tool zum automatischen Hochladen des dSYM Ihres Projekts. Das Tool wird über das Skript / run ausgeführt, das während des Onboarding-Prozesses zu Ihrer Run Script Build-Phase hinzugefügt wird. Es kann jedoch bestimmte Situationen geben, in denen dSYM-Uploads aufgrund eindeutiger Projektkonfigurationen fehlschlagen oder wenn Sie Bitcode in Ihrer App verwenden. Wenn ein Upload fehlschlägt, kann Crashlytics Abstürze nicht symbolisieren und anzeigen, und in Ihrem Fabric-Dashboard wird eine Warnung "Fehlendes dSYM" angezeigt.

Fehlende dSYMs können mithilfe der unten beschriebenen Schritte manuell hochgeladen werden.

Hinweis: Als Alternative zum automatisierten dSYM-Upload-Tool bietet Fabric ein Befehlszeilentool (Upload-Symbole), das manuell konfiguriert werden kann, um als Teil des Erstellungsprozesses Ihres Projekts ausgeführt zu werden. Anweisungen zur Konfiguration finden Sie im Abschnitt Upload-Symbole unten.

...

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.