Отладка, когда мой код запускается внешней программой с Process.Start ()

Предположим, у меня есть приложение C # WinForms, и оно запускается внешней программой, просто используя Process.Start(MyModule.exe).

Я попытался отладить свой код, используя Свойства моего проекта -> Отладка -> Действие при запуске -> Запустить внешнюю программу < / strong> (конечно, с правильной настройкой рабочего каталога).

Другой моей попыткой была Отладка -> Присоединить к процессу.

ОБНОВЛЕНИЕ: и мой модуль, и внешняя программа используют один ресурс. Таким образом, внешняя программа освобождает его, затем вызывает Process.Start (), ждет, пока мой процесс выйдет из ans, а затем снова захватит ресурс. Поэтому я не могу подключиться, когда ваша программа уже запущена.

Оба они потерпели неудачу - точка останова в Program.cs не была достигнута.

Итак, как я могу отладить свой код в таких обстоятельствах?


person bairog    schedule 28.04.2014    source источник
comment
Я думаю Attach to Process должен работать, если вы прикрепляете, когда ваша программа уже запущена. Вы подключились к своему приложению или к другой программе, которая его запускает?   -  person Kobi    schedule 28.04.2014
comment
Присоединяю к внешней программе. Я обновил свой пост, чтобы получить некоторую информацию.   -  person bairog    schedule 28.04.2014


Ответы (2)


Я знаю два способа легко решить эту проблему. Первый способ - ваша программа запросит прикрепление к ней отладчика в качестве первого действия в Main через _ 1_

public static void Main(string[] args)
{
    Debugger.Launch();

    //Rest of your code here
}

Появится диалоговое окно, подобное приведенному ниже:
введите описание изображения здесь

Это позволит вам подключиться к вашей работающей визуальной студии или запустить новый экземпляр.

Другой способ решить эту проблему, когда вы не можете использовать предыдущий метод (например, я не думаю, что он работает внутри служб), помещает цикл в начало вашего кода, который будет повторяться вечно, пока не будет подключен отладчик, это дает у вас будет достаточно времени, чтобы выполнить метод «Присоединить к процессу», который вы пробовали ранее, не позволяя программе прогрессировать.

public static void Main(string[] args)
{
    while(!Debugger.IsAttached)
    {
        Thread.Sleep(1000); //Sleep 1 second and then check again.
    }

    //Rest of your code here
}
person Scott Chamberlain    schedule 28.04.2014
comment
Для меня: Debugger.Launch () или Debugger.IsAttached () активен только в том случае, если код скомпилирован в Debug Configuration? - person this.myself; 28.04.2014
comment
@ this.myself Оба этих метода активны в режиме выпуска, это некоторые из функций в _ 1_ не Debugger, которые не компилируются во время выпуска. Это делается с помощью атрибута Conditional, если вы Щелкните метод правой кнопкой мыши и выполните Navigate to->Metadata, чтобы увидеть, имеет ли интересующий вас метод атрибут [Conditional("DEBUG")]. - person Scott Chamberlain; 28.04.2014
comment
@ Скотт Чемберлен: Спасибо за объяснение! - person this.myself; 28.04.2014

Есть два разных метода, которые вы можете использовать System.Diagnostics.Debugger.Launch() или System.Diagnostics.Debugger.Break(). Первый подключает отладчик (позволяя вам выбрать какой), а затем ничего не делает. В случае, если он уже прикреплен, ничего не произойдет. Последний будет действовать точно так же, как Launch, если отладчик не подключен, и будет служить точкой останова, если он подключен.

Так что просто напишите System.Diagnostics.Debugger.Break(); там, где вы хотите, чтобы ваша точка останова была.

Это приведет к диалоговому окну с вопросом, как вы хотите отлаживать программу (что, конечно, также означает, что вам следует удалить строку после завершения отладки)

В диалоговом окне выберите соответствующий экземпляр VS (или создайте новый) и просто продолжите отладку как обычно.

person Rune FS    schedule 28.04.2014
comment
Debugger.Break() - это правильный синтаксис, но у меня он не работает - person bairog; 28.04.2014
comment
что не работает? сборка программы с выпуском или сборкой отладки? - person Rune FS; 28.04.2014
comment
Отлаживать. Я пробовал подход Запустить внешнюю программу - после нажатия соответствующей кнопки во внешней программе мой модуль просто открывается .. - person bairog; 28.04.2014
comment
Просто запустите программу, которая вызывает Process.Start(...) - person Rune FS; 28.04.2014