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
Defold está bien probado y, en circunstancias normales, debería crashear muy rara vez. Sin embargo, es imposible garantizar que nunca crashee, especialmente si tu juego usa extensiones nativas. Si tienes problemas con crashes o con código nativo que no se comporta como esperas, hay varias formas de avanzar:
La forma más común es ejecutar el código mediante un debugger. Te permite avanzar paso a paso por el código, definir breakpoints y detendrá la ejecución si ocurre un crash.
Hay varios depuradores para cada plataforma.
Cada herramienta puede depurar ciertas plataformas:
La forma más simple de depurar tu código nativo es usar depuración con print. Usa las funciones del namespace dmLog para observar variables o indicar el flujo de ejecución. Usar cualquiera de las funciones de log imprimirá en la vista Console del editor y en el log del juego.
El motor Defold guarda un archivo _crash si ocurre un crash severo. El archivo de crash contendrá información sobre el sistema y sobre el crash. La salida del log del juego escribirá dónde se encuentra el archivo de crash (varía según el sistema operativo, el dispositivo y la aplicación).
Puedes usar el módulo crash para leer este archivo en la sesión siguiente. Se recomienda leer el archivo, recopilar la información, imprimirla en la consola y enviarla a un servicio de analytics que soporte la recopilación de logs de crash.
En Windows también se genera un archivo _crash.dmp. Este archivo es útil al depurar un crash.
Si ocurre un crash en un dispositivo móvil, puedes elegir descargar el archivo de crash a tu propia computadora y analizarlo localmente.
Si la app es debuggable, puedes obtener el log de crash usando la herramienta Android Debug Bridge (ADB) y el comando adb shell:
$ adb shell "run-as com.defold.example sh -c 'cat /data/data/com.defold.example/files/_crash'" > ./_crash
En iTunes, puedes ver/descargar el contenedor de una app.
En la ventana Xcode -> Devices, también puedes seleccionar los logs de crash
Si obtienes un callstack desde un archivo _crash o desde un archivo de log, puedes simbolizarlo. Esto significa traducir cada dirección del callstack a un nombre de archivo y número de línea, lo que a su vez ayuda a encontrar la causa raíz.
Es importante que hagas coincidir el motor correcto con el callstack; de lo contrario, es muy probable que termines depurando cosas incorrectas. Usa la opción --with-symbols al crear el bundle con bob o marca el checkbox “Generate debug symbols” en el diálogo de bundle del editor:
dmengine.dSYM.zip en build/arm64-ios contiene los símbolos de depuración para builds de iOS.dmengine.dSYM.zip en build/x86_64-macos contiene los símbolos de depuración para builds de macOS.projecttitle.apk.symbols/lib/ contiene los símbolos de depuración para las arquitecturas objetivo.dmengine.pdb en build/x86_64-win32 contiene los símbolos de depuración para builds de Windows.dmengine.js.symbols en build/wasm-web contiene los símbolos de depuración para builds de HTML5.Es muy importante que guardes los símbolos de depuración en algún lugar para cada release pública que hagas de tu juego y que sepas a qué release pertenecen esos símbolos de depuración. No podrás depurar ningún crash nativo si no tienes los símbolos de depuración. Además, deberías conservar una versión sin strip (unstripped) del motor. Esto permite la mejor simbolización del callstack.
Puedes subir los símbolos de depuración a Google Play para que cualquier crash registrado en Google Play muestre callstacks simbolizados. Comprime en un zip el contenido de la carpeta de salida del bundle projecttitle.apk.symbols/lib/. La carpeta incluye una o más subcarpetas con nombres de arquitectura como arm64-v8a y armeabi-v7a.
$ ls <project>/build/<platform>/[lib]dmengine[.exe|.so]
$ unzip dmengine.apk -d dmengine_1_2_105
Busca la dirección del callstack
P. ej., en el callstack sin simbolizar podría verse así
#00 pc 00257224 libmy_game_name.so
Donde 00257224 es la dirección
Resuelve la dirección
$ arm-linux-androideabi-addr2line -C -f -e dmengine_1_2_105/lib/armeabi-v7a/libdmengine.so _address_
Nota: Si obtienes un stack trace desde los logs de Android, podrías simbolizarlo usando ndk-stack
.dSYM) (pasa --with-symbols a bob.jar) $ unzip <project>/build/arm64-darwin/build.zip
# producirá Contents/Resources/DWARF/dmengine
$ wget http://d.defold.com/archive/<sha1>/engine/arm64-darwin/dmengine.dSYM
Simboliza usando la dirección de carga
Por alguna razón, poner simplemente la dirección del callstack no funciona (es decir, dirección de carga 0x0)
$ atos -arch arm64 -o Contents/Resources/DWARF/dmengine 0x1492c4
# Especificar la dirección de carga directamente tampoco funciona
$ atos -arch arm64 -o MyApp.dSYM/Contents/Resources/DWARF/MyApp -l0x100000000 0x1492c4
Sumar la dirección de carga a la dirección funciona:
$ atos -arch arm64 -o MyApp.dSYM/Contents/Resources/DWARF/MyApp 0x1001492c4
dmCrash::OnCrash(int) (in MyApp) (backtrace_execinfo.cpp:27)