最近在写 BUG 时经常发现 Unity 编辑器停止响应或卡死不动,凭借多年写 BUG 的经验判断,肯定是哪里有个死循环卡住了主线程。

模拟死循环

死循环(endless loop)是一种奇特的生物,它终日潜伏在年久失修的历史代码中,静静地等待出山的机会。

某天,当你无意间修改了某个参数,潜伏已久的死循环就立刻跳出来,让你措手不及。下面是一个造成死循环的例子:

[ContextMenu("test")]
public void StartEndlessLoop()
{
   StartCoroutine(endlessLoop());
}

IEnumerator endlessLoop()
{
    yield return 0;
    while (true)
    {
        //yield return new WaitForSeconds(1f);
        //死循环爬 fk endless loop
    }
}

执行StartEndlessLoop方法后,惊喜的一幕发生了,没错,Unity Editor 停止响应:

使用VS找出死循环

  1. 首先保证 VS 安装了Visual Studio Tools For Unity扩展。
  2. 点击 VS 上方的附加到Unity,将解决方案附加到 Unity:

  3. 点击调试->窗口->线程,打开线程调试面板:

  4. 在 Unity Editor 中点击 Play,并执行上面的死循环代码:

  5. Editor 停止响应后,点击 VS 上的全部中断按钮,中断调试:

  6. 在线程窗口中可以见到当前调用的语句,即为死循环位置:

  7. 双击线程窗口中的位置一栏,自动跳转到脚本代码执行位置:

总结

BUG 爱你。

梓喵出没博客(azimiao.com)版权所有,转载请注明链接:https://www.azimiao.com/7496.html
欢迎加入梓喵出没博客交流群:313732000

我来吐槽

*

*