O que é dSYM e como usá-lo? (iOS SDK)

117

Às vezes, o compilador produz arquivos .dSYM. Acho que este é um arquivo relacionado à depuração, mas não sei o que é e como usá-lo.

O que é um .dSYM? Como eu uso isso?

eonil
fonte

Respostas:

160

Os arquivos dSYM armazenam os símbolos de depuração para seu aplicativo

Serviços como o crashlytics usam-no para substituir os símbolos nos logs de travamento pelos nomes de métodos apropriados para que seja legível e faça sentido.

A vantagem de usar o dSYM é que você não precisa enviar seu aplicativo com os símbolos, tornando mais difícil fazer engenharia reversa e também reduzir o tamanho do binário

Para simbolizar o log de travamento, você precisa arrastar o log de travamento para os logs do dispositivo do dispositivo no organizador da máquina que compilou o binário do aplicativo (uma máquina que armazena o dSYM)

Se você tiver o dSYM, mas não tiver a máquina, o binário do aplicativo compilado siga as instruções neste link para instalar o dSYM na máquina

Para obter mais informações, consulte a nota técnica da apple TN2151

Tomer Even
fonte
1
Não incluir dSYMs com um binário da loja de aplicativos fará com que o Crashlytics não consiga registrar as falhas?
genaks
Portanto, é seguro desmarcar a caixa 'Incluir símbolos de aplicativos ...'?
genaks
2
se quiser ver os crashlogs dentro do apple connect, você pode incluir os símbolos do app ao fazer upload do app na app store. se você estiver usando crashlytics, não precisa fazer isso, mas não custa nada incluir os símbolos do aplicativo (o arquivo dsym) e enviá-lo para a apple marcando "incluir símbolos do aplicativo ..." no upload para o aplicativo Assistente da loja
Tomer Even
1
Eu estava pensando em salvar ao usuário alguns MBs se isso puder ser feito
genaks
Dos desenvolvedores do Crashlytics - twittercommunity.com/t/…
genaks
1

dSYMsignifica Xcode Debugging Symbols, é um tipo de arquivo de mapeamento que pode, por exemplo, decodificar um rastreamento de pilha em um formato legível. É um Bundlecom a próxima estrutura:

Por exemplo, um registro de travamento se parece com:

//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 em ação

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

Por padrão, dSYMé gerado por padrão para uma versão de lançamento . Você pode verificá-lo:

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

A localização do resultado você pode encontrar na Productspasta

Para gerar o dSYMarquivo manualmente .appusandodsymutil

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

Para simbolizar o acidente 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

resultado semelhante a:

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

[Vocabulário]

yoAlex5
fonte