调试器
Z# 默认支持 CoreCLR
和 Mono
两种运行时,它们分别使用 .NET Debugger
和 Mono 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,则无视这一项。