Что такое dSYM и как им пользоваться? (SDK для iOS)

117

Иногда компилятор создает файлы .dSYM. Я предполагаю, что это файл, связанный с отладкой, но я не знаю, что это такое и как его использовать.

Что такое .dSYM? Как мне его использовать?

eonil
источник

Ответы:

160

Файлы dSYM хранят символы отладки для вашего приложения

Такие службы, как crashlytics, используют его для замены символов в журналах сбоев на соответствующие имена методов, чтобы они были удобочитаемыми и имели смысл.

Преимущество использования dSYM заключается в том, что вам не нужно отправлять свое приложение с его символами, что затрудняет его обратное проектирование, а также уменьшает размер двоичного файла.

Чтобы использовать для обозначения журнала сбоев, вам необходимо перетащить журнал сбоев в журналы устройства устройства в органайзере машины, на которой скомпилирован двоичный файл приложения (машина, на которой хранится dSYM)

Если у вас есть dSYM, но нет компьютера, скомпилированный двоичный файл приложения следуйте инструкциям в этой ссылке, чтобы установить dSYM на компьютер.

Дополнительные сведения см. В техническом примечании Apple TN2151.

Томер Эвен
источник
1
Не сделает ли Crashlytics невозможным включение dSYM в бинарный файл магазина приложений возможность регистрации сбоев?
генакс 06
Так безопасно ли снимать флажок "Включить символы приложений ..."?
genaks 08
2
Если вы хотите видеть журналы сбоев внутри Apple Connect, вы можете включить символы приложения при загрузке приложения в магазин приложений. если вы используете crashlytics, вам не обязательно этого делать, но не помешает включить символы приложения (файл dsym) и отправить его в Apple, установив флажок «включить символы приложения ...» в загрузке в приложение Мастер магазина
Томер Эвен
1
Я думал сэкономить пользователю пару МБ, если это можно сделать
генакс 09
От разработчиков Crashlytics - twittercommunity.com/t/…
genaks 09
1

dSYMрасшифровывается как Xcode Debugging Symbols, это своего рода файл сопоставления, который может, например, декодировать трассировку стека в читаемый формат. Это Bundleсо следующей структурой:

Например, журнал сбоев выглядит так:

//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 в действии

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

По умолчанию dSYMгенерируется по умолчанию для релизной версии. Вы можете проверить это:

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

Местоположение результата вы можете найти в Productsпапке

Чтобы сгенерировать dSYMфайл вручную с .appпомощьюdsymutil

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

Чтобы обозначить сбой, используйте 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

Чтобы открыть dSYMвручную с помощьюdwarfdump

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

результат выглядит так:

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

[Словарь]

yoAlex5
источник