调试在Visual Studio中使用CreateProcess生成的进程

时间:2010-08-26 12:03:01

标签: c++ windows visual-studio debugging ipc

我创建了一个生成子进程的Windows / C ++ / WTL应用程序。这两个进程通过匿名管道进行通信。

我希望能够调试子进程。

由于父项目和子项目在Visual Studio 2008中都在同一个解决方案中,有没有办法告诉VS2008我希望调试器调试这两个进程?

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

由于子进程是由父进程生成的,因此我无法想到一个简单的方法来附加子进程(可能通过另一个VS2008实例)。

任何见解都非常感谢!

3 个答案:

答案 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”

  • 有一个VS add-in让它变得更容易,还没有尝试过。

答案 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或环境变量检查包装它。