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 几经测试鲜有崩溃情况出现. 但是崩溃这种事谁能保证永远避免, 尤其是游戏中还使用了原生扩展代码的情况下. 要是游戏崩溃或者原生代码出错请从下面几方面入手检查:
首先推荐使用 调试器
. 使用它步进代码, 设置 断点
最重要的是游戏崩溃时会自动暂停.
不同平台调试器有很多.
每个工具可以调试的应用如下:
调试最简单的方法就是使用 print 函数. 位于 dmLog 命名空间 下的 print 函数可以用来检查变量值或者用来检查程序执行流程. 它可以在 控制台 视图和 游戏日志 中输出数据.
崩溃时, Defold 引擎保存了一个 _crash
日志文件. 其中包含了系统信息与崩溃信息. 其存放位置参考 游戏日志输出 (不同设备, 系统, 位置不同).
可以使用 崩溃模块 帮助分析这个文件. 推荐你阅读, 收集信息, 打印信息到控制台, 然后把信息发送到 第三方分析服务 上去.
在 Windows 上还有个 _crash.dmp
文件被创建. 这个文件在调试崩溃时很有用.
手机上的崩溃日志可以下载到本地以便查看.
如果应用是 可调式的, 就可以使用 Android Debug Bridge (ADB) 工具 和 adb shell
命令得到崩溃日志:
$ adb shell "run-as com.defold.example sh -c 'cat /data/data/com.defold.example/files/_crash'" > ./_crash
在 iTunes 里, 可以下载 app 容器.
在 Xcode -> Devices
窗口中也能获取到崩溃日志.
从 _crash
文件或者 日志文件, 都可以进行代码文件映射. 即把调用堆栈里的每个地址映射到文件名和代码行, 利于寻找代码的问题.
注意引擎版本要选择正确. 不然映射会错乱. 使用 bob 编译时命令行加入 –with-symbols 或者在编辑器打包对话框里点选 “Generate debug symbols”:
build/arm64-ios
下的 dmengine.dSYM.zip
中包含有 iOS 编译用 debug symbols.build/x86_64-macos
下的 dmengine.dSYM.zip
中包含有 macOS 编译用 debug symbols.projecttitle.apk.symbols/lib/
下包含有各架构编译用 debug symbols.build/x86_64-win32
下的 dmengine.pdb
中包含有 Windows 编译用 debug symbols.build/js-web
或 build/wasm-web
下的 dmengine.js.symbols
中包含有 HTML5 编译用 debug symbols.对于游戏的每个发布版本一定要保留一套对应的调试数据. 不然的话原生扩展上线以后出错误就没法调试! 为了方便查看调用堆栈, 也要保存好对应的游戏引擎.
可以 上传 debug symbols 到 Google Play 以便让 Google Play 上的崩溃日志显示可读的调用堆栈. 详情请见 原生代码调试教程.
从编译文件夹下找到引擎文件
$ ls
解压引擎:
$ unzip dmengine.apk -d dmengine_1_2_105
找到地址
例如下面这个文件
#00 pc 00257224 libmy_game_name.so
其中 00257224 就是地址
映射地址
$ arm-linux-androideabi-addr2line -C -f -e dmengine_12_105/lib/armeabi-v7a/libdmengine.so _address
注意: 要是从 Android 日志 获取的调用堆栈数据, 可能需要使用 ndk-stack 进行地址解析
如果使用了原生扩展, 服务器会为你提供映射数据 (.dSYM) 文件 (使用 bob.jar 连同 --with-symbols
参数)
$ unzip
如果没用原生扩展, 直接下载映射文件:
$ wget http://d.defold.com/archive/
地址映射
不能直接使用堆栈里的地址 (比如载入地址 0x0)
$ atos -arch arm64 -o Contents/Resources/DWARF/dmengine 0x1492c4
# 也不能作为参数加入载入地址
$ atos -arch arm64 -o MyApp.dSYM/Contents/Resources/DWARF/MyApp -l0x100000000 0x1492c4
二者相加才可以:
$ atos -arch arm64 -o MyApp.dSYM/Contents/Resources/DWARF/MyApp 0x1001492c4
dmCrash::OnCrash(int) (in MyApp) (backtrace_execinfo.cpp:27)
Did you spot an error or do you have a suggestion? Please let us know on GitHub!
GITHUB