版本:Unity 6 (6000.0)
语言 : English
调试和诊断
Debug 类

在 Unity 中调试 C# 代码

您可以在应用程序运行时使用调试器检查源代码。Unity 支持以下代码编辑器来调试 C# 代码

虽然这些代码编辑器在支持的调试功能上略有不同,但它们都提供基本功能,例如断点、单步执行和变量检查。您可以将这些代码编辑器附加到 Unity 编辑器Unity 播放器 来调试您的代码。

Unity 中的托管代码调试在除 Web 之外的所有平台上都有效。它与 MonoUnity 中使用的脚本后端。 更多信息
请参阅 词汇表
IL2CPPUnity 开发的脚本后端,您可以在构建某些平台的项目时将其用作 Mono 的替代方案。 更多信息
请参阅 词汇表
脚本后端为 Unity 中的脚本提供支持的框架。Unity 支持三种不同的脚本后端,具体取决于目标平台:Mono、.NET 和 IL2CPP。但是,通用 Windows 平台只支持两种:.NET 和 IL2CPP。 更多信息
请参阅 词汇表

配置 IDE

有关在 Unity 中调试每个受支持的 IDE 的配置要求,请参阅 集成开发环境 (IDE) 支持

断点

断点允许您指定代码中您要暂停其执行的位置。在外部代码编辑器中,您可以在要使调试器停止的代码行上设置断点。当代码编辑器处于断点时,您可以逐步查看变量的内容。

如果您已将代码编辑器附加到 Unity 编辑器(请参阅 将您的代码编辑器附加到 Unity 编辑器),则 Unity 编辑器将一直处于无响应状态,直到您在代码编辑器中选择继续选项或停止调试模式。

要查看如何在 Visual Studio 中设置断点,请参阅 在 Visual Studio 中设置断点

在 Unity 编辑器中调试

您可以在 Unity 编辑器处于播放模式时,调试在 Unity 编辑器中运行的 C# 代码。

要在编辑器中调试,您需要将编辑器的代码优化模式设置为 调试模式,然后您可以 附加具有调试功能的代码编辑器

要更改代码优化模式,请选择 Unity 编辑器状态栏 右下角的调试按钮。

The Debug Button in the bottom right of the Unity Editor Status Bar
Unity 编辑器状态栏右下角的调试按钮

Unity 的代码优化设置有两种模式

  • 调试模式,您可以使用它来附加外部调试器软件,但在您在编辑器中以播放模式运行项目时,会降低 C# 性能。
  • 发布模式,当您在编辑器中以播放模式运行项目时,会提供更快的 C# 性能,但您无法附加任何外部调试器。

当您单击状态栏中的调试按钮时,会打开一个小弹出窗口,其中包含一个按钮,您可以使用它来切换模式。该窗口还显示有关当前模式的信息,并描述切换模式时会发生的情况。

The Debug Mode popup, which shows the current mode, allows you to switch modes, and describes what happens if you switch mode.
调试模式弹出窗口,显示当前模式,允许您切换模式,并描述切换模式时会发生的情况。

要更改 Unity 编辑器启动的模式,请转到 编辑(macOS:Unity)> 首选项 > 常规 > 启动时代码优化

In Preferences, you can change the Code Optimization mode that Unity starts in.
在首选项中,您可以更改 Unity 启动的代码优化模式。

要使用脚本控制这些设置,请使用以下 API

您还可以覆盖编辑器启动的模式,或关闭调试器监听套接字。要执行此操作,请在启动编辑器时使用以下 命令行参数

  • -releaseCodeOptimization。以 发布 代码优化模式启动编辑器。
  • -debugCodeOptimization。以 调试 代码优化模式启动编辑器。
  • -disableManagedDebugger。以禁用调试器监听套接字的方式启动编辑器。

将您的代码编辑器附加到 Unity 编辑器

将代码编辑器附加到 Unity 编辑器的方式取决于您使用的代码编辑器,并且通常与代码编辑器的正常调试过程不同。某些代码编辑器允许您选择要调试的 Unity 实例。有关特定于您的代码编辑器的说明,请参阅 代码编辑器外部文档。要查看如何在 Visual Studio 中执行此操作,请参阅 将 Visual Studio 附加到 Unity 编辑器

将代码编辑器附加到 Unity 编辑器后,准备好开始调试时,请返回 Unity 编辑器并进入播放模式。

在 Unity 播放器中调试

要编译供您调试的 Unity 播放器

  1. 转到 文件 > 构建配置文件
  2. 在构建播放器之前,请启用 开发版本开发版本包含调试符号,并启用探查器。 更多信息
    请参阅 词汇表
    脚本调试 选项。您还可以启用 等待托管调试器 选项,使播放器在播放器执行任何脚本代码之前等待调试器附加。
  3. 选择 构建并运行

将您的代码编辑器附加到 Unity 播放器

要将您的代码编辑器附加到 Unity 播放器,请在您的代码编辑器中,选择播放器的 IP 地址(或机器名称)和端口。有关在 Visual Studio 中查找此地址的示例,请参阅 将 Visual Studio 附加到 Unity 编辑器

注意:您的代码编辑器将显示所有可供调试的 Unity 实例。确保将代码编辑器附加到 Unity 播放器的正确实例,而不是附加到 Unity 编辑器(如果两者都在运行)。

附加调试器后,您可以正常开始调试。有关如何将 Unity 播放器附加到特定代码编辑器的说明,请参阅 代码编辑器外部文档。有关如何将运行在移动设备上的 Unity 播放器附加到 Visual Studio 的示例,请参阅 使用 Visual Studio 调试 Android 和 iOS 设备

在 Visual Studio 中设置断点

要在 Visual Studio 中设置断点,请单击代码左侧的列,位于要使调试器停止的行上。行号旁边会出现一个红色圆圈,并且该行会突出显示。

A breakpoint in Visual Studio.
Visual Studio 中的断点。

将 Visual Studio 附加到 Unity 编辑器

要将 Unity 编辑器附加到您的 Visual Studio 脚本,请打开 Visual Studio,转到 调试 > 附加 Unity 调试器,然后选择要调试的 Unity 编辑器实例。

在以下示例图像中,有一个 Unity 实例在编辑器中运行,一个 Unity 实例作为 Android 播放器运行

Visual Studio lists the current instances of Unity that are available to debug.
Visual Studio 列出了当前可供调试的 Unity 实例。

使用 Visual Studio 调试 Android 和 iOS 设备

Android

要调试在 Android 设备上运行的 Unity 播放器,请使用 USB 或 TCP 连接到设备。例如,要在 Visual Studio 中连接到 Android 设备,请选择 调试 > 附加 Unity 调试器 选项。将显示运行播放器实例的设备列表。

在本示例中,android 设备使用 USB 和 Wi-Fi 连接到运行 Unity 编辑器和 Visual Studio 的工作站的同一个网络。

iOS

要调试在 iOS 设备上运行的 Unity 播放器,请使用 TCP 连接到设备。例如,要在 Visual Studio for Mac 中连接到 iOS 设备,请选择 调试 > 附加 Unity 调试器。将显示运行播放器实例的设备列表。

确保设备只有一个活动网络接口(推荐使用 Wi-Fi,关闭蜂窝数据),并且 IDE 和设备之间没有防火墙阻止 TCP 端口(上图中的端口号为 56000)。

重要:iOS 不支持通过 USB 进行调试。

调试调试器

调试器的大多数问题都发生在代码编辑器无法找到 Unity 编辑器或 Unity 播放器的情况下。这意味着 Unity 编辑器或播放器无法正确附加调试器。由于调试器使用 TCP 连接到编辑器或播放器,因此连接问题通常是由网络引起的。以下是一些解决基本连接问题的步骤。

确保您将调试器附加到正确的 Unity 实例

您可以将代码编辑器附加到本地网络上任何启用调试功能的 Unity 编辑器或 Unity 播放器实例。附加调试器时,请确保将其附加到正确的 Unity 实例。如果您知道运行 Unity 播放器的设备的 IP 地址或机器名称,这将有助于找到正确的实例。

验证与 Unity 实例的网络连接

代码编辑器使用与 Unity 探查器一个帮助您优化游戏的窗口。它显示在游戏各个区域花费了多少时间。例如,它可以报告渲染、动画或游戏逻辑中花费的时间百分比。 更多信息
请参阅 词汇表
相同的机制来查找要调试的 Unity 实例。如果代码编辑器找不到您期望的 Unity 实例,请尝试将 Unity 探查器附加到该实例。如果 Unity 探查器也找不到 Unity 实例,则您运行代码编辑器或 Unity 实例的机器上可能存在防火墙。如果存在防火墙,请参阅 检查防火墙设置

确保设备只有一个活动网络接口

许多设备有多个网络接口。例如,手机可能同时具有活动的蜂窝连接和活动的 Wi-Fi 连接。要使用 TCP 正确地将调试器连接到 Unity 实例,IDE 需要建立与设备上正确接口的网络连接。例如,如果您打算通过 Wi-Fi 进行调试,请确保将设备置于飞行模式以禁用所有其他接口,然后启用 Wi-Fi。

您可以通过查看 Player 日志由独立游戏运行时创建的 .log 文件,其中包含事件记录,例如脚本执行时间、编译器版本和 AssetImport 时间。日志文件可以帮助诊断问题。 更多信息
参见 词汇表
来确定 Unity 运行时告诉 IDE 使用的 IP 地址。 查找日志中类似于以下部分的内容

多播 "[IP] 10.0.1.152 [端口] 55000 [标志] 3 [GUID] 2575380029 [编辑器 ID] 4264788666 [版本] 1048832 [ID] iPhonePlayer(Example-iPhone):56000 [调试] 1 [包名] iPhonePlayer" to [225.0.0.222:54997]...

此消息表示 IDE 将尝试使用 IP 地址 10.0.1.152 和端口 56000 连接到设备。此 IP 地址和端口必须可以从运行 IDE 的计算机访问。

检查防火墙设置

Unity 实例使用 TCP 连接与代码编辑器通信。在大多数 Unity 平台上,此 TCP 连接发生在随机选择的端口上。通常,您不需要了解此端口,因为代码编辑器应该会自动检测到它。如果不起作用,请使用网络分析工具确定可能被阻止的端口,无论是运行代码编辑器的机器上,还是运行 Unity 实例的机器或设备上。找到这些端口后,请确保您的防火墙允许访问运行代码编辑器的机器和运行 Unity 实例的机器上的端口。

验证托管调试信息是否可用

如果调试器附加到 Unity 实例,但断点没有加载,则调试器可能无法找到代码的托管调试信息。托管代码调试信息存储在名为 .pdb 的文件中,与磁盘上的托管程序集 (.dll 文件) 位于同一目录下。

当您启用正确的首选项和构建选项(参见 配置代码编辑器)时,Unity 会自动生成此调试信息。但是,Unity 无法为项目中的托管插件生成调试信息。您只能在关联的 .pdb 文件位于磁盘上 Unity 项目中的托管插件旁边时,调试托管插件中的代码。

防止设备锁定

禁用您用于调试应用程序的设备上的任何屏幕锁定。屏幕锁定会导致调试器断开连接,并阻止其重新连接。在托管代码调试期间不要锁定屏幕。如果屏幕锁定,请重新启动设备上的应用程序,以便调试器可以重新连接。

由于调试器导致的内存和线程泄漏

托管调试器的实现将泄漏一些操作系统级的线程句柄和一些与线程相关的内存,以便处理与线程启动和关闭相关的某些竞争条件。在实践中,这些泄漏很小,不会影响应用程序的资源使用情况。但是,当创建和销毁许多线程时,泄漏可能会很明显。此行为也可能难以跟踪实际的内存泄漏,因此我们建议在排查内存泄漏时禁用脚本调试。

代码编辑器外部文档

其他资源

调试和诊断
Debug 类