충돌 로그 Xcode를 상징화하는 방법?


189

Xcode 5 Organizer에는 모든 충돌 로그를 나열하는보기가 있습니다. 드롭 크래시 로그를 여기로 드래그 할 수 있습니다. 그러나 Xcode 6부터는 장치를 구성에서 벗어나 새로운 창을 가지고 있음을 알고 있습니다. 그러나 Xcode 6으로 업그레이드 한 후 Xcode 5에서 드래그 다운 된 충돌 로그를 볼 수있는 곳을 찾지 못했습니다.


3
나는 몇 달 전에 Apple 개발자 포럼 에서 물었고 답을 얻지 못했습니다. 유용한 기능이 손실되었습니다. Apple에이 기능을 다시 요청하는 버그 보고서를 제출하십시오.
rmaddy

1
나는 주말에 iOS와 OSX 크래시 덤프 모두에 대한 상징을 해결하기 위해 이것을 두드렸다. 여전히 매우 거칠지 만 작동해야합니다. github.com/agentsim/Symbolicator
Tim

4
Xcode, 애플 리뷰어의 상징적 인 충돌 로그를 f-ing하면 좋을 것 같습니다 ... 말 그대로 하루 종일이 작업을 수행하는 방법을 알아 내야한다고 생각하기보다는?
윌리엄 Entriken

답변:


120

Ok 나는 당신이 이것을 할 수 있다는 것을 깨달았습니다.

  1. Xcode > Window > Devices연결된 아이폰 / 아이 패드 선택 / 등 상단 왼쪽.
  2. 장치 로그보기
  3. 모든 로그

아마도 거기에 많은 로그가 있고 나중에 가져온 로그를 쉽게 찾을 수 있도록하기 위해이 시점에서 모든 로그를 삭제할 수 있습니다. 또는 충돌이 발생한 정확한 시점을 모른다면 어쨌든 파일에 기록해야합니다 ... 게으 르기 때문에 오래된 로그를 모두 삭제합니다 (실제로 시간이 걸렸습니다).

  1. 파일을 해당 목록으로 끌어다 놓기 만하면됩니다. 그것은 나를 위해 일했다.

13
나는 같은 문제를 겪고 있지만 이것은 문제를 해결하지 못합니다. 창으로 드래그 앤 드롭하는 로그가 나타나지만 상징적이지는 않습니다.
Arkaaito

9
요령은 장치를 연결하고 목록에서 장치를 선택해야한다는 것입니다. 나는 장치가 없다면 가능하지 않다고 생각합니다.
Jonny

60
충돌 파일을 해당 목록으로 끌어 놓으려면 확장자가 확장자 여야합니다 .crash.
pjay_

7
나를 위해 빠진 단계는 파일이 삭제되면 파일을 마우스 오른쪽 버튼으로 클릭하고 로그를 다시 기호로
만들어야하는 것입니다.

6
Organizer 내부의 해당 아카이브에 대한 "dSYM 다운로드"를 잊지 마십시오.
123FLO321

259

이 답변을 나 자신만큼이나 커뮤니티에 쓰십시오.

충돌 보고서를 상징하는 데 문제가있는 경우 다음과 같이이를 극복 할 수 있습니다.

  1. 복사, 별도의 폴더를 생성 Foo.app하고 Foo.app.dSYM해당에서 .xcarchive폴더로. 또한 .crash보고서를 폴더에 복사하십시오 .

  2. TextEdit 또는 다른 곳에서 충돌 보고서를 열고 Binary Images:섹션으로 이동 하여 첫 번째 주소를 복사하십시오 (예 :) 0xd7000.

  3. cd폴더에. 이제 다음 명령을 실행할 수 있습니다.

    xcrun atos -o Foo.app/Foo -arch arm64 -l 0xd7000 0x0033f9bb

이것은 address의 심볼을 상징합니다 0x0033f9bb. -arch옵션 의 올바른 값을 선택하십시오 ( Binary Images:섹션 의 첫 번째 라인에서 가져 오거나 Hardware Model:충돌 보고서 및 앱의 지원되는 아치에서 알아낼 수 있음 ).

충돌 보고서의 필요한 주소 (예 : 스레드 호출 스택)를 텍스트 파일 (TextEdit에서 Option을 누른 상태에서 필요한 텍스트 블록을 선택하거나 복사 및 잘라 내기)에 직접 복사하여 다음과 같은 결과를 얻을 수 있습니다.

0x000f12fb
0x002726b7
0x0026d415
0x001f933b
0x001f86d3

이제이를 텍스트 파일 (예 :)로 저장 addr.txt하고 다음 명령을 실행할 수 있습니다.

xcrun atos -o Foo.app/Foo -arch arm64 -l 0xd7000 -f addr.txt

이것은 한 번에 모든 주소에 대해 좋은 상징을 줄 것입니다.

추신

위의 작업을 수행하기 전에 모든 것이 올바르게 설정되어 있는지 확인하는 것이 atos좋습니다 (기본적으로 제공된 모든 주소에 대해 행복하게보고 할 것입니다).

확인을 수행하려면 충돌 보고서를 열고에 대한 호출 스택 끝으로 이동하십시오 Thread 0. 끝에서 첫 번째 줄로 앱을 나열합니다 (보통 두 번째 줄). 예 :

34  Foo                    0x0033f9bb 0xd7000 + 2525627

main()전화 해야합니다 . 0x0033f9bb위에서 설명한 것처럼 주소 ( 이 경우)를 상징하면 이것이 main()임의의 방법이나 기능 이 아니라는 것을 확인해야 합니다.

주소가 주소가 아닌 경우 main()로드 주소 ( -l옵션) 및 아치 ( -arch옵션)를 확인하십시오.

PPS

위에서로 인해 일을하지 않는 경우 비트 코드 ,의 dSYM (찾기> 패키지 내용보기)에서 실행 가능한 바이너리를 추출, 아이튠즈 커넥트에서 빌드의 dSYM를 다운로드 디렉토리에 복사하고 (즉 사용 Foo은 AS) atos대신 에을 (를 ) 인수 하십시오 Foo.app/Foo.


2
미니 xcrun 튜토리얼을 작성하고 온 전성 검사 섹션으로 업데이트하는 데 문제가있어 주셔서 감사합니다. 내
욕심

10
충돌 보고서가 실행 파일 및 dSYM과 일치하는지 확인하는 것을 잊지 마십시오. 이진 이미지 섹션의 <>에있는 식별자와 실행 파일에서 반환 된 식별자를 일치시켜이를 확인할 수 있습니다 xcrun dwarfdump --uuid <path to executable>
.

2
앱 (Foo)의 심볼 만 표시됩니다. Foundation 또는 libsystem_kernel.dylib와 같은 외부 라이브러리 / 프레임 워크의 심볼에는 표시되지 않습니다.
jlukanta

1
이것은 도움이되지만 여전히 효과가 없습니다. 문제가있는 부분은 0xd7000 정보가 없다는 것입니다. 내 줄은 다음과 같습니다. 0x100038328 __mh_execute_header + 99112. __mh_execute_header가 무엇인지 읽었지만 어떻게 0x100038328에 대한 정보를 얻을 수 있습니까? 나는 다른 모든이
skinsfan00atg

5
나는 대부분의 작업을 수행하는 간단한 bash 스크립트를 작성했습니다. 사용법 : ./symbolicate.sh mycrash.crash MyApp.app arch64 output.crash 전체 충돌 보고서를 상징하고 상징화 된 버전을 제공합니다. gist.github.com/nathan-fiscaletti/…
Nathan F.

187

당신도 이것을 참조 할 수 있습니다, 나는 수동 충돌 다시 상징 의 단계별 절차를 작성했습니다 .

충돌 재 기호

1 단계

위의 모든 파일 (MyApp.app, MyApp-dSYM.dSYM 및 MyApp-Crash-log.crash)을 터미널을 쉽게 사용할 수있는 편리한 이름의 폴더로 이동하십시오.

나에게있어 데스크탑은 가장 쉽게 접근 할 수있는 곳이다.) 따라서이 세 파일을 데스크탑의 MyApp 폴더로 옮겼습니다.

2 단계

이제 Finder가 바뀌 었습니다. XCODE 버전에 해당되는 경로를 찾으십시오.

이 명령을 사용하여 symbolicatecrash스크립트 파일 을 찾으십시오 .
find /Applications/Xcode.app -name symbolicatecrash

Xcode 8, Xcode 9, Xcode 11 /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash

Xcode 7.3 /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash

XCode 7 /Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash

Xcode 6 /Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources

Xcode 6 이하 Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKitBase.framework/Versions/A/Resources

또는 Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources

3 단계

찾은 symbolicatecrash 스크립트 파일의 디렉토리를 $PATH다음 sudo vim /etc/paths.d/Xcode-symbolicatecrash과 같이 env 변수에 추가하고 스크립트 파일의 디렉토리를 붙여넣고 파일을 저장하십시오. 새 터미널을 열 때에있는 symbolicatecrash명령으로 모든 폴더를 호출 할 수 있습니다 /usr/bin.

또는

이 위치에서 symbolicatecrash 파일을 복사하여 Desktop / MyApp에 붙여 넣습니다 (잠깐만 ... 맹목적으로 따르지 마십시오. Sybolicatecrash 파일을 MyApp 폴더에 붙여넣고 있습니다. 하나는 좋아하는 위치에서 1 단계에서 생성 한 파일 중 하나입니다. )

4 단계

터미널을 열고 CD를 MyApp 폴더로 엽니 다.

cd Desktop/MyApp — Press Enter
export DEVELOPER_DIR=$(xcode-select --print-path)

 —  Enter를 누르십시오

./symbolicatecrash -v MyApp-Crash-log.crash MyApp.dSYM

 —  Enter를 누르십시오

그게 다야 !! 기호화 된 로그가 터미널에 있습니다. 이제 무엇을 기다리고 있습니까? 이제 간단히 오류를 찾아서 해결하십시오.)

행복한 코딩!


2
@ EmilVikström : 제안 주셔서 감사합니다, 답변을 업데이트했습니다.
Mrug

2
수출 사용 DEVELOPER_DIR =xcode-select --print-path
Parag Bafna

8
대접을 받았습니다-감사합니다. 내보내기 DEVELOPER_DIR = / Applications / XCode.app / Contents / Developer (따옴표 제외)를 사용해야하는 한 가지뿐입니다.
goelectric

1
"export DEVELOPER_DIR = xcode-select --print-path"는 "-bash : export :`--print-path ': 유효한 식별자가 아님
Almo

2
최신 정보; 여기있어 ; xcode7의 경우 symbolicatecrash를 찾으십시오. /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash per stackoverflow.com/ 질문에 따라 / 32804611 /…
AnneTheAgile

28

나를 위해 .crash 파일로 충분했습니다. .dSYM 파일과 .app 파일이 없습니다.

아카이브를 빌드하는 Mac에서 다음 두 명령을 실행했으며 작동했습니다.

export DEVELOPER_DIR="/Applications/Xcode.app/Contents/Developer" 

/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash  /yourPath/crash1.crash > /yourPath/crash1_symbolicated.crash

와. .dsym 파일없이 어떻게 작동하는지 모르겠지만 작동합니다!
rustyMagnet

4
@rustyMagnet 작동 방식은 컴퓨터의 보관 된 빌드에서 dsyms를 사용하는 것입니다.
Andrey Tarantsov

1
예, 이것은 Xcode로 보관 한 빌드에만 적용되며 충돌 실행을 상징하는 임시 실행에 대해 생성 한 다른 빌드는 아닙니다.
CMash

21

Xcode를 사용하는 더 쉬운 방법이 있습니다 (명령 줄 도구를 사용하지 않고 한 번에 하나씩 주소를 검색하지 않아도 됨)

  1. .xcarchive 파일을 가져옵니다. 당신이 전에 그것을 가지고 있다면 그것을 사용할 수 있습니다. 계정이없는 경우 Xcode에서 제품> 아카이브를 실행하여 작성하십시오.

  2. .xcarchive 파일을 마우스 오른쪽 버튼으로 클릭하고 '패키지 내용 표시'를 선택하십시오.

  3. 충돌 한 앱 버전의 dsym 파일을 dSYMs 폴더에 복사

  4. .app 파일 (충돌 된 앱 버전)을 Products> Applications 폴더에 복사하십시오.

  5. Info.plist를 편집하고 ApplicationProperties 사전에서 CFBundleShortVersionString 및 CFBundleVersion을 편집하십시오. 나중에 아카이브를 식별하는 데 도움이됩니다.

  6. .xcarchive를 두 번 클릭하여 Xcode로 가져옵니다. 오거나이저를 열어야합니다.

  7. 충돌 로그로 돌아 가기 (Xcode의 장치 창에서)

  8. .crash 파일을 거기서 드래그하십시오 (아직없는 경우).

  9. 전체 충돌 로그가 이제 상징화되어야합니다. 그렇지 않은 경우 마우스 오른쪽 버튼을 클릭하고 '재심사 충돌 로그 다시 표시'를 선택하십시오.


1
당신의 대답은 정확하고 간단합니다. 터미널 앱을 사용할 필요가 없습니다. .app.dSYM 폴더의 zip ball 대신 Continuous-Integration 시스템에 .xcarchive 파일이 없기 때문에 .xcarchive 폴더의 재생산이 매우 중요합니다. 우연의 일치로, 어제 내가 한 일은 당신이 말한 것과 정확히 같습니다.
DawnSong

전체 출력은 어떻게 보입니까?
noobsmcgoobs

xcarchive가 충돌 한 앱 버전이므로 3-5 단계를 건너 뛰었지만 충돌 로그를 부분적으로 나타냅니다.
Declan McKenna

1
사용했던 외부 라이브러리 코드가 아니라 자신의 코드 만 상징합니다.
RPM

7

Xcode 10에서 다음 단계에 따라 동일한 머신의 앱 빌드에서 충돌 로그를 상징하십시오.

  1. Organizer 내부 에서 앱이 기반한 아카이브를 찾습니다.
  2. 디버그 심볼 다운로드 버튼을 클릭하십시오 . 다운로드 폴더에 아무 것도 나타나지 않지만 괜찮습니다.
  3. 빌드 머신을 iOS 디바이스에 연결하십시오.
  4. 장치 및 시뮬레이터 에서 장치를 선택하십시오 .
  5. 장치 로그보기 버튼을 클릭하십시오 .
  6. 충돌 파일을 왼쪽 패널로 끌어서 놓으십시오. 파일은 .crash 확장자로 끝나야 합니다. 그렇지 않으면 드래그가 실패합니다.
  7. 모든 로그 탭으로 전환 하십시오.
  8. 추가 된 충돌 파일을 선택하십시오.
  9. 파일은 자동으로 기호화되어야하며, 그렇지 않으면 마우스 오른쪽 단추 클릭 컨텍스트 메뉴 항목 다시 기호화 로그를 사용하십시오 .

1
처음에는 이것이 다른 게시물에 아무것도 추가하지 않는다고 생각했지만 처음 두 단계, 특히 '디버그 심볼 다운로드'는 내가 놓친 것으로 보입니다. 감사합니다.
Christopher King

6

동일한 하위 폴더에 .dSYM 및 .crash 파일이 있으면 다음 단계를 수행하십시오.

  1. .crash 파일의 역 추적을 보면 두 번째 열의 이진 이미지 이름과 세 번째 열의 주소 (예 : 아래 예의 0x00000001000effdc)를 확인하십시오.
  2. 역 추적 바로 아래 "이진 이미지"섹션에서 이진 이미지 (예 : TheElements)의 이미지 이름, 아키텍처 (예 : arm64) 및로드 주소 (아래 예에서는 0x1000e4000)를 확인하십시오.
  3. 다음을 실행하십시오.

$ atos -arch arm64 -o TheElements.app.dSYM/Contents/Resources/DWARF/TheElements -l 0x1000e4000 0x00000001000effdc -[AtomicElementViewController myTransitionDidStop:finished:context:]

신뢰할 수있는 출처 : https://developer.apple.com/library/content/technotes/tn2151/_index.html#//apple_ref/doc/uid/DTS40008184-CH1-SYMBOLICATE_WITH_ATOS


4

Xcode 11.2.1, 2019 년 12 월

Apple은 충돌 로그를 .txt 형식으로 제공합니다.

**

장치가 연결된 상태에서

**

  • ".txt"파일을 다운로드하고 확장자를 ".crash"로 변경하십시오. 여기에 이미지 설명을 입력하십시오
    • Xcode의 창 탭에서 장치 및 시뮬레이터 열기
    • 장치 선택 및 장치 로그 선택
    • .crash 파일을 장치 로그 창으로 끌어다 놓기

여기에 이미지 설명을 입력하십시오

저기에서 상징적 인 충돌 로그를 볼 수있을 것입니다

Symbolicating 충돌 로그 에 대한 자세한 내용은 링크를 참조하십시오


와. 파일 확장자를 .txt에서 .crash로 변경했습니다. 그들은 나에게 .txt 파일을 주었다. 고마워요 당신의 대답이이 정도라고 믿을 수 없습니다.
datWooWoo

3

Xcode 애플리케이션 이름에 공백이 없는지 확인하십시오. 이것이 나를 위해 작동하지 않은 이유입니다. 그래서 /Applications/Xcode.app동안 작동하는 /Applications/Xcode 6.1.1.app일을하지 않습니다.


시도 했습니까? 그렇지 않은 경우 의견이 의미가 있는지 확인하십시오.
Bouke

1
그것은 내가 말하는 것과 같은 문제가 아닙니다. Xcode는 설치 후 처음 사용하기 전에 이름을 바꿀 수 있습니다. 그러나 기호화 스크립트는 응용 프로그램 이름의 공백을 처리 할 수 ​​없으며 실패합니다.
Bouke

1
@ChuckKrutsinger 실제로 해보셨습니까? 이스케이프 된 공백을 사용하면 스크립트를 실행할 수 있지만 스크립트 자체는 실패합니다. 스크립트는 이스케이프 된 공간이있는 다른 스크립트를 호출하지 않을 수 있습니다.
Bouke 2019

1
@ChuckKrutsinger 매우 훌륭하지만 Xcode가 충돌 로그를 자동으로 상징하기를 원한다면 결국 내 대답이 필요합니다.
Bouke

1
bouke가 정확하고 Xcode 앱의 경로에 공간이 있으면 Xcode가 충돌 로그를 다시 표시하는 데 사용하는 스크립트가 작동하지 않는다는 점을 반복하고 싶습니다. 수동 재 음성화와 관련이 없습니다.
Gary Makin

2

Apple의 문서에서 :

Xcode를 사용하여 충돌 보고서를 상징화 Xcode는 발생하는 모든 충돌 보고서를 자동으로 상징화하려고 시도합니다. 상징화를 위해해야 ​​할 일은 Xcode Organizer에 충돌 보고서를 추가하는 것입니다.

  • iOS 기기를 Mac에 연결
  • "창"메뉴에서 "장치"를 선택하십시오
  • 왼쪽 열의 '기기'섹션에서 기기를 선택합니다
  • 오른쪽 패널의 "장치 정보"섹션에서 "장치 로그보기"버튼을 클릭하십시오.
  • 충돌 보고서를 제시된 패널의 왼쪽 열로 드래그하십시오.
  • Xcode는 충돌 보고서를 자동으로 상징하고 결과를 표시합니다 충돌 보고서를 상징적으로 나타내려면 Xcode는 다음을 찾을 수 있어야합니다.

    1. 충돌하는 응용 프로그램의 이진 및 dSYM 파일

    2. 응용 프로그램이 연결되는 모든 사용자 지정 프레임 워크의 바이너리 및 dSYM 파일 응용 프로그램과 함께 소스에서 작성된 프레임 워크의 경우 해당 dSYM 파일이 응용 프로그램의 dSYM 파일과 함께 아카이브에 복사됩니다. 타사에서 만든 프레임 워크의 경우 작성자에게 dSYM 파일을 요청해야합니다.

    3. 해당 응용 프로그램이 충돌했을 때 실행 중이었던 OS의 기호입니다. 이 기호에는 특정 OS 릴리스 (예 : iOS 9.3.3)에 포함 된 프레임 워크에 대한 디버그 정보가 포함되어 있습니다. OS 기호는 아키텍처에 따라 다릅니다. 64 비트 장치 용 iOS 릴리스에는 armv7 기호가 포함되지 않습니다. Xcode는 Mac에 연결 한 각 장치에서 OS 기호를 자동으로 복사합니다.

이 중 하나라도 누락되면 Xcode가 충돌 보고서를 상징하지 않거나 부분적으로 충돌 보고서를 상징 할 수 있습니다.


2

충돌 로그를 상징하는 가장 쉬운 프로세스 :

  1. 향후 사용을 위해 IPA 빌드 프로세스 중에 구성자로부터 xcarchive 파일을 보존하십시오.
  2. 충돌이 발생하면 영향을받는 장치에서 충돌 로그를 수집하십시오. 확장자는 .crash 여야합니다. 충돌 로그가 .ips 형식 인 경우 이름을 .crash로 바꾸십시오.
  3. 저장된 경로에서 xcarchive를 두 번 클릭하여 Organizer에 표시되도록합니다 (아직없는 경우).
  4. xcode 창에서 열기-> 장치 및 시뮬레이터-> 장치 로그보기-> 모든 로그-> .crash 파일을 끌어다 놓습니다.

5 초 동안 기다립니다. 쾅! 스택 추적의 응용 프로그램 호출이 상징화됩니다! 그래도 여전히 많은 기호를 볼 수 있습니다! 내부 라이브러리 및 프레임 워크 호출입니다.

이것은 가장 쉬운 방법입니다.


1

Apple은 충돌 로그를 .txt 형식으로 제공합니다.

**

장치가 연결된 상태에서

**

  • ".txt"파일을 다운로드하고 확장자를 ".crash"로 변경하십시오. 여기에 이미지 설명을 입력하십시오
    • Xcode의 창 탭에서 장치 및 시뮬레이터 열기
    • 장치 선택 및 장치 로그 선택
    • .crash 파일을 장치 로그 창으로 끌어다 놓기

여기에 이미지 설명을 입력하십시오

저기에서 상징적 인 충돌 로그를 볼 수있을 것입니다

Symbolicating 충돌 로그 에 대한 자세한 내용은 링크를 참조하십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.