调试由另一个产生的进程
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文件,因为它正由另一个进程使用
c# 读写文件时文件正由另一进程使用,因此该进程无法访问该文件
该进程无法访问该文件,因为它正由另一个进程使用(文件已创建但不包含任何内容)