在Visual Studio中debugging使用CreateProcess产生的进程

我创build了一个产生subprocess的Windows / C ++ / WTL应用程序。 这两个进程通过匿名pipe道进行通信。

我想能够debuggingsubprocess。

由于父项目和子项目在Visual Studio 2008中都有相同的解决scheme,有什么办法可以告诉VS2008我希望debugging器debugging这两个过程吗?

当我用父进程启动debugging器时,debugging器不会在subprocess代码中的任何断点上中断。

而且由于subprocess是由父进程产生的,我不能想到一个简单的方法来附加subprocess(可能通过另一个VS2008实例)。

任何见解非常感谢!

你可以在你的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或环境变量检查来包装它。

有很多选择:

  • 您可以通过使用Debug + Attach来调试多个.exes与调试器的一个实例。 然而,我总是使用Visual Studio的两个实例,在第二个中使用Debug + Attach。

  • 你可以在子代码中放一个__debugbreak(),JIT调试器窗口会提示你选择一个调试器。

  • 您可以使用“图像文件执行选项”注册表项来启动子.exe文件时自动启动调试程序。 添加一个名为HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Image File Execution Options \ YourApp.exe的密钥,将其“调试器”值设置为“vsjitdebugger.exe”

  • 有一个VS插件 ,使更容易,还没有尝试过自己呢。

您可以暂时在调用子进程的启动代码中的某处调用DebugBreak() 这将导致Windows提示您是否要调试该进程。