debugging a process spawned with CreateProcess in Visual Studio

I've created a Windows/C++/WTL application that spawns a child process. The two processes communicate via anonymous pipes.

I'd like to be able to debug the child process.

Since both parent and child projects are in the same solution in Visual Studio 2008, is there any way to tell VS2008 that I'd like the debugger to debug both processes?

When I start the debugger with the parent process, the debugger won't break on any breakpoints in the child process code.

And since the child process is spawned by the parent process, I can't think of an easy way of attaching the child process (maybe via another instance of VS2008) when it's spawned.

Any insights greatly appreciated!

14
задан 26 August 2010 в 12:03
поделиться

3 ответа

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

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

изменить: В качестве примера, что-то вроде этого, не проверено:

// 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 или проверками переменных среды.

3
ответ дан 1 December 2019 в 13:20
поделиться

Множество вариантов:

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

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

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

  • Существует надстройка VS, что еще проще, сам еще не пробовал.
12
ответ дан 1 December 2019 в 13:20
поделиться

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

4
ответ дан 1 December 2019 в 13:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: