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!
Вы можете поместить глобальный именованный мьютекс вокруг ваш вызов 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
или проверками переменных среды.
Множество вариантов:
Вы можете отлаживать несколько .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»
Вы можете временно поместить вызов DebugBreak()
в код запуска вашего дочернего процесса. Это заставит Windows предложить вам, хотите ли вы отладить этот процесс.