отладка процесса, созданного с помощью CreateProcess в Visual Studio - PullRequest
13 голосов
/ 26 августа 2010

Я создал приложение для Windows / C ++ / WTL, которое порождает дочерний процесс. Два процесса взаимодействуют через анонимные каналы.

Я бы хотел иметь возможность отлаживать дочерний процесс.

Поскольку родительский и дочерний проекты находятся в одном и том же решении в Visual Studio 2008, есть ли способ сообщить VS2008, что я бы хотел, чтобы отладчик отлаживал оба процесса?

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

И так как дочерний процесс порожден родительским процессом, я не могу придумать простой способ присоединения дочернего процесса (возможно, через другой экземпляр VS2008), когда он порожден.

Любые идеи с благодарностью!

Ответы [ 3 ]

12 голосов
/ 26 августа 2010

Множество опций:

  • Вы можете отлаживать несколько .exes с одним экземпляром отладчика, используя Debug + Attach.Однако я всегда использую два экземпляра Visual Studio, во втором - Debug + Attach.

  • Вы можете поместить __debugbreak () в дочерний код, окно отладчика JIT предложит вам выбрать отладчик.

  • Вы можетеиспользуйте раздел реестра «Параметры выполнения файла изображения», чтобы автоматически запускать отладчик, как только запускается дочерний файл .exe.Добавьте ключ с именем HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Параметры выполнения файла образа \ YourApp.exe, установите для его значения «Отладчик» значение «vsjitdebugger.exe»

  • Существует Надстройка VS , которая еще проще, еще не пробовала сама.
4 голосов
/ 26 августа 2010

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

3 голосов
/ 27 августа 2010

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

Обратите внимание, что вы пропустите все, что происходит до main в дочернем процессе.

edit: Например, что-то вроде этого, не проверено:

// parent.cpp
HANDLE hMutex = ::CreateMutex(NULL, TRUE, "Global\\some_guid");
::CreateProcess(...);
::ReleaseMutex(hMutex); // breakpoint here
::CloseHandle(hMutex);

// child.cpp
int main(...)
{
  HANDLE hMutex = ::OpenMutex(MUTEX_ALL_ACCESS, FALSE, "Global\\some_guid");
  ::WaitForSingleObject( hMutex, INFINITE );
  ::CloseHandle(hMutex);

  ...
}

Возможно, вы захотите обернуть его с помощью #if _DEBUG или проверки переменных среды.

...