5

The topic says it all. I cannot find any information on the monodevelop site or through google.

Even adding System.Diagnostics.Debugger.Break() and running with mono --debug MonoDevelop.exe doesn't seem to do anything..

simendsjo
  • 4,739
  • 2
  • 25
  • 53

2 Answers2

9

mono --debug doesn't have anything to do with the debugger, it simply causes Mono to track debug information so it can give you file/line/col information in backtraces.

The behaviour of System.Diagnostics.Debugger.Break() depends on your Mono version. AFAIK in its basic form it sets a hard breakpoint, so if your app's not running in a native hard debugger it will simply crash. If your app is running inside the Mono Soft Debugger with Mono 2.11 or later (which has not yet been released), it will set a soft breakpoint for the soft debugger and work as expected.

The basic way to enable debugging of addins is to set a custom execution command in your addin project. Open 'Project Options', got to the 'Run>Custom Commands' section, add a custom command for 'Execute'. Set the executable to MonoDevelop.exe and the working directory to be its containing directory. This means that when you run/debug your project, MD will actually execute that executable instead of executing your project directly. If MonoDevelop.exe loads your addin, then you'll be able to set breakpoints, step, etc.

The difficult part here is making MD load your addin. One way to do this would be to have your project output the addin dll into one of the directories that MD searches for addins, but that's a very hacky thing to do at development time. A better solution is to use the undocumented environment variable MONODEVELOP_DEV_ADDINS to specify an additional directory from which for MD to load addins. There isn't a UI in MD for setting env vars for custom commands, but it is supported internally - you'll have to manually edit the csproj file.

Find the part that looks like:

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

And change it to:

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

If you're wondering why the <CustomCommands> elements are two-deep, that a known bug.

Mikayla Hutchinson
  • 16,113
  • 2
  • 44
  • 50
  • Thanks! Works as expected. I have symlinks to the debug build of the addin in the AddIns directory, so I haven't tried MONODEVELOP_DEV_ADDINS – simendsjo Mar 10 '12 at 09:49
  • @mhutch Cool tip, thanks. Setting `MONODEVELOP_DEV_ADDINS` works, but only once. Unless I quit all instances of MD, including the instance with the add-in project, only the first compiled add-in will ever be picked up. There's some add-in caching going on? – Robert Jeppesen Apr 01 '14 at 20:28
  • Note, this is on OSX. In Windows it works. Every new compile gets picked up by the newly launched XS – Robert Jeppesen Apr 01 '14 at 21:09
  • TBH I would now suggest using the "Addin Maker" addin which does all this automatically. – Mikayla Hutchinson Apr 02 '14 at 20:13
  • The project I was working on was the F# binding, and your add-in doesn't support F#. – Robert Jeppesen Apr 03 '14 at 04:56
  • It does, it just doesn't have templates for F#. You could manually set the project type GUIDs in a project file. – Mikayla Hutchinson Apr 07 '14 at 18:53
0

the soft debugger doesn't yet support System.Diagnostics.Debugger.Break(), so that won't work.

You just need to debug MonoDevelop inside MonoDevelop and set your breakpoints on the source files of your addin.

jstedfast
  • 35,744
  • 5
  • 97
  • 110