系统崩溃
系统崩溃检查表
禁用代码剥离(并在 iOS 设备上设置“因异常而减慢 (slow with exceptions)”)
按照优化所创建的 iOS 播放器大小说明 (iphone-playerSizeOptimization.html),确保游戏不会在 iOS 上因代码剥离而崩溃。
验证崩溃不是由内存不足所引起(重新启动设备,将设备的最大 RAM 用于该平台,务必观察日志信息)
编辑器上的 Editor.log
调试消息、警告和错误都出现在控制台上。同时 Unity 会将状态报告输出到控制台,包括加载资源、初始化 mono、图形驱动器信息。
如果想了解目前的情况,请查看 editor.log。您将在该日志中看到所有内容,而非只有控制台部分。尝试了解目前的情况,并查看编码部分的完整日志。这样有助于找出导致 Unity 崩溃的理由或资源存在的问题。
Unity 也在设备上输出一些事项;安卓 (Android) 系统的 Logcat 控制台和 iOS 系统的 Xcode gdb 控制台
Android
使用 DDMS 或 ADB 工具
观察堆栈轨迹(安卓 (Android) 3 或更新版本)。使用 c++filt(ndk 的一部分)或其他方法,如:http://slush.warosu.org/c++filtjs 来解码损坏的函数调用
查看出现崩溃的 .so 文件:
libunity.so - Unity 代码或用户代码出现崩溃。
libdvm.so - Java 世界 Dalvik 虚拟机的某个位置出现崩溃。找出 Dalvik 虚拟机的堆栈轨迹,查看 JNI 代码或 Java 相关的任何内容(包括可能对 AndroidManifest.xml 作出的更改)。
libmono.so ? Mono 错误或正在进行 Mono 非常厌恶的事项。
如果 crashlog 没有帮助,可以反汇编,大致了解已发生的事件。
使用 Android NDK 中的 ARM EABI 工具,如:objdump.exe -S libmono.so >> out.txt
在电脑堆栈轨迹中查看代码。
尝试在最新的 out.txt 文件中匹配代码。
向上滚动,了解出现崩溃的函数发生了什么。
iOS
Xcode 带内置工具。Xcode 4 带非常不错的 GUI 来调试系统崩溃情况,Xcode 3 版本的稍差些。
完整的 gdb 栈 - 线程应用所有的 bt
启用空值软检查 (soft-null-check):
启用开发构建和脚本调试。这时未捕获到的空引用异常将通过适当的托管调用栈输出到 Xcode 控制台。
尝试关闭“快速脚本调用 (fast script call)” 和代码剥离。这样能阻止一些随机崩溃,如一些由于使用罕用的 .Net 函数或映像所导致的崩溃。
策略
尝试找出出现崩溃的脚本,并在设备上使用 Mono Develop 进行调试。
如果崩溃似乎不是在脚本中,请仔细查看堆栈轨迹,其中应该会有一些发生情况的提示。复制并提交,我们会仔细查看。