Was ist das dSYM und wie wird es verwendet? (iOS SDK)

117

Manchmal erzeugt der Compiler .dSYM-Dateien. Ich denke, dies ist eine Debugging-bezogene Datei, aber ich weiß nicht, was es ist und wie man es verwendet.

Was ist ein .dSYM? Wie benutze ich es?

eonil
quelle

Antworten:

159

In dSYM-Dateien werden die Debug-Symbole für Ihre App gespeichert

Dienste wie Crashlytics verwenden es, um die Symbole in den Crash-Protokollen durch die entsprechenden Methodennamen zu ersetzen, damit es lesbar und sinnvoll ist.

Der Vorteil der Verwendung von dSYM besteht darin, dass Sie Ihre App nicht mit Symbolen ausliefern müssen, was das Reverse Engineering erschwert und auch die Binärgröße verringert

Um das Absturzprotokoll zu symbolisieren, müssen Sie das Absturzprotokoll in die Geräteprotokolle des Geräts im Organizer des Computers ziehen, der die App-Binärdatei kompiliert hat (ein Computer, auf dem das dSYM gespeichert ist).

Wenn Sie den dSYM haben, aber den Computer nicht haben, der die App-Binärdatei kompiliert hat, befolgen Sie die Anweisungen in diesem Link, um den dSYM auf dem Computer zu installieren

Weitere Informationen finden Sie im technischen Hinweis zu Apple TN2151

Tomer Even
quelle
1
Wird Crashlytics die Abstürze nicht protokollieren können, wenn dSYMs nicht in eine App Store-Binärdatei aufgenommen werden?
Genaks
Deaktivieren Sie also das Kontrollkästchen "App-Symbole einschließen ..."?
Genaks
2
Wenn Sie Crashlogs in Apple Connect sehen möchten, können Sie die App-Symbole einfügen, wenn Sie die App in den App Store hochladen. Wenn Sie Crashlytics verwenden, müssen Sie dies nicht tun, aber es tut nicht weh, die App-Symbole (die DSym-Datei) einzuschließen und an Apple zu senden, indem Sie im Upload zur App die Option "App-Symbole einschließen ..." aktivieren Store-Assistent
Tomer Even
1
Ich dachte daran, dem Benutzer ein paar
MB zu
Von Crashlytics-Entwicklern - twittercommunity.com/t/…
genaks
1

dSYMsteht für Xcode Debugging Symbols und ist eine Art Mapping-Datei, die beispielsweise einen Stack-Trace in ein lesbares Format dekodieren kann. Es ist eine Bundlemit der nächsten Struktur:

Ein Absturzprotokoll sieht beispielsweise folgendermaßen aus:

//before
0   libswiftCore.dylib              0x000000018f3c9380 0x18f394000 + 217984
1   libswiftCore.dylib              0x000000018f3c9380 0x18f394000 + 217984
2   libswiftCore.dylib              0x000000018f3c8844 0x18f394000 + 215108
3   libswiftCore.dylib              0x000000018f3a74e0 0x18f394000 + 79072
4   libswiftCore.dylib              0x000000018f3ab0d8 0x18f394000 + 94424
5   F49088168M                      0x00000001045ac750 0x104590000 + 116560
6   F49088168M                      0x00000001045b7904 0x104590000 + 162052
7   F49088168M                      0x00000001045b897c 0x104590000 + 166268
8   F49088168M                      0x000000010459d914 0x104590000 + 55572
9   F49088168M                      0x00000001045a0e70 0x104590000 + 69232
10  F49088168M                      0x00000001045a0f4c 0x104590000 + 69452

dSYM in Aktion

//after Symbolicating(dSYM is used)
0   libswiftCore.dylib              0x000000018f3c9380 closure #1 in closure #1 in closure #1 in _assertionFailure+ 217984 (_:_:file:line:flags:) + 452
1   libswiftCore.dylib              0x000000018f3c9380 closure #1 in closure #1 in closure #1 in _assertionFailure+ 217984 (_:_:file:line:flags:) + 452
2   libswiftCore.dylib              0x000000018f3c8844 _assertionFailure+ 215108 (_:_:file:line:flags:) + 468
3   libswiftCore.dylib              0x000000018f3a74e0 _ArrayBuffer._checkInoutAndNativeTypeCheckedBounds+ 79072 (_:wasNativeTypeChecked:) + 208
4   libswiftCore.dylib              0x000000018f3ab0d8 Array.subscript.getter + 84
5   F49088168M                      0x00000001045ac750 static ELM327ResponseManager.getResponse(responseStr:obd2Protocol:) + 116560 (ELM327ResponseManager.swift:27)
6   F49088168M                      0x00000001045b7904 ELM327Client.dataInput(_:characteristicUuidStr:) + 162052 (ELM327Client.swift:56)
7   F49088168M                      0x00000001045b897c protocol witness for BLEClientInputPort.dataInput(_:characteristicUuidStr:) in conformance ELM327Client + 166268 (<compiler-generated>:0)
8   F49088168M                      0x000000010459d914 BLEConnection.peripheralDataReceived(data:characteristicUuidStr:) + 55572 (BLEConnection.swift:124)
9   F49088168M                      0x00000001045a0e70 BLEConnection.peripheral(_:didUpdateValueFor:error:) + 69232 (BLEConnection.swift:293)
10  F49088168M                      0x00000001045a0f4c @objc BLEConnection.peripheral(_:didUpdateValueFor:error:) + 69452 (<compiler-generated>:0)

Standardmäßig dSYMwird standardmäßig für eine Release- Version generiert . Du kannst es überprüfen:

Build Settings -> Generate Debug Symbols -> Yes
Build Settings -> Debug Information Format -> DWARF with dSYM File

Den Ergebnisort finden Sie in Products Ordner

So generieren dSYMDatei manuell aus .appmitdsymutil

dsymutil F49088168M.app/F49088168M -o F49088168M.app.dSYM

Um den Absturz mit zu symbolisieren symbolicatecrash

export DEVELOPER_DIR="/Applications/Xcode.app/Contents/Developer" 
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/Current/Resources/symbolicatecrash "<path>/F49088168M-2020-06-04-212904.crash" "<path>/F49088168M.app.dSYM" > symbolicated.crash

Manuelles Öffnen dSYMmitdwarfdump

dwarfdump --arch arm64 --debug-pubtypes F49088168M.app.dSYM

Ergebnis sieht aus wie:

0x00000065 "PeripheralLogView"
0x000005cc "BLEConnection"
0x000005da "BLEPeripheral"
0x000005e9 "ELM327Client"

[Wortschatz]

yoAlex5
quelle