什么是dSYM以及如何使用?(iOS SDK)


117

有时,编译器会生成.dSYM文件。我猜这是一个与调试相关的文件,但我不知道它是什么以及如何使用。

什么是.dSYM?如何使用?

Answers:


160

dSYM文件存储您的应用程序的调试符号

诸如crashlytics之类的服务使用它来使用适当的方法名称替换崩溃日志中的符号,从而使它可读且有意义。

使用dSYM的好处是,您不需要将其附带的符号带到您的App中,这使得对它进行反向工程和缩小二进制文件的大小变得更加困难。

为了用来表示崩溃日志,您需要将崩溃日志拖动到编译应用程序二进制文件的计算机(存储dSYM的计算机)的组织器中的设备的设备日志中

如果您有dSYM,但没有计算机,则按照以下链接中的说明编译应用程序二进制文件,以便将dSYM安装到计算机中

有关更多信息,请参阅苹果技术说明TN2151。


1
是否不将dSYM与应用商店二进制文件一起包含,将使Crashlytics无法记录崩溃?
杰纳克斯

因此,取消选中“包括应用程序符号...”框是安全的吗?
杰纳克斯

2
如果您希望能够在apple connect中查看崩溃日志,则可以在将应用程序上载到应用程序商店时添加应用程序符号。如果您使用的是crashlytics,则不必这样做,但包括应用程序符号(dsym文件)并通过在上载到应用程序中选中“包括应用程序符号...”将其发送到Apple并没有什么害处。商店向导
Tomer Even'6

1
我当时想如果可以的话,可以为用户节省几MB的空间
genaks 2013年

从Crashlytics开发商- twittercommunity.com/t/...
genaks

1

dSYMXcode 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"

[词汇]

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.