Visual Studio: автоматическое присоединение к процессу при его порождении

Я хочу подключиться к процессу (a.exe), как только он будет создан, это выполнимо с VS? Я знаю только название процесса. На самом деле я хочу установить точку останова в коде C#, но код принадлежит другому исполняемому файлу, который будет запущен текущим запущенным приложением (c.exe). Код находится внутри периода инициализации, поэтому я не могу выполнить присоединение вручную.

10 ответов

Решение

Когда я сталкивался с этой ситуацией раньше (и контролировал оба процесса), я нашел достойный обходной путь - это вызвать вызов Debugger.Launch() в точке входа процесса порождения. VS откроет диалоговое окно и позволит вам присоединиться к процессу.

См. Статью MSDN, Как: Автоматически запускать отладчик - это позволит пропустить множество диалоговых окон подтверждения щелчка занятой работой [без отключения UAC или других сообщений]. В статье перечислены следующие шаги:

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

Еще одно приятное решение - использовать расширение Visual Studio "ReAttach". Можно найти здесь.

Если ваш процесс в данный момент не запущен, ReAttach попросит вас запустить его и подключиться к нему, как только он станет доступным.

Я искал способ сделать это, когда я запускаю консольное приложение в рамках приемочного теста.

Я нашел это сегодня - https://blogs.msdn.microsoft.com/visualstudioalm/2014/11/24/introducing-the-child-process-debugging-power-tool/

Это дополнение к визуальной студии, и это работает удовольствие. Когда я отлаживаю приемочный тест (я использую Resharper Test Runner) и помещаю точку останова в приложение, которое запускается, я могу теперь отлаживать приложение в том же экземпляре Visual Studio.

"Entrian Attach" - это надстройка для Visual Studio, которая делает именно это - вы указываете ей имя исполняемого файла, и он присоединяется к отладчику при запуске процесса, независимо от того, как он запущен, до запуска какого-либо кода.

(Раскрытие: я автор. Я создал Attach, потому что у меня постоянно есть эта проблема!)

Вы также можете использовать утилиту gflags.exe, которая поставляется с инструментами отладки Windows, все, что вам нужно сделать, это открыть gflags.exe, затем перейти к файлу изображения, ввести имя процесса (a.exe), нажать вкладку и установить флажок отладчика в TextBox. введите путь vs с помощью параметра / debugexe (т. е. "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe" /debugexe)

Автоматически Visual Studio откроется после запуска процесса, вы можете добавить свои точки останова и нажать Run.

Как насчет этого: открыть проект для a.exe в VS установите точки останова и т. д. Затем откройте " Свойства проекта" для a.exe, вкладку " Отладка " и установите для " Команды" значение c.exe, Затем просто нажмите Отладка.

К сожалению, я никогда не делал этого с управляемыми проектами, поэтому я могу быть не в курсе. Однако именно так я бы поступил с неуправляемыми (C++) проектами. Я думаю, что управляемый отладчик тоже должен его поддерживать.

Начиная с VS 2013 с пакетом обновления 2 (SP2), существует бесплатный инструмент от Microsoft, который делает то же самое, что и "Spawned Process Catcher", упомянутый ранее, - присоединяет все процессы, которые запускаются процессом, уже находящимся в процессе отладки. Примечание: я проверял это только с неуправляемым C++ (это работает безупречно).

Инструмент для отладки дочерних процессов Microsoft

Запись в блоге MSDN

Если код C# запускается неуправляемым кодом, убедитесь, что вы отметили "Отладка неуправляемого кода" @Project properties -> параметры отладки.

Мне действительно понравился Entrian Attach, предложенный @RichieHindle, но я также нашел этот бесплатный инструмент, который делает нечто подобное. Он перехватывает все процессы, запущенные процессом отладки.

Ловец порожденных процессов: https://marketplace.visualstudio.com/items?itemName=Brubtsov.SpawnedProcessCatcher

Другие вопросы по тегам