我创建了一个生成子进程的Windows / C ++ / WTL应用程序。这两个进程通过匿名管道进行通信。
我希望能够调试子进程。
由于父项目和子项目在Visual Studio 2008中都在同一个解决方案中,有没有办法告诉VS2008我希望调试器调试这两个进程?
当我使用父进程启动调试器时,调试器不会在子进程代码中的任何断点上中断。
由于子进程是由父进程生成的,因此我无法想到一个简单的方法来附加子进程(可能通过另一个VS2008实例)。
任何见解都非常感谢!
答案 0 :(得分:12)
有很多选择:
您可以使用Debug + Attach调试多个.exes与一个调试器实例。但是我总是使用两个Visual Studio实例,在第二个实例中使用Debug + Attach。
你可以在子代码中放一个__debugbreak(),JIT调试器窗口会提示你选择一个调试器。
启动子.exe后,您可以使用“映像文件执行选项”注册表项自动启动调试器。添加名为HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Image File Execution Options \ YourApp.exe的密钥,将其“Debugger”值设置为“vsjitdebugger.exe”
答案 1 :(得分:4)
您可以暂时在子进程的启动代码中的某个位置调用DebugBreak()
。如果要调试该过程,这将导致Windows提示您。
答案 2 :(得分:3)
您可以在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
或环境变量检查包装它。