版本:Unity 6 (6000.0)
语言:英语
Windows 的 Visual Studio 项目生成
Windows 完整性控制

Windows 调试

Unity 提供了多种在 Windows 上进行调试的选项,用于对游戏和编辑器进程进行取证或实时调试。Unity 允许两种类型的调试:原生 C++ 调试和 C# 托管调试。

  • 原生调试将符号存储在关联二进制文件(例如 exe 和 dll)的程序数据库 (PDB) 中。
  • 在 Windows 上,标准 .NET 托管符号存储在扩展名为 .pdb 的 PDB 文件中。

符号

您可以使用 Unity 的符号存储在 Windows 调试器 (WinDbg) 或 Visual Studio 2019 及更高版本中访问 Unity 服务器 URL,以便自动解析和下载符号。

Windows 调试器 (WinDbg) 设置

要在 WinDbg 上添加符号存储,请使用 .sympath 命令

.sympath+ SRV*c:\symbols-cache*http://symbolserver.unity3d.com/

其中

.sympath+
+ 符号表示保留现有的符号路径,并将此符号存储查找附加到路径中。

SRV*c:\symbols-cache
SRV 指示要从中获取远程服务器,而 c:\symbols 是本地路径,用于缓存下载的符号,并在再次下载之前首先在此处查找。

*http://symbolserver.unity3d.com/
要从中获取符号存储的路径。

Visual Studio 设置

要配置 Visual Studio 进行调试,请按照以下步骤操作:1. 转到**工具 > 选项**。2. 展开**调试**部分,然后选择**符号**。3. 如果尚未指定,请指定缓存目录。4. 添加**符号文件 (.pdb) 位置**,例如 Unity 的符号存储

实时调试

实时调试是指将调试器附加到正在运行的进程或捕获到异常的进程的场景。为了使调试器能够发现问题,您必须使用Visual Studio 设置部分中描述的步骤在构建中包含符号。此外,如果游戏可执行文件的名称与您的游戏名称相同,调试器可能难以找到正确的 .pdb 文件,尤其是在它无法访问重命名后的可执行文件时。

设置自动异常调试

在 Windows 上,Microsoft 会自动设置应用程序崩溃以发送到 Dr Watson/错误报告到 Microsoft。但是,如果您安装了 Visual Studio 或 WinDbg,Microsoft 提供了一个选项,可以选择调试崩溃

按照此注册表文件内容进行安装
Windows 注册表编辑器版本 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug] "Auto"="1" [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug] "Auto"="1"

编辑器调试的其他内容

Unity.exe -dbgbreak
将启动 Unity,并在设置自动崩溃处理后立即提供调试器连接。

事后/取证调试

Windows 提供了调查崩溃转储文件 (.dmp 或 .mdmp) 的工具。根据崩溃转储,您可能会看到堆栈信息或整个进程内存。转储文件的内容确定崩溃的原因,通常至少包含一个要调查的堆栈(只要它是一个有效的堆栈)。

要调查转储文件,您可以通过 Visual Studio 或 WinDbg 加载它。虽然 Visual Studio 易于使用,但 WinDbg 提供了其他功能,使其成为首选的调试工具。

调试提示和技巧

在运行 Visual Studio 时,您可以使用 Unity 为 VS Code 提供的UnityMixedCallstack 扩展,使调试更加轻松。

原生环境中的托管异常

NullReferenceException 通常如下所示

    1b45558c()  
>   mono-2.0-bdwgc.dll!malloc(unsigned int size=12)  Line 163 + 0x5f bytes  C  
    mono-2.0-bdwgc.dll!g_hash_table_insert_replace(_GHashTable * hash=0x065c3960, void * key=0x0018cba4, void * value=0x0018cb8c, int replace=457528232)  Line 204 + 0x7 bytes  C  
    mono-2.0-bdwgc.dll!mono_jit_runtime_invoke(_MonoMethod * method=0x242bf8b0, void * obj=0x065c3960, void ** params=0x0018cba4, MonoObject * * exc=0x0018cb8c)  Line 4889 + 0xc bytes C  

托管堆栈帧

托管堆栈帧通常类似于此

    1b45558c()  
>   mono-2.0-bdwgc.dll!malloc(unsigned int size=12)  Line 163 + 0x5f bytes  C  
    mono-2.0-bdwgc.dll!g_hash_table_insert_replace(_GHashTable * hash=0x065c3960, void * key=0x0018cba4, void * value=0x0018cb8c, int replace=457528232)  Line 204 + 0x7 bytes  C  
    mono-2.0-bdwgc.dll!mono_jit_runtime_invoke(_MonoMethod * method=0x242bf8b0, void * obj=0x065c3960, void ** params=0x0018cba4, MonoObject * * exc=0x0018cb8c)  Line 4889 + 0xc bytes C  

没有任何信息的行是托管帧。您可以使用名为 mono_pmip 的内置函数在 mono 中获取托管堆栈信息,该函数接受堆栈帧的地址并返回包含信息的 char*。您可以在 Visual Studio 即时窗口中调用 mono_pmip 进行调试。

?(char*){,,mono-2.0-bdwgc.dll}mono_pmip((void*)0x1b45558c)
0x26a296c0 “ Tiles:OnPostRender () + 0x1e4 (1B4553A8 1B4555DC) [065C6BD0 - Unity Child Domain]”`

注意:这仅在 mono-2.0-bdwgc.dll 符号正确加载的情况下有效。

强制应用程序创建转储

有时,即使附加了调试器,应用程序也不会崩溃,或者它在调试器不可用的远程设备上崩溃。在这种情况下,您可以使用以下步骤从转储文件中获取有用的信息

注意:这些说明适用于在桌面上运行时的**Windows 独立版**和**通用 Windows**平台。

  1. 打开 Windows 注册表。
  2. 导航到 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting
  3. 如果不存在,请创建 LocalDumps 文件夹。
  4. 添加以下键
    • “DumpFolder”=<文件夹路径在此处>,例如,C:\Temp
    • “DumpCount”=dword:00000010
    • “DumpType”=dword:00000002
  5. 通过通用 Windows 平台或 Windows 独立版可执行文件启动应用程序。
  6. 重现崩溃。转储文件将创建在您之前指定的文件夹中。您可以使用首选的调试工具(例如 Visual Studio 或 WinDbg)打开转储文件。
Windows 的 Visual Studio 项目生成
Windows 完整性控制