충돌 로그를 상징화하기 위해 여기에 모든 대답을 읽은 후에 (그리고 마침내 성공합니다) 나는 symbolicatecrash의 호출이 상징적 인 출력을 생성하지 않는 이유를 결정하기 위해 실제로 중요한 몇 가지 요점이 있다고 생각합니다.
충돌 로그를 상징화 할 때 함께 맞아야하는 3 가지 자산이 있습니다.
example.crash
XCode의 Organizer에서 내보내거나 iTunes Connect에서받은 충돌 로그 파일 자체 (예 :).
- 충돌 로그에 속하는 앱 바이너리가 포함 된
.app
패키지 (예 example.app
:) 당신이있는 경우 .ipa
(즉, 패키지 example.ipa
) 다음은 추출 할 수 있습니다 .app
의 압축을 해제하여 패키지를 .ipa
패키지 (즉 unzip example.ipa
). 그 후 .app
패키지는 추출 된 Payload/
폴더에 있습니다.
.dSYM
디버그 기호를 포함하는 패키지 (예 example.app.dSYM
)
기호화를 시작하기 전에 모든 해당 아티팩트가 일치하는지 확인해야합니다. 이는 충돌 로그가 사용자가 보유한 2 진에 속해 있고 디버그 기호가 해당 2 진 빌드 중에 생성 된 것임을 의미합니다.
각 바이너리는 충돌 로그 파일에서 볼 수있는 UUID에 의해 참조됩니다.
...
Binary Images:
0xe1000 - 0x1f0fff +example armv7 <aa5e633efda8346cab92b01320043dc3> /var/mobile/Applications/9FB5D11F-42C0-42CA-A336-4B99FF97708F/example.app/example
0x2febf000 - 0x2fedffff dyld armv7s <4047d926f58e36b98da92ab7a93a8aaf> /usr/lib/dyld
...
이 추출에서 충돌 로그는 UUID를 사용하여 example.app/example이라는 앱 이진 이미지에 속합니다 aa5e633efda8346cab92b01320043dc3
.
dwarfdump로 가지고있는 바이너리 패키지의 UUID를 확인할 수 있습니다.
dwarfdump --uuid example.app/example
UUID: AA5E633E-FDA8-346C-AB92-B01320043DC3 (armv7) example.app/example
그런 다음 디버그 기호가 해당 바이너리에 속하는지 확인해야합니다.
dwarfdump --uuid example.app.dSYM
UUID: AA5E633E-FDA8-346C-AB92-B01320043DC3 (armv7) example.app.dSYM/Contents/Resources/DWARF/example
이 예에서는 모든 자산이 함께 맞으며 스택 추적을 상징 할 수 있어야합니다.
symbolicatecrash
스크립트 진행 :
Xcode 8.3에서는 다음을 통해 스크립트를 호출 할 수 있어야합니다.
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash -v example.crash 2> symbolicate.log
존재하지 않으면 find . -name symbolicatecrash
Xcode.app 디렉토리에서 a 를 실행 하여 찾을 수 있습니다.
보시다시피 더 이상 매개 변수가 제공되지 않습니다. 따라서 스크립트는 스포트라이트 검색을 실행하여 애플리케이션 바이너리 및 디버그 기호를 찾아야합니다. 특정 인덱스를 사용하여 디버그 기호를 검색합니다 com_apple_xcode_dsym_uuids
. 이 검색을 직접 수행 할 수 있습니다.
mdfind 'com_apple_xcode_dsym_uuids = *'
각하
mdfind "com_apple_xcode_dsym_uuids == AA5E633E-FDA8-346C-AB92-B01320043DC3"
첫 번째 스포트라이트 호출은 모든 색인화 된 dSYM 패키지를 제공하고 두 번째 스포트라이트 호출은 .dSYM
특정 UUID를 가진 패키지를 제공합니다 . 스포트라이트가 .dSYM
패키지를 찾지 못하면 symbolicatecrash
둘 중 하나도 아닙니다. 예를 들어 ~/Desktop
스포트라이트 의 하위 폴더에서이 모든 작업을 수행하면 모든 것을 찾을 수 있어야합니다.
경우 symbolicatecrash
귀하의 발견 .dSYM
패키지를 다음에 같은 라인이 있어야한다 symbolicate.log
:
@dsym_paths = ( <SOME_PATH>/example.app.dSYM/Contents/Resources/DWARF/example )
.app
패키지 를 찾기 위해 다음과 같은 스포트라이트 검색이 호출됩니다 symbolicatecrash
.
mdfind "kMDItemContentType == com.apple.application-bundle && (kMDItemAlternateNames == 'example.app' || kMDItemDisplayName == 'example' || kMDItemDisplayName == 'example.app')"
경우 symbolicatecrash
귀하의 발견 .app
패키지에 다음 추출물이 있어야한다 symbolicate.log
:
Number of symbols in <SOME_PATH>/example.app/example: 2209 + 19675 = 21884
Found executable <SOME_PATH>/example.app/example
-- MATCH
이러한 모든 리소스가 발견 symbolicatecrash
되면 기호화 된 버전의 충돌 로그를 인쇄해야합니다.
그렇지 않은 경우 dSYM 및 .app 파일을 직접 전달할 수 있습니다.
symbolicatecrash -v --dsym <SOME_PATH>/<App_URI>.app.dSYM/<APP_NAME>.app.dsym <CRASHFILE> <SOME_OTHER_PATH>/<APP_NAME>.app/<APP_NAME> > symbolicate.log
참고 : 기호화 된 역 추적은 아닌 터미널로 출력됩니다 symbolicate.log
.
symbolicatecrash
명령 을 찾을 수있는 위치 , 사용 방법 및 기호화에 필요한 dSYM 파일을 찾는 방법을 설명합니다.