我创建了一个生成子进程的 Windows/C++/WTL 应用程序。 这两个进程通过匿名管道进行通信。
我希望能够调试子进程。
由于父项目和子项目在 Visual Studio 2008 中位于同一解决方案中,有什么方法可以告诉 VS2008 我希望调试器调试这两个进程?
当我使用父进程启动调试器时,调试器不会在子进程代码中的任何断点处中断。
由于子进程是由父进程生成的,所以我想不出在子进程生成时附加子进程的简单方法(可能通过 VS2008 的另一个实例)。
非常感谢任何见解!
多种选择:
您可以通过使用“调试 + 附加”,使用调试器的一个实例来调试多个 .exe。 然而,我总是使用 Visual Studio 的两个实例,在第二个实例中使用“调试 + 连接”。
您可以在子代码中放置 __debugbreak(),JIT 调试器窗口将提示您选择调试器。
您可以使用“Image File Execution Options”注册表项在子 .exe 启动后自动启动调试器。 添加名为 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\YourApp.exe 的键,将其“Debugger”值设置为“vsjitdebugger.exe”
有一个 VS 插件(适用于 VS 2022,早期版本,另请参阅博客文章)可以让事情变得更容易,我自己还没有尝试过。
您可以在
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
或环境变量检查来包装它。
您可以临时在子进程的启动代码中的某个位置调用
DebugBreak()
。这将导致 Windows 提示您是否要调试该进程。