[debugging] dSYM은 무엇이며 어떻게 사용합니까? (iOS SDK)

때때로 컴파일러는 .dSYM 파일을 생성합니다. 이것은 디버깅 관련 파일이라고 생각하지만 그것이 무엇인지, 어떻게 사용하는지 모르겠습니다.

.dSYM이란 무엇입니까? 어떻게 사용하나요?



답변

dSYM 파일은 앱의 디버그 기호를 저장합니다.

crashlytics와 같은 서비스는이를 사용하여 충돌 로그의 기호를 적절한 메서드 이름으로 대체하여 읽기 쉽고 의미가 있습니다.

dSYM 사용의 이점은 앱을 기호와 함께 제공 할 필요가 없기 때문에 리버스 엔지니어링이 어렵고 바이너리 크기도 줄어든다는 것입니다.

충돌 로그를 기호화하는 데 사용하려면 앱 바이너리를 컴파일 한 시스템 (dSYM을 저장하는 시스템)의 오거나이저에있는 장치의 장치 로그로 충돌 로그를 끌어 야합니다.

dSYM이 있지만 머신이없는 경우 컴파일 된 앱 바이너리 가이 링크 의 지침에 따라 머신에 dSYM을 설치합니다.

자세한 내용은 Apple 기술 노트 TN2151을 참조하십시오.


답변

dSYMXcode Debugging Symbols의 약자이며, 예를 들어 스택 추적을 읽을 수있는 형식으로 디코딩 할 수있는 일종의 매핑 파일입니다. Bundle다음 구조의 a 입니다.

예를 들어 충돌 로그는 다음과 같습니다.

//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에서 수동으로 파일 을 생성하려면.appdsymutil

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"

[어휘]


답변