我创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”
您可以暂时在调用子进程的启动代码中的某处调用DebugBreak()
。 这将导致Windows提示您是否要调试该进程。