首页 > Unity > Unity3D > Unity卡死时的调试方法
2016
07-08

Unity卡死时的调试方法

有时候Unity运行时会闪退,这时我们可以查看log定位原因。但有时候Unity运行游戏时会出现卡死无响应的情况,此时包括控制台和日志都无法查到任何信息,大多数情况下这是死循环导致的。

比如如下代码,在游戏运行时会导致Unity无响应:

Unity卡死时的调试方法 - 第1张  | Atlantis技术博客

Unity卡死时的调试方法 - 第2张  | Atlantis技术博客

四核CPU,25%表示单核100%

接下来我们就需要定位死循环在我们代码中的具体位置,有两种方式:

1.用Visual Studio或者MonoDevelop调试Unity:

这里用Visual Studio 2013来Attach到Unity进程进行调试,如果这种卡死是必现的,我们可以先杀掉unity进程重启然后vs2013attach到unity进程上,当重现卡死时,点击Break All按钮,在Thread下拉列表中会看到:

Unity卡死时的调试方法 - 第3张  | Atlantis技术博客

 

此时我们并不知道哪个是主线程,可以一个一个选中试下,当选168427224中这个线程时:

 

就可以定位到出问题代码的位置了

Unity卡死时的调试方法 - 第4张  | Atlantis技术博客

2.用Windbg调试Unity:

如果卡死的情况很难重现或者不是死循环造成话我们就很难用第一种方法来定位了,此时可以打开windbg,attach到unity进程上,设置好symbol路径:

Unity卡死时的调试方法 - 第5张  | Atlantis技术博客

输入命令!runaway:

Unity卡死时的调试方法 - 第6张  | Atlantis技术博客

第一个的Time最高,输入命令~0 s切换到第一个线程,然后输入命令kv显示堆栈:

Unity卡死时的调试方法 - 第7张  | Atlantis技术博客

可以定位到出问题的应该是RayCast或者LineCast的地方,结合代码及考虑到有出现循环的地方便可定位到了。

卡死也不一定都是死循环导致的,此时可以结合堆栈及进一步的汇编分析定位道出问题的地方,汇编分析技术难度较高,具体可参考:

http://blog.csdn.net/yxriyin/article/details/43273387

 

PS:调试Unity4.x需要装32位的windbg,调试Unity5.x需要装64位的windbg

 

最后编辑:
作者:maosongliang
这个作者貌似有点懒,什么都没有留下。