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

问题描述 投票:0回答:3

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

我希望能够调试子进程。

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

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

由于子进程是由父进程生成的,所以我想不出在子进程生成时附加子进程的简单方法(可能通过 VS2008 的另一个实例)。

非常感谢任何见解!

c++ windows visual-studio debugging ipc
3个回答
15
投票

多种选择:

  • 您可以通过使用“调试 + 附加”,使用调试器的一个实例来调试多个 .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早期版本,另请参阅博客文章)可以让事情变得更容易,我自己还没有尝试过。


4
投票

您可以在

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


4
投票

您可以临时在子进程的启动代码中的某个位置调用

DebugBreak()
。这将导致 Windows 提示您是否要调试该进程。

© www.soinside.com 2019 - 2024. All rights reserved.