调试过程由另一个人产生

时间:2012-03-13 16:30:01

标签: c# debugging process visual-studio-debugging multiprocess

我写了一个程序,它产生了一些过程。

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

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

3 个答案:

答案 0 :(得分:3)

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

  

你可以暂时调用DebugBreak()中的某个地方   您的子进程的启动代码。这将导致Windows提示   如果你想调试那个过程,你就可以了。

修改 由于两个项目都在同一个解决方案中,因此请为多项目调试配置VS: (VS2010) 在上下文中单击Solution Explorer中的解决方案节点 选择Set Startup Projects...
在对话框中选择Multiple startup projects单选按钮
在项目网格中,将要调试的所有项目的Action更改为Start

答案 1 :(得分:2)

这仍然提供了提示,但确实附加了调试器:

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

然后在父进程中

if(Debugger.IsAttached)
    SetDebuggerFlag()

您需要一种调试器标志的机制,例如磁盘上的文件/ reg key / mutex等。

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

答案 2 :(得分: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. 加载新子进程时,请在DTE.Debugger.LocalProcesses中按其进程ID查找,然后在其上调用.Attach()