Как присоединить Visual Studio к еще не запущенному процессу?

89

У меня есть программа .NET, которая по некоторым причинам не может быть запущена из Visual Studio (файл Excel, созданный из проекта шаблона Excel 2010), для которой мне нужно отлаживать события запуска.

Если я хочу отлаживать события, происходящие после инициализации программы, проблем нет. Я запускаю программу из проводника, присоединяю процесс к Visual Studio и добавляю в код несколько точек останова. Но здесь мне нужно поставить точки останова на события запуска. Мне нужно иметь возможность присоединять процессы к Visual Studio, не в зависимости от PID, а от имени конкретного процесса или любого другого решения, которое будет работать.

Конечно, о добавлении Thread.Sleep(1000)в мои события запуска, чтобы дать мне время присоединить процесс в Visual Studio, не может быть и речи!

Ucodia
источник

Ответы:

97

На самом деле вы можете; вы не привязываетесь к этому, вы начинаете это. В свойствах проекта на вкладке «Отладка» укажите путь к программе, к которой вы хотите присоединиться, в текстовом поле «Команда».

Вы также можете ввести любые аргументы командной строки для программы в поле «Командные аргументы»:

введите описание изображения здесь

Убедитесь, что для параметра «Прикрепить» установлено значение «Нет».

Тиби
источник
6
Хорошее решение, но учтите, что нажатие F5 в этом случае не работает. Вместо этого щелкните правой кнопкой мыши соответствующий проект и выберите «Отладка> Начать новый экземпляр» в контекстном меню.
Herman Cordes
1
Для работы F5 ваш проект должен быть начальным проектом в решении. Для этого в проводнике решений щелкните правой кнопкой мыши проект и выберите «Установить как запускаемый проект».
Тиби
1
Также, если ваша программа имеет какие-то внешние зависимости, вам также необходимо изменить «Рабочий каталог».
Priyank
Может потребоваться установить флажок «Включить отладку собственного кода» (Свойства проекта → ОтладкаВключить отладчики ).
Питер Мортенсен
И как это сделать для всего решения с 40 проектами?
Тони Таннус
23

Я отлаживал плагин C ++ во внешнем порожденном процессе, который разбился из-за выдачи исключения при запуске, и это отлично сработало для меня:

Добавьте бесплатное расширение Reattach Extension для Visual Studio . Попросите его повторно присоединиться к имени процесса перед его запуском. Появится модальное диалоговое окно, в котором говорится, что он ожидает запуска процесса по имени.

Теперь запустите процесс, и отладчик Visual Studio немедленно подключится, улавливая исключения и достигая точек останова.

странно
источник
Тысячу раз да!
itslittlejohn
Я зашел в тупик. Он запросил авторизацию администратора, когда моя цель была запущена, и после ввода pwd и перезапуска vs Reattach исчез. Только vs без авторизации администратора содержит Reattach.
Эрик
2
У меня не работает. Он все еще присоединяется слишком поздно, после того, как авария уже произошла. Кажется, он проверяет существующие процессы раз в секунду, что для этого приложения совершенно бессмысленно.
РИВ
20

Если у вас Visual Studio 2017-2019, выполните следующие действия:

  1. Файл> Открыть> Проект / Решение
  2. Выберите ваш .exe
  3. Отладка> Начать отладку

Намного проще, чем другие предложения: вам не нужно возиться со свойствами проекта и никаких расширений не требуется.

Мэтт Томас
источник
Но вам нужно будет сообщить Visual Studio, где находятся символы отладки, если она не найдет их автоматически,
Мэтт Томас
1
быстро легко сделать за 5 секунд, мне это нравится. Спасибо
ComradeJoecool 01
1
Мой exe был запущен, но не удалось установить точку останова. Что я должен делать?
Эрик
2
@Eric Если мой комментарий выше не касается этого, я рекомендую задать это как вопрос SO, а не комментарий. Ваша проблема станет более заметной, и у вас будет возможность объяснить свой конкретный сценарий. Тогда дайте нам знать, что вы нашли!
Мэтт Томас
11

Я нашел этот ответ, когда искал нечто подобное. В моем случае я не мог просто использовать исполняемый файл в качестве программы запуска моего проекта, потому что его нужно было запускать в очень специфической среде, которую я не мог легко воспроизвести (а именно: запущен из cygwin).

Я взглянул на расширение Reattach Extension, предложенное mrstrange, а также на очень похожее расширение Attach To Anything ... но мой исполняемый файл, похоже, закрывался слишком быстро, чтобы расширения могли уведомить и прикрепить.

В конечном итоге мне помогло следующее: https://stackoverflow.com/a/4042545/1560865 , который ссылается на статью MSDN Как: запустить отладчик автоматически , в которой, в свою очередь, перечислены следующие шаги:

  1. Запустите редактор реестра (regedit).
  2. В редакторе реестра откройте папку HKEY_LOCAL_MACHINE.
  3. Перейдите в HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows NT \ currentversion \ параметры выполнения файла изображения.
  4. В папке « Параметры выполнения файла изображения » найдите имя приложения, которое нужно отлаживать, например myapp.exe . Если вы не можете найти приложение, которое хотите отладить:
    a. Щелкните правой кнопкой мыши папку « Параметры выполнения файла изображения » и в контекстном меню выберите « Новый ключ» .
    б. Щелкните новый ключ правой кнопкой мыши и в контекстном меню выберите команду « Переименовать» . c. Измените имя ключа на имя вашего приложения; myapp.exe , в этом примере.
  5. Щелкните правой кнопкой мыши папку myapp.exe и в контекстном меню выберите Новое строковое значение .
  6. Щелкните правой кнопкой мыши новое строковое значение и в контекстном меню выберите «Переименовать».
  7. Измените имя на debugger.
  8. Щелкните правой кнопкой мыши новое строковое значение и в контекстном меню выберите « Изменить» . Откроется диалоговое окно « Редактировать строку ».
  9. В поле « Значение» введите vsjitdebugger.exe.
  10. Щелкните ОК .
  11. В меню « Реестр» нажмите « Выход» .
  12. Каталог, содержащий vsjitdebugger.exe, должен находиться в вашем системном пути. Чтобы добавить его в системный путь, выполните следующие действия:
    a. Откройте панель управления в классическом виде и дважды щелкните « Система» .
    б. Щелкните Advanced System Settings .
    c. В свойствах системы перейдите на вкладку « Дополнительно ».
    d. На вкладке « Дополнительно » щелкните « Переменные среды» .
    е. В диалоговом окне « Переменные среды » в разделе « Системные переменные» выберите « Путь» и нажмите кнопку « Изменить» .
    f. В редактируемой системной переменнойдиалоговом окне, добавьте каталог в поле значения переменной . Используйте точку с запятой, чтобы отделить его от других записей в списке.
    грамм. Щелкните OK, чтобы закрыть диалоговое окно Edit System Variable .
    час Нажмите ОК, чтобы закрыть диалоговое окно « Переменные среды ».
    я. Нажмите ОК, чтобы закрыть диалоговое окно Свойства системы .
  13. Теперь используйте любой метод для запуска вашего приложения. Visual Studio запустится и загрузит приложение.

Надеюсь, что это поможет кому-нибудь еще в будущем!

Хауке П.
источник
3
Вот инструкции для того же процесса с более новыми версиями VS (до 2019 г.): docs.microsoft.com/en-us/visualstudio/debugger/…
brichins
3

Если процесса нет, Visual Studio не сможет к нему подключиться .

Тем не менее, вы можете установить программу запуска вашего проекта, отличную от вывода вашего проекта.

ChrisF
источник
Я уже исследовал, правильно ли то, что я хочу делать, и на самом деле это так. Моя ситуация не является обычным случаем отладки Visual Studio. У меня есть проект шаблона Excel 2010, разработанный в Visual Studio, и в таблицах шаблонов есть события запуска. Я запускаю этот шаблон из Visual Studio, добавляю данные в свои таблицы Excel и сохраняю файл на диске. Тогда единственный способ открыть этот файл, который также зависит от сборки шаблона, - это открыть его из проводника, поэтому в этом случае я не могу отлаживать события запуска, и, конечно, у меня есть некоторая обработка данных при запуске, например привязка данных.
Ucodia
Может потребоваться установить флажок «Включить отладку собственного кода» (Свойства проекта → ОтладкаВключить отладчики ).
Питер Мортенсен
3

Вы можете показать MessageBox, это заблокирует приложение, затем вы присоединяете или повторно подключаете отладчик к процессу и нажимаете ОК, чтобы продолжить:

MessageBox.Show("Attach process to debugger and click ok!");

вы можете добавить его в конструктор формы (если вы используете winforms), чтобы он выполнялся раньше всего, кроме инициализации компонентов:

public MainForm()
{
    InitializeComponent();
    MessageBox.Show("Attach process to debugger and click ok!");
}

Когда вы закончите отладку, закомментируйте эту строку.

Raynet
источник
3

Вы можете запустить отладчик из своего кода через

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

Но не убирайте эту строку перед отправкой вашего приложения. Может быть, вы хотите использовать флаги компилятора, чтобы быть уверенным:

    public static void Main(string[] args)
    {
      #if debug
      System.Diagnostics.Debugger.Launch();
      #endif
    }
Кто-то
источник
2
Это должен быть принятый ответ для всех случаев, когда вы ждете, пока какой-то внешний процесс запустит ваше приложение.
TravelingFox
2

Одно маленькое решение, которое может подойти многим.

  • в первой строке кода, который будет запускать exe, добавьте эту команду

    System.Threading.Thread.Sleep (20000)

Это заставит exe спать на 20 секунд, прежде чем он начнет что-либо обрабатывать. Затем у вас есть 20 секунд, чтобы присоединиться к процессу, что можно быстро сделать с помощью ctrl + alt + p, затем найдите процесс, затем введите, чтобы присоединиться.

Не так много ответа, но мне понравилось: -)

user2728841
источник
Мне пришлось отлаживать CGI, написанный на «C», для которого у меня был исходный код. У меня было простое и легкое решение, чтобы успеть подключиться к фоновому процессу.
Joël Hecht