调试由嵌入式单声道运行时启动的 C# 程序集?

标签 debugging mono interop mono-embedding

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

现在是有趣的部分! 启动器在 C++ 中实现了各种函数,这些函数作为我的游戏引擎类的内部方法暴露给 Mono 运行时。这就是为什么如果没有启动器,我的游戏引擎组件就毫无意义,启动器用 C++ 实现了引擎的很大一部分。

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

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

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

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

最佳答案

我建议使用 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/ Controller ,用于监听来自应用程序的连接,并处理步进/可视化等。我建议使用 MonoDevelop。有一个名为 Mono.Debugger.Soft.dll 的调试器线路协议(protocol)库,但它的级别相当低,尽管 Mono Tools for Visual Studio 支持连接到软调试器,但它还不能以允许调试 Mono 的方式进行扩展。嵌入主机。

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

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

关于调试由嵌入式单声道运行时启动的 C# 程序集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3649503/

相关文章:

java - WebLogic 的默认调试端口是什么?

multithreading - 获取有关 gdb/ddd 中线程的信息

c# - 如何在不使用 XElement 的情况下从自定义 XML 序列化/反序列化为 `Dictionary<int, string>`?

debugging - 在 Emacs 中使用 Mono 软调试器

C++/CLI - 调用 DLL 中定义的非托管函数

c++ - 调试::gdb::src2dst 是什么?

visual-studio - Visual Studio : How to break on handled exceptions?

Linux 上的 F#,没有 .NET 经验

asp.net-mvc - ASP.NET MVC 应用程序中的 "Bad binary signature"

C# 互操作 : excel process not exiting after adding new worksheet to existing file