如何使用MonoDevelop调试MonoDevelop加载项?

sim*_*sjo 5 debugging mono add-in monodevelop

这个话题说明了一切.我在monodevelop网站上或通过谷歌找不到任何信息.

即使添加System.Diagnostics.Debugger.Break()和运行mono --debug MonoDevelop.exe似乎也没有做任何事情..

Mik*_*son 10

mono --debug 与调试器没有任何关系,它只是让Mono跟踪调试信息,因此它可以在backtraces中为您提供文件/行/ col信息.

行为System.Diagnostics.Debugger.Break()取决于您的Mono版本.AFAIK以其基本形式设置了一个硬断点,因此如果你的应用程序没有在本机硬调试器中运行,它就会崩溃.如果你的应用程序在带有Mono 2.11或更高版本(尚未发布)的Mono Soft Debugger中运行,它将为软调试器设置一个软断点并按预期工作.

启用插件调试的基本方法是在插件项目中设置自定义执行命令.打开"项目选项",进入"运行>自定义命令"部分,为"执行"添加自定义命令.将可执行文件设置为MonoDevelop.exe,将工作目录设置为其包含目录.这意味着当您运行/调试项目时,MD将实际执行该可执行文件,而不是直接执行您的项目.如果MonoDevelop.exe加载你的插件,那么你将能够设置断点,步骤等.

这里的困难部分是让MD加载您的插件.实现此目的的一种方法是让您的项目将addin dll输出到MD搜索插件的其中一个目录中,但这在开发时非常麻烦.更好的解决方案是使用未记录的环境变量MONODEVELOP_DEV_ADDINS来指定MD加载插件的附加目录.MD中没有用于为自定义命令设置env变量的UI,但内部支持它 - 您必须手动编辑csproj文件.

找到看起来像的部分:

<CustomCommands>
  <CustomCommands>
    <Command type="Execute"
      command="..\..\..\monodevelop\main\build\bin\MonoDevelop.exe"
      workingdir="..\..\..\monodevelop\main\build\bin" />
  </CustomCommands>
</CustomCommands>
Run Code Online (Sandbox Code Playgroud)

并将其更改为:

<CustomCommands>
  <CustomCommands>
    <Command type="Execute"
      command="..\..\..\monodevelop\main\build\bin\MonoDevelop.exe"
      workingdir="..\..\..\monodevelop\main\build\bin">
      <EnvironmentVariables>
        <Variable name="MONODEVELOP_DEV_ADDINS" value="${TargetDir}" />
      </EnvironmentVariables>
    </Command>
  </CustomCommands>
</CustomCommands>
Run Code Online (Sandbox Code Playgroud)

如果你想知道为什么<CustomCommands>元素是两个深,那是一个已知的bug.