RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 606738
Accepted
Valera Kvip
Valera Kvip
Asked:2020-12-23 00:30:25 +0000 UTC2020-12-23 00:30:25 +0000 UTC 2020-12-23 00:30:25 +0000 UTC

调试挂起的 VS 应用程序

  • 772

编辑器在Unity中冻结。如果您构建程序(用于 wine),那么它也会挂起(无响应)。我找不到原因:我无限次地执行相同的操作然后冻结。我breakpoint不能发布它,因为我不知道该把它放在哪里。在我看来,它挂在单元脚本的某个地方。

如何获取程序挂起的位置?是否有可能看到某种日志,其中写出了程序的所有操作?我认为在某个地方获得了无限循环,尽管我检查了所有循环......

谢谢!

c#
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Алексей Шиманский
    2020-12-23T17:31:50Z2020-12-23T17:31:50Z

    至少有三种解决方案(如果还有其他解决方案,请告诉我):两种快速解决方案和一种长期解决方案。而且,长的是专门和Visual Studio连接的(为什么微软不能把一切都简单化?)


    最快(但经济成本高)

    您需要转到UnityAssetStore并找到一个名为Panic Button的资产。它在Editor Extensions/System下。目前,该资产位于此处。

    他在做什么?当应用程序在无限循环中旋转并且Unity界面挂起时,只需按一下键Shift + Esc,主线程就会“中断”,界面就会挂起。在这种情况下,播放暂停,问题区域显示在控制台中:

    在此处输入图像描述

    它究竟是如何工作的?里面发生了什么?最有可能的是,将在第 3 段中描述的内容仅以打包在 dll 中的脚本形式(这样就没有人看到代码😆)连接到项目。


    使用MonoDevelop

        步骤是:

    • 我们写一个无限循环的脚本,把它挂在对象上然后点击Play:-)
    • 转到MonoDevelop并单击Run→Attach To Process

      在此处输入图像描述

    • 在出现的窗口中,选择Unity并单击Attach

      在此处输入图像描述

    • Pause在MonoDevelop中单击按钮

      在此处输入图像描述

    • Mono 已经在有问题的地方停下来并突出显示StackTrace

      在此处输入图像描述

    • 现在剩下的就是将它Breakpoint放在线上,更改进入无限循环的值(例如,在这种情况下,将值分配给 i 20),然后按Continue Execution

      在此处输入图像描述

    • 松了一口气。


    使用视觉工作室

        脚步:

    • 我们写一个无限循环的脚本,把它挂在对象上然后点击Play:-)

      例如脚本是:

      using UnityEngine;
      public class Quicksand : MonoBehaviour {
         void OnMouseDown()
         {
             while(true)
             {
                 // "Mind you, you'll keep sinking forever!!", -- My mom
             }
         }
      }
      
    • 我们转到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博客。您还可以阅读为什么该方法在那里起作用。在此处输入图像描述

    • 27

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何停止编写糟糕的代码?

    • 3 个回答
  • Marko Smith

    onCreateView 方法重构

    • 1 个回答
  • Marko Smith

    通用还是非通用

    • 2 个回答
  • Marko Smith

    如何访问 jQuery 中的列

    • 1 个回答
  • Marko Smith

    *.tga 文件的组重命名(3620 个)

    • 1 个回答
  • Marko Smith

    内存分配列表C#

    • 1 个回答
  • Marko Smith

    常规赛适度贪婪

    • 1 个回答
  • Marko Smith

    如何制作自己的自动完成/自动更正?

    • 1 个回答
  • Marko Smith

    选择斐波那契数列

    • 2 个回答
  • Marko Smith

    所有 API 版本中的通用权限代码

    • 2 个回答
  • Martin Hope
    jfs *(星号)和 ** 双星号在 Python 中是什么意思? 2020-11-23 05:07:40 +0000 UTC
  • Martin Hope
    hwak 哪个孩子调用了父母的静态方法?还是不可能完成的任务? 2020-11-18 16:30:55 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    Arch ArrayList 与 LinkedList 的区别? 2020-09-20 02:42:49 +0000 UTC
  • Martin Hope
    iluxa1810 哪个更正确使用:if () 或 try-catch? 2020-08-23 18:56:13 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5