编辑器在Unity中冻结。如果您构建程序(用于 wine),那么它也会挂起(无响应)。我找不到原因:我无限次地执行相同的操作然后冻结。我breakpoint不能发布它,因为我不知道该把它放在哪里。在我看来,它挂在单元脚本的某个地方。
如何获取程序挂起的位置?是否有可能看到某种日志,其中写出了程序的所有操作?我认为在某个地方获得了无限循环,尽管我检查了所有循环......
谢谢!
编辑器在Unity中冻结。如果您构建程序(用于 wine),那么它也会挂起(无响应)。我找不到原因:我无限次地执行相同的操作然后冻结。我breakpoint不能发布它,因为我不知道该把它放在哪里。在我看来,它挂在单元脚本的某个地方。
如何获取程序挂起的位置?是否有可能看到某种日志,其中写出了程序的所有操作?我认为在某个地方获得了无限循环,尽管我检查了所有循环......
谢谢!
至少有三种解决方案(如果还有其他解决方案,请告诉我):两种快速解决方案和一种长期解决方案。而且,长的是专门和Visual Studio连接的(为什么微软不能把一切都简单化?)
最快(但经济成本高)
您需要转到UnityAssetStore并找到一个名为Panic Button的资产。它在Editor Extensions/System下。目前,该资产位于此处。
他在做什么?当应用程序在无限循环中旋转并且Unity界面挂起时,只需按一下键Shift + Esc,主线程就会“中断”,界面就会挂起。在这种情况下,播放暂停,问题区域显示在控制台中:
它究竟是如何工作的?里面发生了什么?最有可能的是,将在第 3 段中描述的内容仅以打包在 dll 中的脚本形式(这样就没有人看到代码😆)连接到项目。
使用MonoDevelop
步骤是:
Play:-)转到MonoDevelop并单击
Run→Attach To Process在出现的窗口中,选择Unity并单击
AttachPause在MonoDevelop中单击按钮Mono 已经在有问题的地方停下来并突出显示
StackTrace现在剩下的就是将它
Breakpoint放在线上,更改进入无限循环的值(例如,在这种情况下,将值分配给 i 20),然后按Continue Execution松了一口气。
使用视觉工作室
脚步:
我们写一个无限循环的脚本,把它挂在对象上然后点击
Play:-)例如脚本是:
我们转到Visual Studio,单击菜单
Debug→并Attach to Process从进程列表中选择Unity。注意(!):准确地说
Attach to Process,不是Attach To Unity然后按
Debug→Break all停止进程您需要找到一个反汇编视图(如果它没有自动出现)。理论上,在 StackTrace 选项卡上,如果双击ЛКМ,会出现一个窗口,您可以在其中单击查看反汇编链接
并通过堆栈到达挂点。下面的动画应该完整地展示了如何到达那里:
结果,我们得到类似下图的东西:
几乎是无限循环。
实际上,代码可能更复杂,很难快速理解那里发生了什么,但你不能深入研究太多,因为有一个小技巧(见下一步):
F10 - сделать шаг в отладке, не заходя в функцию/метод. Соответственно, теперь пошагово нажимаем F10, пока не перелетим со строки
000000001015A758 jmp 000000001015A743на строку с инструкциейcmp dword ptr [r11], 0.В итоге во вкладке
Autosв Visual Studio должны появится данные значения:Теперь просто меняем значение "переменной" R11 на ноль (0)
Так как мы стоим на адресе
cmp, то при попытки исполнить инструкцию, она попытается прочитать address 0, что, в свою очередь, сгенерирует ошибку. Что мы делаем: Нажимаем F5 (продолжить выполнение программы), а затем во всплывающем окне выбираемContinue.В теории, Unity должна ожить и плюнуть в консоль ошибку, указав, где была загвоздка:
Вздохнуть с облегчением.
PS Visual Studio的方法借鉴了Unity博客。您还可以阅读为什么该方法在那里起作用。