Отладка процесса, созданного с помощью 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 запрашивать, хотите ли вы отладить этот процесс.