iPhone 앱의 충돌 보고서를 시도하고 상징하려고합니다.
iTunes Connect에서 충돌 보고서를 검색했습니다. App Store에 제출 한 응용 프로그램 바이너리가 있으며 빌드의 일부로 생성 된 dSYM 파일이 있습니다.
스포트 라이트로 색인이 생성 된 단일 디렉토리 안에 이러한 파일을 모두 가지고 있습니다.
지금 무엇?
나는 호출을 시도했다 :
symbolicatecrash crashreport.crash myApp.app.dSYM
충돌 보고서에있는 것과 동일한 텍스트를 기호화하지 않고 시작합니다.
내가 뭔가 잘못하고 있습니까?
답변
애플의 충돌 보고서를 분석하는 단계 :
-
appstore로 푸시 된 릴리스 .app 파일, 릴리스시 작성된 .dSYM 파일을 복사하고 충돌 보고서가 APPLE에서 FOLDER 로 수신됩니다 .
-
터미널 응용 프로그램을 열고 위에서 만든 폴더로 이동하십시오 (
cd
명령 사용 ) -
를 실행하십시오
atos -arch armv7 -o APPNAME.app/APPNAME MEMORY_LOCATION_OF_CRASH
. 메모리 위치는 보고서에 따라 앱이 중단 된 위치 여야합니다.
전의: atos -arch armv7 -o 'APPNAME.app'/'APPNAME' 0x0003b508
이것은 정확한 줄, 메소드 이름을 표시하여 충돌을 일으켰습니다.
전의: [classname functionName:]; -510
상징적 인 IPA
IPA를 상징화하는 데 사용한다면 확장자 .ipa의 이름을 .zip으로 바꾸고 추출하면 앱이 포함 된 페이로드 폴더를 얻을 수 있습니다. 이 경우 .dSYM 파일이 필요하지 않습니다.
노트
앱 바이너리에 심볼이 제거되지 않은 경우에만 작동합니다. 기본적으로 릴리스 빌드는 심볼을 제거했습니다. 프로젝트 빌드 설정 “복사 중 스트립 디버그 기호”에서 NO로 변경할 수 있습니다.
자세한 내용은이 게시물을 참조하십시오
답변
충돌 로그를 상징화하기 위해 여기에 모든 대답을 읽은 후에 (그리고 마침내 성공합니다) 나는 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
.
답변
최신 버전의 Xcode (3.2.2)를 사용하면 충돌 보고서를 Xcode Organizer의 장치 로그 섹션으로 끌어서 놓을 수 있으며 자동으로 기호로 표시됩니다. Build & Archive (Xcode 3.2.2의 일부)를 사용하여 해당 버전의 앱을 빌드 한 경우 이것이 가장 효과적이라고 생각합니다
답변
다음 단계를 사용하여 성공적으로 수행했습니다.
1 단계 : 바탕 화면에 폴더를 만들고 이름을 “CrashReport”로 지정하고 세 개의 파일 ( “MYApp.app”, “MyApp.app.dSYM”, “MYApp_2013-07-18.crash”)을 넣습니다.
2 단계 : Finder를 열고 Xcode 응용 프로그램을 찾을 수있는 응용 프로그램으로 이동하십시오. 이곳을 마우스 오른쪽 버튼으로 클릭하고 “패키지 내용보기”를 클릭하십시오.이 간단한 경로를 따라 가십시오. “내용-> 개발자-> 플랫폼-> iPhoneOS.platform-> 개발자 -> 라이브러리 -> PrivateFrameworks-> DTDeviceKit.framework- > 버전-> A-> 자원”
또는
“내용-> 개발자-> 플랫폼-> iPhoneOS.platform-> 개발자 -> 라이브러리 -> PrivateFrameworks-> DTDeviceKitBase.framework- > 버전-> A-> 자원”
또는
Xcode 6 이상의 경우 경로는 Applications / Xcode.app / Contents / SharedFrameworks / DTDeviceKitBase.framework / Versions / A / Resources입니다.
“symbolicatecrash”파일을 찾으면이를 복사하여 “CrashReport”폴더에 붙여 넣으십시오.
3 단계 : 터미널을 시작하고이 3 개의 명령을 실행하십시오.
-
cd / Users / mac38 / Desktop / CrashReport를 입력하고 Enter 버튼을 누릅니다
-
DEVELOPER_DIR = “/ Applications / Xcode.app / Contents / Developer”를 내보내고 Enter를 누르십시오.
- ./symbolicatecrash -A -v MYApp_2013-07-18.crash MyApp.app.dSYM을 입력하고 Enter Now를 누르십시오. (참고 : 6.4 이상의 버전에는 -A 옵션이 없습니다. 그냥 두십시오).
답변
XCode를 사용하여 충돌 보고서를 자동으로 상징하는 단계 :
XCODE 9 용으로 업데이트
-
연결 어떤 (예 물리적 하나, 그래 난이 바보 알고) Mac에 iOS 장비를
-
기다림. 표시되는 데 1 분 정도 걸릴 수 있습니다. 어쩌면 일을
Command-A
한 다음Delete
이 속도를 높일 것입니다. -
문서화되지 않은 중요한 단계 : iTunesConnect에서받은 충돌 보고서
.txt
를.crash
확장에서확장으로이름을 바꿉니다.
그런 다음 Xcode는 충돌 보고서를 상징하고 결과를 표시합니다.
출처 : https://developer.apple.com/library/ios/technotes/tn2151/_index.html
답변
내 앱에서 Airbrake를 사용하는데, 이는 원격 오류 로깅을 상당히 잘 수행합니다.
백 트레이스에 필요한 경우 아토스로 상징화하는 방법은 다음과 같습니다.
-
Xcode (4.2)에서 Organizer로 이동하여 .ipa 파일이 생성 된 아카이브를 마우스 오른쪽 버튼으로 클릭하십시오.
-
터미널에서 예를 들어 xcarchive로 cd
MyCoolApp 10-27-11 1.30 PM.xcarchive
-
다음을 입력하십시오
atos -arch armv7 -o 'MyCoolApp.app'/'MyCoolApp'
(작은 따옴표를 잊지 마십시오) -
나는 그 전화에 내 상징을 포함시키지 않았다. 당신이 얻는 것은 빈 줄에 블록 커서입니다.
-
그런 다음 해당 블록 커서에서 심볼 코드를 복사 / 붙여 넣기하고 Enter 키를 누릅니다. 다음과 같은 것을 보게 될 것입니다 :
-[MyCoolVC dealloc] (in MyCoolApp) (MyCoolVC.m:34)
-
블록 커서로 돌아가서 다른 기호를 붙여 넣을 수 있습니다.
첫 번째 비트를 다시 입력하지 않고 하나의 항목을 역 추적 할 수 있다는 것은 시간을 절약 해주는 좋은 방법입니다.
즐겨!
답변
또한 상징적 충돌을 실행하기 전에 dsym, 앱 번들 및 충돌 로그를 동일한 디렉토리에 넣습니다.
그런 다음 .profile에 정의 된이 함수를 사용하여 symbolicatecrash 실행을 단순화합니다.
function desym
{
/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources/symbolicatecrash -A -v $1 | more
}
거기에 추가 된 주장이 도움이 될 수 있습니다.
다음 명령을 실행하여 스포트라이트가 dysm 파일을 “보는”지 확인할 수 있습니다.
mdfind 'com_apple_xcode_dsym_uuids = *'
디렉토리에있는 dsym을 찾으십시오.
참고 : 최신 Xcode부터 더 이상 개발자 디렉토리가 없습니다. 이 유틸리티는 여기에서 찾을 수 있습니다.
/Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash