Unity 提供了多种在 Windows 上进行调试的选项,用于对游戏和编辑器进程进行取证或实时调试。Unity 允许两种类型的调试:原生 C++ 调试和 C# 托管调试。
您可以使用 Unity 的符号存储在 Windows 调试器 (WinDbg) 或 Visual Studio 2019 及更高版本中访问 Unity 服务器 URL,以便自动解析和下载符号。
要在 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 进行调试,请按照以下步骤操作: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**平台。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting
。LocalDumps
文件夹。“DumpFolder”=<文件夹路径在此处>,例如,C:\Temp
“DumpCount”=dword:00000010
“DumpType”=dword:00000002