如何使用MonoDevelop调试MonoDevelop插件?

5

这个主题已经说明了一切。我在monodevelop网站和谷歌上都找不到任何信息。

即使添加System.Diagnostics.Debugger.Break()并使用mono --debug MonoDevelop.exe运行,似乎也没有任何作用...

2个回答

9

mono --debug与调试器无关,它只是使Mono跟踪调试信息以便在回溯中提供文件/行/列信息。

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

启用插件调试的基本方法是在插件项目中设置自定义执行命令。打开“项目选项”,转到“运行>自定义命令”部分,为“执行”添加一个自定义命令。将可执行文件设置为MonoDevelop.exe,将工作目录设置为其所在目录。这意味着当你运行/调试你的项目时,MD实际上会执行该可执行文件,而不是直接执行你的项目。如果MonoDevelop.exe加载了你的插件,那么你就可以设置断点、步进等。

困难的部分在于让MD加载你的插件。一种方法是让你的项目输出插件dll到MD搜索插件的目录之一,但这是在开发时非常hacky的事情。更好的解决方案是使用未记录的环境变量MONODEVELOP_DEV_ADDINS来指定一个额外的目录,从中MD加载插件。MD没有为自定义命令设置环境变量的UI,但它在内部得到支持——你将不得不手动编辑csproj文件。

找到类似于以下内容的部分:

<CustomCommands>
  <CustomCommands>
    <Command type="Execute"
      command="..\..\..\monodevelop\main\build\bin\MonoDevelop.exe"
      workingdir="..\..\..\monodevelop\main\build\bin" />
  </CustomCommands>
</CustomCommands>

然后将其更改为:

<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>

如果您想知道为什么<CustomCommands>元素有两层,那是已知的错误。

谢谢!正常工作。我在AddIns目录中有插件的调试版本的符号链接,所以我没有尝试过MONODEVELOP_DEV_ADDINS。 - simendsjo
@mhutch,好贴士,谢谢。设置MONODEVELOP_DEV_ADDINS可以工作,但是只能生效一次。除非我退出所有的MD实例,包括带有插件项目的实例,否则只有第一个编译的插件才会被选中。这里发生了一些插件缓存? - Robert Jeppesen
注意,这是在OSX上。在Windows上它可以工作。每次新的编译都会被新启动的XS捕获。 - Robert Jeppesen
说实话,我现在建议使用“Addin Maker”插件,它可以自动完成所有这些操作。 - Mikayla Hutchinson
我正在工作的项目是F#绑定,而你的插件不支持F#。 - Robert Jeppesen
它确实可以,只是没有针对F#的模板。您可以在项目文件中手动设置项目类型GUID。 - Mikayla Hutchinson

0

软件调试器还不支持System.Diagnostics.Debugger.Break(),所以这个方法行不通。

你只需要在MonoDevelop中调试MonoDevelop,并在你的插件源文件上设置断点即可。


1
你能详细说明一下吗?运行 > 调试应用程序 > MonoDevelop.exe 没有任何反应。 - simendsjo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接