2012-03-13 64 views
4

我写了一个程序,产生了一些进程。由另一个产生的调试进程

默认情况下,Visual Studio不会调试新进程 - 只有创建新进程的原始进程。

有没有办法在代码中自动将Visual Studio连接到创建时的进程?

+0

既然你要求的VS选项,我只是要提到这是一个评论。 WinDbg + SOS允许您自动附加到子进程。 – 2012-03-13 16:50:04

+0

第二个过程是同一个解决方案中的项目吗? – 2012-03-13 16:55:52

+0

@Boo是的,它是。 – 2012-03-13 20:19:25

回答

1

为此,您必须编写VS加载项或VS包,因为您需要坐在后台并等待子进程加载。

这里是你想做的事一般配方:

  1. 获取调试进程的ID(即uint processID = DTE.Debugger.CurrentProcess.ProcessID
  2. 添加引用System.Management和使用ManagementEventWatcher听用于在this thread中描述的新工艺创建。你的查询应该是"SELECT ProcessID FROM Win32_ProcessStartTrace WHERE ParentProcessID = " + processID
  3. 当一个新的子进程加载时,通过它的processID找到它DTE.Debugger.LocalProcesses,然后调用.Attach()就可以了。
3

来源:debugging a process spawned with CreateProcess in Visual Studio

您可暂时将在调用的DebugBreak()某处你的子进程的 启动代码。如果您想调试该进程,这将导致Windows提示 。

编辑: 由于这两个项目都在同一个解决方案,为多项目的调试配置VS: (VS2010) 语境单击Solution Explorer
解决方案节点选择Set Startup Projects...
在对话框选择Multiple startup projects单选按钮
在项目网格中将所有希望调试的项目更改为ActionStart

+0

我不想临时做点什么;在我的父进程中,我想检查它是否正在调试并自动附加调试器。 – 2012-03-13 16:39:14

+0

那么这个答案可以解决它从孩子方面..但'临时'是关于你是否删除代码或完全取决于你。 – 2012-03-13 16:43:30

+1

即使使用弹出窗口,它将成为第二个调试器,而不是主调试器实例。 – 2012-03-13 16:53:39

2

这仍然提供了一个提示,但不附加调试:

if (!Debugger.IsAttached && DebuggerFlagSet()) Debugger.Launch(); 

,然后在父进程

if(Debugger.IsAttached) 
    SetDebuggerFlag() 

你需要为调试标志的机制,如磁盘上的文件/ reg键/互斥等。

正在启动的调试器将不会与初始实例相同。

相关问题