Отладка процесса, созданного с помощью CreateProcess в Visual Studio
Я создал приложение Windows/С++/WTL, которое порождает дочерний процесс. Эти два процесса взаимодействуют через анонимные каналы.
Я хотел бы иметь возможность отлаживать дочерний процесс.
Поскольку оба родительских и дочерних проекта находятся в одном и том же решении в Visual Studio 2008, есть ли способ сообщить VS2008, что я хотел бы отладчик отлаживать оба процесса?
Когда я запускаю отладчик с родительским процессом, отладчик не будет разбивать какие-либо точки останова в коде дочернего процесса.
И поскольку дочерний процесс порождается родительским процессом, я не могу придумать простой способ привязки дочернего процесса (возможно, через другой экземпляр VS2008), когда он появился.
Любое понимание очень ценится!
Ответы
Ответ 1
Вы можете поместить глобальный именованный мьютекс вокруг вашего вызова CreateProcess
, а затем попытаться захватить мьютекс в дочернем процессе. Если вы затем положите точку останова на вызов CreateProcess
, у вас должно быть время для присоединения к ребенку, прежде чем он сделает что-нибудь существенное.
Обратите внимание, что вы пропустите все, что происходит до main
в дочернем процессе.
edit: В качестве примера, что-то вроде этого, untested:
// 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
или среды.
Ответ 2
Множество опций:
-
Вы можете отлаживать несколько EXE с одним экземпляром отладчика с помощью Debug + Attach. Однако я всегда использую два экземпляра Visual Studio, используйте Debug + Attach во втором.
-
Вы можете поместить в дочерний код __debugbreak(), окно отладчика JIT предложит вам выбрать отладчик.
-
Вы можете использовать раздел реестра "Параметры файла образа", чтобы автоматически запускать отладчик, как только запускается дочерний .exe. Добавьте ключ с именем HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Варианты исполнения файла изображения \YourApp.exe, установите для параметра "Отладчик" значение "vsjitdebugger.exe"
- Существует надстройка VS, которая упрощает процесс, пока еще не пробовала.
Ответ 3
Вы можете временно вызвать вызов DebugBreak()
где-то в стартовом коде вашего дочернего процесса. Это заставит Windows запрашивать, хотите ли вы отладить этот процесс.