¿Qué es el dSYM y cómo se utiliza? (SDK de iOS)

117

A veces, el compilador produce archivos .dSYM. Supongo que este es un archivo relacionado con la depuración, pero no sé qué es y cómo usarlo.

¿Qué es un .dSYM? ¿Como lo uso?

eonil
fuente

Respuestas:

160

Los archivos dSYM almacenan los símbolos de depuración de su aplicación

Servicios como crashlytics lo utilizan para reemplazar los símbolos en los registros de fallos con los nombres de métodos apropiados para que sea legible y tenga sentido.

El beneficio de usar dSYM es que no necesita enviar su aplicación con sus símbolos, lo que dificulta la ingeniería inversa y también reduce el tamaño binario.

Para utilizarlo para simbolizar el registro de fallos, debe arrastrar el registro de fallos a los registros del dispositivo del dispositivo en el organizador de la máquina que compiló el binario de la aplicación (una máquina que almacena el dSYM)

Si tiene el dSYM pero no tiene la máquina, el binario de la aplicación compilado, siga las instrucciones en este enlace para instalar el dSYM en la máquina

Para obtener más información, consulte la nota técnica de Apple TN2151

Tomer Even
fuente
1
¿No incluir dSYM con un binario de la tienda de aplicaciones hará que Crashlytics no pueda registrar los bloqueos?
genaks
Entonces, ¿es seguro desmarcar la casilla 'Incluir símbolos de aplicaciones ...'?
genaks
2
Si desea poder ver los registros de fallas dentro de Apple Connect, puede incluir los símbolos de la aplicación cuando cargue la aplicación en la tienda de aplicaciones. Si está utilizando crashlytics, no tiene que hacerlo, pero no está de más incluir los símbolos de la aplicación (el archivo dsym) y enviarlo a Apple marcando "incluir símbolos de la aplicación ..." en la carga a la aplicación. Asistente de tienda
Tomer Even
1
Estaba pensando en ahorrarle al usuario un par de MB si se puede hacer
genaks
De los desarrolladores de Crashlytics - twittercommunity.com/t/…
genaks
1

dSYMson las siglas de Xcode Debugging Symbols, es una especie de archivo de mapeo que puede, por ejemplo, decodificar un seguimiento de pila en un formato legible. Es una Bundlecon la siguiente estructura:

Por ejemplo, un registro de fallos se ve así:

//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 acción

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

De forma predeterminada, dSYMse genera de forma predeterminada para una versión de lanzamiento . Usted puede comprobarlo:

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

La ubicación de los resultados que puede encontrar en la Productscarpeta

Para generar un dSYMarchivo manualmente .appusandodsymutil

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

Para simbolizar un accidente usando 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

Para abrir dSYMmanualmente usandodwarfdump

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

el resultado se parece a:

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

[Vocabulario]

yoAlex5
fuente