2012-03-09 3 views

ответ

10

mono --debug не имеет никакого отношения к отладчику, он просто заставляет Mono отслеживать информацию об отладке, чтобы он мог предоставить вам информацию о файле/строке/столбце в обратном направлении.

Поведение System.Diagnostics.Debugger.Break() зависит от вашей версии Mono. AFAIK в своей базовой форме устанавливает сложную точку останова, поэтому, если ваше приложение не работает в собственном жестком отладчике, оно просто сработает. Если ваше приложение работает в Mono Soft Debugger с Mono 2.11 или новее (которое еще не выпущено), оно установит мягкую точку останова для мягкого отладчика и будет работать как ожидалось.

Основным способом включения отладки добавок является установка пользовательской команды выполнения в проекте добавления. Откройте «Параметры проекта», перейдите в раздел «Выполнить> Пользовательские команды», добавьте пользовательскую команду «Выполнить». Установите исполняемый файл MonoDevelop.exe, а рабочий каталог - его содержащий каталог. Это означает, что при запуске/отладке вашего проекта MD фактически выполнит этот исполняемый файл вместо непосредственного выполнения вашего проекта. Если MonoDevelop.exe загружает вашу добавку, вы сможете установить точки останова, шаг и т. Д.

Трудная часть здесь заключается в том, что MD загружает вашу добавку. Один из способов сделать это - предоставить вашему проекту вывод addin dll в одну из каталогов, которые MD ищет для добавления, но это очень хакерская вещь, которую нужно делать во время разработки. Лучшее решение - использовать недокументированную переменную среды MONODEVELOP_DEV_ADDINS, чтобы указать дополнительную директорию, из которой MD загружает аддикаты. В MD нет пользовательского интерфейса для настройки env vars для пользовательских команд, но он поддерживается внутри - вам придется вручную отредактировать файл 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> элементы два-глубоко, что известная ошибка.

+0

Спасибо! Работает так, как ожидалось. У меня есть символические ссылки на сборку отладки addin в каталоге AddIns, поэтому я не пробовал MONODEVELOP_DEV_ADDINS – simendsjo

+0

@mhutch Прохладный отзыв, спасибо. Установка 'MONODEVELOP_DEV_ADDINS' работает, но только один раз. Если я не выйду из всех экземпляров MD, включая экземпляр с проектом надстройки, будет собрана только первая скомпилированная надстройка. Есть некоторые кеширование надстроек? –

+0

Обратите внимание, что это на OSX. В Windows это работает. Каждый новый компилятор получает новый XS –

0

мягкий отладчик не поддерживает System.Diagnostics.Debugger.Break(), так что не будет работать.

Вам просто нужно отладить MonoDevelop внутри MonoDevelop и установить контрольные точки в исходных файлах вашего дополнения.

+1

Не могли бы вы это уточнить? 'Run> Debug Application> MonoDevelop.exe' ничего не делает .. – simendsjo

Смежные вопросы