This translation is community contributed and may not be up to date. We only maintain the English version of the documentation. Read this manual in English
O Defold é bem testado e deve travar muito raramente em circunstâncias normais. No entanto, é impossível garantir que ele nunca travará, especialmente se seu jogo usa extensões nativas. Se você encontrar problemas com travamentos ou código nativo que não se comporta como esperado, há várias formas de avançar:
A forma mais comum é executar o código por meio de um debugger. Ele permite percorrer o código passo a passo, definir breakpoints e interromperá a execução se ocorrer um travamento.
Há vários depuradores para cada plataforma.
Cada ferramenta pode depurar certas plataformas:
A forma mais simples de depurar seu código nativo é usar print debugging. Use as funções no namespace dmLog para observar variáveis ou indicar o fluxo de execução. Usar qualquer uma das funções de log imprimirá na visualização Console do editor e no log do jogo.
A engine Defold salva um arquivo _crash se ocorrer um hard crash. O arquivo de crash conterá informações sobre o sistema e sobre o travamento. A saída do log do jogo escreverá onde o arquivo de crash está localizado (isso varia conforme sistema operacional, dispositivo e aplicação).
Você pode usar o módulo crash para ler esse arquivo na sessão seguinte. Recomenda-se ler o arquivo, coletar as informações, imprimi-las no console e enviá-las para um serviço de analytics que ofereça suporte à coleta de logs de travamento.
No Windows, um arquivo _crash.dmp também é gerado. Esse arquivo é útil ao depurar um travamento.
Se um travamento acontecer em um dispositivo móvel, você pode optar por baixar o arquivo de crash para seu próprio computador e analisá-lo localmente.
Se o app for debuggable, você pode obter o log de travamento usando a ferramenta Android Debug Bridge (ADB) e o comando adb shell:
$ adb shell "run-as com.defold.example sh -c 'cat /data/data/com.defold.example/files/_crash'" > ./_crash
No iTunes, você pode visualizar/baixar o container de um app.
Na janela Xcode -> Devices, você também pode selecionar os logs de travamento.
Se você obtiver uma callstack de um arquivo _crash ou de um arquivo de log, poderá simbolicá-la. Isso significa traduzir cada endereço na callstack para um nome de arquivo e número de linha, o que por sua vez ajuda a encontrar a causa raiz.
É importante que você combine a engine correta com a callstack; caso contrário, é muito provável que você acabe depurando coisas incorretas. Use a flag --with-symbols ao empacotar com Bob ou marque a checkbox “Generate debug symbols” na caixa de diálogo de empacotamento do editor:
dmengine.dSYM.zip em build/arm64-ios contém os símbolos de debug para builds iOS.dmengine.dSYM.zip em build/x86_64-macos contém os símbolos de debug para builds macOS.projecttitle.apk.symbols/lib/ contém os símbolos de debug para as arquiteturas-alvo.dmengine.pdb em build/x86_64-win32 contém os símbolos de debug para builds Windows.dmengine.js.symbols em build/js-web ou build/wasm-web contém os símbolos de debug para builds HTML5.É muito importante que você salve os símbolos de debug em algum lugar para cada release pública do seu jogo e que saiba a qual release os símbolos de debug pertencem. Você não conseguirá depurar nenhum travamento nativo se não tiver os símbolos de debug. Além disso, mantenha uma versão não stripped da engine. Isso permite a melhor simbolicação da callstack.
Você pode enviar os símbolos de debug para o Google Play para que quaisquer travamentos registrados no Google Play mostrem call stacks simbolicadas. Compacte o conteúdo da pasta de saída de pacote projecttitle.apk.symbols/lib/. A pasta inclui uma ou mais subpastas com nomes de arquitetura, como arm64-v8a e armeabi-v7a.
$ ls <project>/build/<platform>/[lib]dmengine[.exe|.so]
$ unzip dmengine.apk -d dmengine_1_2_105
Encontre o endereço da callstack
Por exemplo, na callstack não simbolicada, poderia aparecer assim:
#00 pc 00257224 libmy_game_name.so
Onde 00257224 é o endereço
Resolva o endereço
$ arm-linux-androideabi-addr2line -C -f -e dmengine_1_2_105/lib/armeabi-v7a/libdmengine.so _address_
Observação: se você obtiver um stack trace dos logs do Android, talvez consiga simbolicá-lo usando ndk-stack
--with-symbols para bob.jar) $ unzip <project>/build/arm64-darwin/build.zip
# it will produce a Contents/Resources/DWARF/dmengine
$ wget http://d.defold.com/archive/<sha1>/engine/arm64-darwin/dmengine.dSYM
Simbolique usando o endereço de carregamento
Por algum motivo, simplesmente colocar o endereço da callstack não funciona (isto é, endereço de carregamento 0x0)
$ atos -arch arm64 -o Contents/Resources/DWARF/dmengine 0x1492c4
# Nem especificar diretamente o endereço de carregamento
$ atos -arch arm64 -o MyApp.dSYM/Contents/Resources/DWARF/MyApp -l0x100000000 0x1492c4
Adicionar o endereço de carregamento ao endereço funciona:
$ atos -arch arm64 -o MyApp.dSYM/Contents/Resources/DWARF/MyApp 0x1001492c4
dmCrash::OnCrash(int) (in MyApp) (backtrace_execinfo.cpp:27)