调试由另一个产生的进程

Posted

技术标签:

【中文标题】调试由另一个产生的进程【英文标题】:Debugging processes spawned by another 【发布时间】:2012-03-13 16:30:00 【问题描述】:

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

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

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

【问题讨论】:

既然您要求提供 VS 选项,我将在评论中提及这一点。 WinDbg + SOS 允许您自动附加到子进程。 第二个流程是同一个解决方案中的项目吗? 【参考方案1】:

发件人:debugging a process spawned with CreateProcess in Visual Studio

您可以临时调用 DebugBreak() 在 您的子进程的启动代码。这将导致 Windows 提示 如果你想调试那个进程,你可以。

编辑: 由于两个项目在同一个解决方案中,所以配置VS进行多项目调试: (VS2010) 右键单击Solution Explorer中的解决方案节点 选择Set Startup Projects... 在对话框中选择 Multiple startup projects 单选按钮 在项目网格中,将您要调试的所有项目的 Action 更改为 Start

【讨论】:

我不想做临时的事情;在我的父进程中,我想检查它是否正在调试并自动附加调试器。 好吧,这个答案从孩子的角度解决了这个问题.. 但Temporary 完全取决于您是否删除代码.. 完全取决于您。 即使有弹出窗口,它也将是第二个调试器,而不是主调试器实例。 根据原始问题,这些进程是由我的主应用程序生成的。我无法在 VS 中启动它。 附带说明一下,通过使用 GFlags bugslasher.net/2011/03/26/…,您可以实现与临时添加 DebugBreak() 相同的效果,但无需更改代码和重新编译【参考方案2】:

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

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

然后在父进程中

if(Debugger.IsAttached)
    SetDebuggerFlag()

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

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

【讨论】:

【参考方案3】:

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

以下是您想要做的一般方法:

    获取被调试进程的ID(即uint processID = DTE.Debugger.CurrentProcess.ProcessID) 添加对 System.Management 的引用并使用ManagementEventWatcher 来监听新进程的创建,如this thread 中所述。您的查询应该是"SELECT ProcessID FROM Win32_ProcessStartTrace WHERE ParentProcessID = " + processID 当一个新的子进程加载时,通过DTE.Debugger.LocalProcesses中的processID找到它,然后在它上面调用.Attach()

【讨论】:

以上是关于调试由另一个产生的进程的主要内容,如果未能解决你的问题,请参考以下文章

IOException:进程无法访问pdf文件,因为它正由另一个进程使用

如何激活Window由另一个进程启动

c# 读写文件时文件正由另一进程使用,因此该进程无法访问该文件

该进程无法访问该文件,因为它正由另一个进程使用(文件已创建但不包含任何内容)

FileStram文件正由另一进程使用,该进程无法访问该文件,解决方法

.net 提示正由另一进程使用,因此该进程无法访问该文件