Qu'est-ce que le dSYM et comment l'utiliser? (SDK iOS)

117

Parfois, le compilateur produit des fichiers .dSYM. Je suppose que c'est un fichier lié au débogage, mais je ne sais pas ce que c'est et comment l'utiliser.

Qu'est-ce qu'un .dSYM? Comment l'utiliser?

éonil
la source

Réponses:

160

Les fichiers dSYM stockent les symboles de débogage pour votre application

Des services comme crashlytics l'utilisent pour remplacer les symboles dans les journaux de crash par les noms de méthodes appropriés afin qu'il soit lisible et ait un sens.

L'avantage d'utiliser le dSYM est que vous n'avez pas besoin d'expédier votre application avec des symboles, ce qui rend plus difficile son ingénierie inverse et réduit également votre taille binaire.

Pour symboliser le journal des plantages, vous devez faire glisser le journal des plantages dans les journaux des périphériques de l'appareil dans l'organisateur de la machine qui a compilé le binaire de l'application (une machine qui stocke le dSYM)

Si vous avez le dSYM mais que vous n'avez pas la machine compilée, le binaire de l'application, suivez les instructions de ce lien afin d'installer le dSYM dans la machine

Pour plus d'informations, veuillez consulter la note technique d'Apple TN2151

Tomer Even
la source
1
Le fait de ne pas inclure les dSYM avec un binaire de l'App Store empêchera Crashlytics de consigner les plantages?
genaks
Vous pouvez donc décocher la case "Inclure les symboles d'application ..." en toute sécurité?
genaks
2
si vous souhaitez voir les journaux de plantage dans Apple Connect, vous pouvez inclure les symboles de l'application lorsque vous téléchargez l'application sur l'App Store. si vous utilisez crashlytics, vous n'êtes pas obligé de le faire, mais cela ne fait pas de mal d'inclure les symboles de l'application (le fichier dsym) et de l'envoyer à Apple en cochant la case "Inclure les symboles de l'application ..." dans le téléchargement vers l'application Assistant de magasin
Tomer Even
1
Je pensais économiser à l'utilisateur quelques Mo si cela peut être fait
genaks
Des développeurs Crashlytics
twittercommunity.com/t
1

dSYMsignifie Xcode Debugging Symbols, c'est une sorte de fichier de mappage qui peut, par exemple, décoder une trace de pile dans un format lisible. C'est un Bundleavec la structure suivante:

Par exemple, un journal des plantages ressemble à:

//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 en action

//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)

Par défaut, dSYMest généré par défaut pour une version commerciale . Tu peux le vérifier:

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

L'emplacement du résultat que vous pouvez trouver dans le Productsdossier

Pour générer un dSYMfichier manuellement à l' .appaide dedsymutil

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

Pour symboliser un crash en utilisant 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

Pour ouvrir dSYMmanuellement en utilisantdwarfdump

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

le résultat ressemble à:

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

[Vocabulaire]

yoAlex5
la source