Análise de falhas em iOS/macOS/visionOS
Sobre falhas em nativo (iOS/macOS), Unity (iOS/macOS/visionOS) e Unity Editor (macOS), consulte as instruções abaixo.
Obtenção da localização da falha durante o desenvolvimento
As informações necessárias para depuração no XCode são mostradas na figura abaixo.

Ao digitar bt no lldb, você pode obter a causa da falha e a pilha de execução do código, conforme abaixo:
(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
Quando o conteúdo relacionado a easyar ou libEasyAR.dylib existe na pilha de execução do código, isso pode indicar que a falha está relacionada ao EasyAR; se não existir, há uma grande probabilidade de que a falha não esteja relacionada ao EasyAR.
Ao digitar image list easyar ou image list libEasyAR.dylib no lldb, você pode obter o endereço de carregamento da biblioteca dinâmica, conforme abaixo:
(lldb) image list easyar
[ 0] DF06BDD8-A8AF-3982-897D-A906EE229A4F 0x0000000105730000 /Users/
Obtenção da localização da falha durante o desenvolvimento (Unity)
Ao desenvolver aplicativos com Unity, você também pode usar os logs do Unity para analisar falhas.
Os logs do Unity são divididos em logs do Unity Editor e logs do Unity Player, que podem ser obtidos pelos seguintes métodos.
| Ambiente Unity | Sistema operacional | Localização do log |
|---|---|---|
| Editor | macOS | ~/Library/Logs/Unity/Editor.log |
| Player | iOS | Usando o console lldb do XCode |
| Player | macOS | ~/Library/Logs/Company Name/Product Name/Player.log |
Os logs do editor também podem ser abertos pelo comando Open Editor Log no menu superior direito da janela Console.
Exceções gerenciadas (C#) podem ser visualizadas na janela Console do Unity Editor (Window -> General -> Console no menu principal do Unity).
Obtenção da localização da falha após a publicação
Após a publicação, também podem ocorrer falhas. Neste caso, visualize os logs de falhas através do dispositivo em Privacy - Analytics & Improvements - Analytic Data ou colete logs de falhas através do TestFlight e App Store coletando relatórios de falhas.
Aqui está um exemplo de falha:
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: Fila de despacho: com.apple.main-thread
Thread 0 falhou:
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
...
Imagens binárias:
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
Entre eles, a pilha de código que contém easyar é:
2 easyar 0x0000000102fba7c0 0x1028b4000 + 7366592
3 easyar 0x0000000102e7627c 0x1028b4000 + 6038140
4 easyar 0x0000000102e452e8 0x1028b4000 + 5837544
Aqui, 0x0000000102fba7c0 é o endereço virtual do código na memória, 0x1028b4000 é o endereço de carregamento do módulo easyar, e 7366592 é o deslocamento.
Na seção Binary Images, também é possível ver que 0x1028b4000 é o endereço de carregamento do módulo easyar.
É importante notar que as informações de falha devem conter ambas as partes: a pilha de execução do código e o endereço de carregamento do módulo. Devido ao ASLR (randomização do layout do espaço de endereço), o endereço de carregamento do módulo da biblioteca dinâmica pode mudar a cada execução, fazendo com que o endereço do código também mude dinamicamente. Somente conhecendo o valor relativo entre o endereço do código na pilha de código e o endereço de carregamento da biblioteca dinâmica, é possível saber em que local o programa falhou.
Quando a pilha de código contém conteúdo relacionado a easyar ou libEasyAR.dylib, isso pode indicar que a falha está relacionada ao EasyAR; se não existir, há uma grande probabilidade de que a falha não esteja relacionada ao EasyAR.
Outras informações relacionadas a falhas
Número de versão do EasyAR Sense e EasyAR Sense Unity Plugin
Por exemplo: 4.7.0.11800-cf8e24e30
Edição Community/Enterprise
Plataforma e arquitetura da CPU
iOS
arm64
macOS
x86_64/arm64
visionOS
arm64