本文分两部分:先介绍 mono 生成的 exe 如何单独调试,再说明混合编程场景下如何对 C# 代码进行调试。调试工具均为 VSCode 的 SDB mono debug 扩展。

第一部分:调试 mono 生成的 exe

  1. 打开 VSCode,安装 mono debug 扩展。

  2. 使用 mcs 命令行编译代码,注意加上 -debug 参数:

    mcs -debug Program.cs
  3. 执行 mono 启动调试代理,命令如下:

    mono --debug --debugger-agent=transport=dt_socket,server=y,address=127.0.0.1:5412 Program.exe

    然后在 VSCode 中配置对应的调试环境。

  4. 按 F5 启动调试,断点即可正常命中。

查阅官方文档尝试了很久未能解决,最终通过上述原始方法获得灵感,找到了可行方案。

第二部分:混合编程下调试 C# 代码

  1. 需要将 pdb 文件转换为 mdb 文件供调试使用。mono 提供了 pdb2mdb.bat 命令行工具来完成此转换。

  2. 在 C++ 代码中加载调试所需的 mdb 文件信息,并开启调试命令行。

    通过 mono_debug_open_image_from_memory 函数加载对应的 mdb 调试文件。

  3. 在 VSCode 中打下断点,按 F5 运行即可开始调试。

注意:jit 命令行参数设置 suspend=y 时,必须在启动调试器后才会命中断点。如果是中途 attach,断点将不会被命中。