Процессы отладки, порожденные другим - PullRequest
4 голосов
/ 13 марта 2012

Я написал программу, которая порождает несколько процессов.

По умолчанию Visual Studio не отлаживает новые процессы - только оригинальный процесс, который создал новые.

Есть ли способ автоматически подключать Visual Studio к процессам при их создании в коде?

Ответы [ 3 ]

3 голосов
/ 13 марта 2012

От: отладка процесса, созданного с помощью CreateProcess в Visual Studio

Вы можете временно вызвать вызов DebugBreak () где-нибудь в коде запуска вашего дочернего процесса.Это заставит Windows запросить вас, если вы хотите отладить этот процесс.

РЕДАКТИРОВАТЬ: Поскольку оба проекта находятся в одном решении, настройте VS для отладки нескольких проектов :(VS2010) Щелкните правой кнопкой мыши узел решения в Solution Explorer
Выберите Set Startup Projects...
В диалоговом окне выберите Multiple startup projects переключатель
В сетке проекта измените Action для всех проектов, которые вы хотитеотладка до Start

2 голосов
/ 13 марта 2012

Это все еще обеспечивает приглашение, но прикрепляет отладчик:

if (!Debugger.IsAttached && DebuggerFlagSet()) Debugger.Launch();

и затем в родительском процессе

if(Debugger.IsAttached)
    SetDebuggerFlag()

Вам понадобится механизм для флага отладчика, такойкак файл на диске / ключ reg / мьютекс и т. д.

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

1 голос
/ 14 марта 2012

Для этого вам нужно написать надстройку VS или пакет VS, потому что вы захотите сидеть в фоновом режиме и ждать загрузки дочерних процессов.

Вот общий рецепт того, что вы хотите сделать:

  1. Получить идентификатор процесса отладки (т. Е. uint processID = DTE.Debugger.CurrentProcess.ProcessID)
  2. Добавьте ссылку на System.Management и используйте ManagementEventWatcher для прослушивания создания новых процессов, как описано в этой теме . Ваш запрос должен быть "SELECT ProcessID FROM Win32_ProcessStartTrace WHERE ParentProcessID = " + processID
  3. Когда новый дочерний процесс загружается, найдите его по его идентификатору процесса в DTE.Debugger.LocalProcesses, а затем вызовите .Attach().
...