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

14 c++ windows debugging ipc visual-studio

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

我希望能够调试子进程.

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

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

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

任何见解都非常感谢!

Han*_*ant 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加载项,使它更容易,但我还没有尝试过.

  • 糟糕,调试+ Windows +模块.点击一下,了解那里有什么. (2认同)

ngo*_*eff 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);

  ...
}
Run Code Online (Sandbox Code Playgroud)

您可能希望#if _DEBUG用环境变量检查来包装它。