What's the dSYM and how to use it? (iOS SDK) What's the dSYM and how to use it? (iOS SDK) ios ios

What's the dSYM and how to use it? (iOS SDK)


dSYM files store the debug symbols for your app

Services like Crashlytics use it to replace the symbols in the crash logs with the appropriate methods names so it will be readable and will make sense.

The benefit of using the dSYM is that you don't need to ship your App with its symbols making it harder to reverse engineer it and also reduce your binary size

In order to use to symbolicate the crash log you need to drag the crash log into the device's device logs in the organizer of the machine that compiled the app binary (a machine that stores the dSYM)

If you have the dSYM but don't have the machine the compiled the app binary follow the instructions in this link in order to install the dSYM into the machine.

There is a mac app that helps you symbolicate a crash log in case you need to do it yourself.

For more information please see apple technical note TN2151


Xcode Debugging Symbols(dSYM)

dSYM it is a Bundle(e.g F49088168M.app.dSYM) which contains a mapping information and with which you can, for example, decode a stack-trace into readable format.

structure:

For example a crash log looks like:

//before0   libswiftCore.dylib              0x000000018f3c9380 0x18f394000 + 2179841   libswiftCore.dylib              0x000000018f3c9380 0x18f394000 + 2179842   libswiftCore.dylib              0x000000018f3c8844 0x18f394000 + 2151083   libswiftCore.dylib              0x000000018f3a74e0 0x18f394000 + 790724   libswiftCore.dylib              0x000000018f3ab0d8 0x18f394000 + 944245   F49088168M                      0x00000001045ac750 0x104590000 + 1165606   F49088168M                      0x00000001045b7904 0x104590000 + 1620527   F49088168M                      0x00000001045b897c 0x104590000 + 1662688   F49088168M                      0x000000010459d914 0x104590000 + 555729   F49088168M                      0x00000001045a0e70 0x104590000 + 6923210  F49088168M                      0x00000001045a0f4c 0x104590000 + 69452

dSYM in action

//after Symbolicating(dSYM is used)0   libswiftCore.dylib              0x000000018f3c9380 closure #1 in closure #1 in closure #1 in _assertionFailure+ 217984 (_:_:file:line:flags:) + 4521   libswiftCore.dylib              0x000000018f3c9380 closure #1 in closure #1 in closure #1 in _assertionFailure+ 217984 (_:_:file:line:flags:) + 4522   libswiftCore.dylib              0x000000018f3c8844 _assertionFailure+ 215108 (_:_:file:line:flags:) + 4683   libswiftCore.dylib              0x000000018f3a74e0 _ArrayBuffer._checkInoutAndNativeTypeCheckedBounds+ 79072 (_:wasNativeTypeChecked:) + 2084   libswiftCore.dylib              0x000000018f3ab0d8 Array.subscript.getter + 845   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)

By default dSYM is generated by default for a release version.You can check it:

Build Settings -> Generate Debug Symbols(GCC_GENERATE_DEBUGGING_SYMBOLS) -> YesBuild Settings -> Debug Information Format(DEBUG_INFORMATION_FORMAT) -> DWARF with dSYM File

The result location you can find in Products folder

To generate dSYM file manually from .app using dsymutil

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

To symbolicate crash using 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

To open dSYM manually using dwarfdump

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

result looks like:

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

*Your .app's dSYM should include all included(framework) dSYMs

[dSYM location]

[.bcsymbolmap]

[Vocabulary]