【问题标题】:How can I debug MonoDevelop add-ins with MonoDevelop?如何使用 MonoDevelop 调试 MonoDevelop 插件?
【发布时间】:2012-03-09 16:58:43
【问题描述】:

主题说明了一切。我在 monodevelop 网站或谷歌上找不到任何信息。

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

【问题讨论】:

    标签: debugging mono add-in monodevelop


    【解决方案1】:

    mono --debug 与调试器没有任何关系,它只是让 Mono 跟踪调试信息,以便它可以在回溯中为您提供文件/行/列信息。

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

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

    这里的困难部分是让 MD 加载您的插件。一种方法是让您的项目将插件 dll 输出到 MD 搜索插件的目录之一,但在开发时这是一件非常棘手的事情。更好的解决方案是使用未记录的环境变量 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>
    

    如果您想知道为什么 &lt;CustomCommands&gt; 元素是两层深度,那是一个已知错误。

    【讨论】:

    • 谢谢!按预期工作。我在 AddIns 目录中有指向插件调试版本的符号链接,所以我没有尝试过 MONODEVELOP_DEV_ADDINS
    • @mhutch 很酷的提示,谢谢。设置MONODEVELOP_DEV_ADDINS 有效,但只有一次。除非我退出所有 MD 实例,包括带有插件项目的实例,否则只有第一个编译的插件将被拾取。有一些加载项缓存正在进行吗?
    • 注意,这是在 OSX 上。在 Windows 中它可以工作。每个新编译都会被新推出的 XS 拾取
    • TBH 我现在建议使用“Addin Maker”插件,它会自动完成所有这些操作。
    • 我做的项目是F#绑定,你的插件不支持F#。
    【解决方案2】:

    软调试器还不支持 System.Diagnostics.Debugger.Break(),所以这不起作用。

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

    【讨论】:

    • 您能详细说明一下吗? Run &gt; Debug Application &gt; MonoDevelop.exe 什么都不做..
    猜你喜欢
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-09
    • 1970-01-01
    • 2011-03-17
    相关资源
    最近更新 更多