Visual Studio: автоматическое присоединение к процессу при его порождении
Я хочу подключиться к процессу (a.exe), как только он будет создан, это выполнимо с VS? Я знаю только название процесса. На самом деле я хочу установить точку останова в коде C#, но код принадлежит другому исполняемому файлу, который будет запущен текущим запущенным приложением (c.exe). Код находится внутри периода инициализации, поэтому я не могу выполнить присоединение вручную.
10 ответов
Когда я сталкивался с этой ситуацией раньше (и контролировал оба процесса), я нашел достойный обходной путь - это вызвать вызов Debugger.Launch() в точке входа процесса порождения. VS откроет диалоговое окно и позволит вам присоединиться к процессу.
См. Статью MSDN, Как: Автоматически запускать отладчик - это позволит пропустить множество диалоговых окон подтверждения щелчка занятой работой [без отключения UAC или других сообщений]. В статье перечислены следующие шаги:
- Запустите редактор реестра (regedit).
- В редакторе реестра откройте папку HKEY_LOCAL_MACHINE.
- Перейдите к HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\currentversion\ опции выполнения файла изображения.
- В папке " Параметры выполнения файла изображения " найдите имя приложения, которое требуется отладить, например myapp.exe. Если вы не можете найти приложение, которое хотите отладить:
а. Щелкните правой кнопкой мыши папку " Параметры выполнения файла изображения " и в контекстном меню выберите " Создать ключ".
б. Щелкните правой кнопкой мыши новый ключ и в контекстном меню выберите " Переименовать". с. Измените имя ключа на имя вашего приложения; myapp.exe, в этом примере.- Щелкните правой кнопкой мыши папку myapp.exe и в контекстном меню выберите " Новое значение строки".
- Щелкните правой кнопкой мыши новое строковое значение и в контекстном меню выберите пункт "Переименовать".
- Измените имя на отладчик.
- Щелкните правой кнопкой мыши новое строковое значение и в контекстном меню выберите " Изменить". Откроется диалоговое окно " Редактировать строку ".
- В поле Значение введите vsjitdebugger.exe.
- Нажмите ОК.
- В меню " Реестр" нажмите " Выход".
- Каталог, содержащий vsjitdebugger.exe, должен находиться в системном пути. Чтобы добавить его в системный путь, выполните следующие действия:
а. Откройте панель управления в классическом виде и дважды щелкните значок " Система".
б. Нажмите Расширенные настройки системы.
с. В окне " Свойства системы" перейдите на вкладку " Дополнительно ".
д. На вкладке " Дополнительно " щелкните " Переменные среды".
е. В диалоговом окне " Переменные среды " в разделе " Системные переменные" выберите " Путь", затем нажмите кнопку " Изменить".
е. В диалоговом окне " Редактировать системную переменную " добавьте каталог в поле " Значение переменной". Используйте точку с запятой, чтобы отделить ее от других записей в списке.
г. Нажмите кнопку ОК, чтобы закрыть диалоговое окно " Редактировать системную переменную ".
час Нажмите кнопку ОК, чтобы закрыть диалоговое окно " Переменные среды ". я. Нажмите кнопку ОК, чтобы закрыть диалоговое окно " Свойства системы ".- Теперь используйте любой метод для запуска приложения. 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++ (это работает безупречно).
Если код C# запускается неуправляемым кодом, убедитесь, что вы отметили "Отладка неуправляемого кода" @Project properties -> параметры отладки.
Мне действительно понравился Entrian Attach, предложенный @RichieHindle, но я также нашел этот бесплатный инструмент, который делает нечто подобное. Он перехватывает все процессы, запущенные процессом отладки.
Ловец порожденных процессов: https://marketplace.visualstudio.com/items?itemName=Brubtsov.SpawnedProcessCatcher