【问题标题】:debugging a process spawned with CreateProcess in Visual Studio在 Visual Studio 中调试使用 CreateProcess 生成的进程
【发布时间】:2011-04-04 05:49:18
【问题描述】:

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

我希望能够调试子进程。

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

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

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

非常感谢任何见解!

【问题讨论】:

  • 好问题,我在尝试在 VS2008 中调试 apache 模块时偶然发现了这个问题。

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


【解决方案1】:

多种选择:

  • 您可以使用 Debug + Attach 使用一个调试器实例调试多个 .exe。然而,我总是使用两个 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 使它更容易,还没有自己尝试过。

【讨论】:

  • 我有兴趣尝试 Debug + Attach 以便在调试器的一个实例中调试多个 .exe,但我无法确定如何使用生成的子进程来执行此操作由具有 CreateProcess 的父级。根据我之前的评论,DebugBreak() 不起作用,因为源代码在调试器的新实例中不可用。如果我把孩子分成一个单独的解决方案文件,我会更成功吗??
  • Debug + View + Modules,右击 .exe,Symbol Load Information 告诉你它在哪里寻找需要的 .pdb 文件。
  • 对不起,我不懂调试 + 视图 + 模块
  • 我不懂你不懂的。点击菜单项,从“调试”开始。
  • 糟糕,调试 + Windows + 模块。单击一下以了解其中的内容。
【解决方案2】:

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

【讨论】:

  • 好主意,令人惊讶的是 VS2008 / VS2010 没有这种功能 - 我本以为这种东西是一种常见的需求。
【解决方案3】:

您可以在子进程的启动代码中的某处临时调用DebugBreak()。这将导致 Windows 提示您是否要调试该进程。

【讨论】:

  • 我试过这个,windows (7, x64)。当在子进程中调用 DebugBreak() 时,操作系统通过弹出消息框告诉我子进程已停止工作。我选择调试应用程序,我只能在 VS2008 的新实例中启动调试会话。当我这样做时,我无法单步执行代码,因为“当前位置没有可用的源代码”。不错的尝试!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-01
  • 2017-06-28
  • 1970-01-01
  • 2014-09-11
相关资源
最近更新 更多