4

我说的是使用 C# 进行游戏编程的小型游戏引擎。所以,我有一个嵌入单声道运行时的 C++ 应用程序(我称之为“启动器”)。我有一个用 C# 编写的程序集,这是我的游戏引擎类库。启动器按照Embedding Mono中的建议启动程序集。

现在是有趣的部分!启动器在 C++ 中实现了作为我的游戏引擎类的内部方法公开给单声道运行时的杂项函数。这就是为什么如果没有使用 C++ 实现大部分引擎的启动器,我的游戏引擎组件就什么都不是。

问题:我应该如何调试我的 C# 程序集?更重要的是,我应该如何调试我要用 C# 编写的游戏???

如您所知,我无法使用 MonoDevelop Debugger 调试程序集,因为它不会接收其某些方法的内部 C++ 实现。

我需要的是运行启动器。然后,启动器将使用嵌入式单声道运行时启动 C# 程序集。然后我需要一些东西来连接到已启动的程序集以允许其调试。

或者任何其他方式。谢谢!

4

2 回答 2

5

我推荐使用 Mono Soft Debugger。从 Mono 2.6 开始,它就被包含在 Mono 运行时中,并且比旧的硬调试器更可靠,也更便携。

--debugger-agent可以通过使用命令行参数将选项传递给 Mono 运行时来启动 Mono 软调试器。这可以通过构建一组假的命令行参数并将其传递给嵌入主机来完成mono_jit_parse_options。例如,Moonlight 浏览器插件使用来自 MOON_SOFT_DEBUG 环境变量的调试器代理值(如果已设置)。

通常调试器选项类似于

--debugger-agent="transport=dt_socket,address=$ADDRESS:$PORT"

这将导致应用程序尝试连接到侦听给定地址的调试器,并暂停直到建立连接。请注意,连接是通过 TCP/IP 建立的,这意味着远程调试非常容易设置,即使在本地计算机上您也可以使用 localhost。Mono 的手册页中记录了其他选项。

您需要的另一部分是调试器 GUI/控制器,用于侦听来自您的应用程序的连接,并处理步进/可视化等。我建议使用 MonoDevelop。有一个用于调试器有线协议的库,称为 Mono.Debugger.Soft.dll,但它相当低级,尽管 Visual Studio 的 Mono 工具支持连接到软调试器,但它还不能以允许调试 Mono 的方式进行扩展嵌入主机。

使用 MonoDevelop 接受来自嵌入主机的调试器连接目前需要创建一个插件,但这相当简单。以Moonlight 调试器插件为例。对于简单的用例,我建议您不要定义全新的项目类型,而只需创建一个调试处理程序来处理现有的 DotNetExecutionCommand 项目,这样您就可以运行->运行...->您的自定义调试器

如果您有更多问题,monodevelop-list邮件列表是一个很好的资源。

于 2010-09-07T20:21:24.077 回答
1

利用网络调试。

您可以使用Soft Debugger调试 Mono 部分,然后对 C++ 部分使用远程调试

于 2010-09-07T11:58:01.183 回答