跳到主要内容

调试器

更新日期:2025-02-24

Z# 默认支持 CoreCLRMono 两种运行时,它们分别使用 .NET DebuggerMono Debugger。 这两种调试器的行为不太一样,各有优劣,你一般会需要在不同情况下切换不同的运行时和调试器。

.NET Debugger

在使用 CoreCLR 时,你可以直接将 .NET Debugger 挂到目标进程上,主流 IDE 一般都有 Attach To Process 功能。 但需要注意的是,.NET Debugger 和 LLDB 冲突,如果已经挂了其中一个,就不能再挂另一个了。 如果你要使用 .NET Debugger,记得不要以调试模式启动你的虚幻项目。

在日常业务开发中,.NET Debugger 一般够用,因为你不太会去调试引擎代码。 但在学习或者排查底层问题时,只能调试一侧就会让事情变得很麻烦。 理论上,.NET Debugger 是可以支持混合调试的,但我们最终还是选择了一种接入成本更低的方式来支持混合调试——Mono Debugger。

Mono Debugger

在使用 Mono 时,默认会启动 Debug Server,你可以通过 Socket 将 Mono Debugger 挂到目标进程上(支持远程调试)。

主流 IDE 一般都有内置或第三方的 Mono Debugger 支持,以 Jetbrains Rider 为例,你可以直接创建一个 Mono Remote Debug 的配置:

Visual Studio 系列 IDE 也有 Mono Debugger 的插件:

Mono Debugger 使用 Socket 通信而不是直接注入目标进程,因此它和 LLDB 不冲突,你可以在两个 IDE 进程中分别调试托管代码和非托管代码。

配置

你可以在 ZSharp.ini 中修改调试器相关的配置,推荐在项目配置目录下新建 DefaultZSharp.ini 而不是直接修改插件配置目录下的 BaseZSharp.ini

[Debugger]
Port=50000
Suspend=False

Port 只对 Mono Debugger 有效,指定 Debug Server 的端口,必须是一个有效的 TCP/IP 端口号(16位无符号整数),如果是 0 则不启动 Debug Server。

Suspend 指定是否阻塞等待 Debugger,这在需要调试启动流程的场景下很有用。 在使用 Mono Debugger 时,如果没有启动 Debug Server,则无视这一项。