iOS/macOS/visionOS에서의 크래시 분석
네이티브(iOS/macOS), Unity(iOS/macOS/visionOS) 및 Unity 에디터(macOS)에서의 크래시에 대해서는 아래 설명을 참조하십시오.
개발 중 크래시 위치 획득
XCode에서 디버깅 시 필요한 정보는 아래 그림과 같습니다.

lldb에 bt를 입력하면 크래시 원인과 코드 실행 스택을 얻을 수 있습니다. 예시는 다음과 같습니다.
(lldb) bt
* thread #11, stop reason = EXC_BAD_ACCESS (code=1, address=0x9c40)
* frame #0: 0x00000001057e7cb0 easyar`___lldb_unnamed_symbol2693$$easyar + 6984
frame #1: 0x00000001057e5e14 easyar`___lldb_unnamed_symbol2692$$easyar + 276
frame #2: 0x00000001057e2500 easyar`___lldb_unnamed_symbol2532$$easyar + 360
frame #3: 0x00000001f3d60bfc libsystem_pthread.dylib`_pthread_start + 320
코드 실행 스택에 easyar 또는 libEasyAR.dylib 관련 내용이 존재하는 경우, 크래시가 EasyAR와 관련이 있을 수 있습니다; 존재하지 않는다면 크래시가 EasyAR와 관련이 없을 가능성이 높습니다.
lldb에 image list easyar 또는 image list libEasyAR.dylib를 입력하면 동적 라이브러리 로드 주소를 얻을 수 있습니다. 예시는 다음과 같습니다.
(lldb) image list easyar
[ 0] DF06BDD8-A8AF-3982-897D-A906EE229A4F 0x0000000105730000 /Users/<user>/Library/Developer/Xcode/DerivedData/helloar-bpvpobshgxnnwwdiryfjufioysag/Build/Products/Debug-iphoneos/helloar.app/Frameworks/easyar.framework/easyar
개발 중 크래시 위치 획득 (Unity)
Unity로 애플리케이션을 개발할 때는 Unity 로그를 사용하여 크래시를 분석할 수도 있습니다.
Unity 로그는 Unity 에디터 로그와 Unity 플레이어 로그로 구분되며, 아래 방법으로 획득할 수 있습니다.
| Unity 환경 | 운영체제 | 로그 위치 |
|---|---|---|
| 에디터 | macOS | ~/Library/Logs/Unity/Editor.log |
| 플레이어 | iOS | XCode의 lldb 콘솔 사용 |
| 플레이어 | macOS | ~/Library/Logs/Company Name/Product Name/Player.log |
에디터 로그는 Console 창 우측 상단 메뉴의 Open Editor Log 명령으로도 열 수 있습니다.
관리 예외(C#)는 Unity 에디터의 Console 창(Window -> General -> Console)에서 확인할 수 있습니다.
출시 후 크래시 위치 획득
출시 후에도 크래시가 발생할 수 있습니다. 이 경우 기기의 Privacy - Analytics & Improvements - Analytic Data에서 확인하거나 TestFlight 및 App Store를 통해 크래시 로그를 수집할 수 있습니다.
다음은 충돌 사례입니다:
Incident Identifier: 5916E252-D8C2-43C3-B583-7E38399597C9
CrashReporter Key: 2075d595d8d96cf07913a12798d5e0aba79c5358
Hardware Model: iPhone9,2
Process: ARManualEditorDemo [2352]
Path: /private/var/containers/Bundle/Application/ED9F6959-612A-4595-A7B9-3F573B5097DD/ARManualEditorDemo.app/ARManualEditorDemo
Identifier: cn.easyar.demo.ARManualEditor
Version: 6 (2.0.1)
Code Type: ARM-64 (Native)
Role: Non UI
Parent Process: launchd [1]
Coalition: cn.easyar.demo.ARManualEditor [1831]
Date/Time: 2019-09-17 16:21:13.1246 +0800
Launch Time: 2019-09-17 16:08:08.3605 +0800
OS Version: iPhone OS 12.4 (16G77)
Baseband Version: 5.70.01
Report Version: 104
Exception Type: EXC_BREAKPOINT (SIGTRAP)
Exception Codes: 0x0000000000000001, 0x000000019d7e86fc
Triggered by Thread: 0
Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0 JavaScriptCore 0x000000019d7e86fc WTFCrashWithInfo+ 2471676 (int, char const*, char const*, int) + 20
1 JavaScriptCore 0x000000019dd85da0 llint_slow_path_get_by_val + 6032
2 JavaScriptCore 0x000000019d7a25cc llint_entry + 34380
...
13 JavaScriptCore 0x000000019d799cec vmEntryToJavaScript + 268
14 JavaScriptCore 0x000000019dccb4d0 JSC::Interpreter::executeCall+ 7595216 (JSC::ExecState*, JSC::JSObject*, JSC::CallType, JSC::CallData const&, JSC::JSValue, JSC::ArgList const&) + 424
15 JavaScriptCore 0x000000019dead560 JSC::profiledCall+ 9569632 (JSC::ExecState*, JSC::ProfilingReason, JSC::JSValue, JSC::CallType, JSC::CallData const&, JSC::JSValue, JSC::ArgList const&) + 188
16 JavaScriptCore 0x000000019d7df170 JSObjectCallAsFunction + 376
17 EasyARPlayer 0x000000010353d284 0x10326c000 + 2953860
18 EasyARPlayer 0x000000010363c880 0x10326c000 + 3999872
19 EasyARPlayer 0x000000010364ee1c 0x10326c000 + 4075036
20 EasyARPlayer 0x0000000103295388 0x10326c000 + 168840
21 GLKit 0x00000001a337b91c -[GLKView _display:] + 256
...
33 libdyld.dylib 0x0000000195e468e0 start + 4
...
Thread 8:
0 libsystem_kernel.dylib 0x0000000195f92ee4 __psynch_cvwait + 8
1 libsystem_pthread.dylib 0x000000019600dcf8 _pthread_cond_wait$VARIANT$mp + 636
2 easyar 0x0000000102fba7c0 0x1028b4000 + 7366592
3 easyar 0x0000000102e7627c 0x1028b4000 + 6038140
4 easyar 0x0000000102e452e8 0x1028b4000 + 5837544
5 libsystem_pthread.dylib 0x00000001960152c0 _pthread_body + 128
6 libsystem_pthread.dylib 0x0000000196015220 _pthread_start + 44
7 libsystem_pthread.dylib 0x0000000196018cdc thread_start + 4
...
Binary Images:
0x1023e4000 - 0x1024f3fff ARManualEditorDemo arm64 <0fb0d9b7d18c3e2ebf44e950a68af61f> /var/containers/Bundle/Application/ED9F6959-612A-4595-A7B9-3F573B5097DD/ARManualEditorDemo.app/ARManualEditorDemo
...
0x1028b4000 - 0x10310bfff easyar arm64 <cb52ccf821e33255a0c30ca2422d2862> /var/containers/Bundle/Application/ED9F6959-612A-4595-A7B9-3F573B5097DD/ARManualEditorDemo.app/Frameworks/easyar.framework/easyar
...
EOF
easyar를 포함하는 코드 스택 예시:
2 easyar 0x0000000102fba7c0 0x1028b4000 + 7366592
3 easyar 0x0000000102e7627c 0x1028b4000 + 6038140
4 easyar 0x0000000102e452e8 0x1028b4000 + 5837544
여기서 0x0000000102fba7c0는 메모리에서의 코드 가상 주소이고, 0x1028b4000는 easyar의 모듈 로드 주소이며, 7366592는 오프셋입니다.
Binary Images 섹션에서도 0x1028b4000가 easyar의 모듈 로드 주소임을 확인할 수 있습니다.
크래시 정보에는 반드시 코드 실행 스택과 모듈 로드 주소 두 부분의 정보가 포함되어야 합니다. ASLR(주소 공간 배치 난수화)로 인해 동적 라이브러리 모듈의 로드 주소는 실행마다 달라질 수 있어 코드 주소도 동적으로 변합니다. 코드 스택 내의 코드 주소와 동적 라이브러리 모듈 로드 주소 간의 상대값을 알아야만 프로그램의 어느 위치에서 크래시가 발생했는지 알 수 있습니다.
코드 실행 스택에 easyar 또는 libEasyAR.dylib 관련 내용이 존재하는 경우, 크래시가 EasyAR와 관련이 있을 수 있습니다; 존재하지 않는다면 크래시가 EasyAR와 관련이 없을 가능성이 높습니다.
기타 크래시 관련 정보
EasyAR Sense 및 EasyAR Sense Unity Plugin 버전 번호
예: 4.7.0.11800-cf8e24e30
커뮤니티 에디션/기업용 에디션
플랫폼 및 CPU 아키텍처
iOS
arm64
macOS
x86_64/arm64
visionOS
arm64