在Visual Studio调试期间自动附加到子进程

36

当编写媒体中心插件时,你的插件托管在ehexthost.exe中,这个exe从ehshell.exe启动,你无法直接启动它,相反,你需要向ehshell.exe传递一个特殊参数,该参数将在单独的进程中启动插件。

当我们调试媒体浏览器时,我发现附加到第二个进程的过程有点笨拙,我知道Debugger.Attach以及一些特殊的注册表条目可以使用。

这两种方法都不完全符合我的要求。我想要的是按下F5键,让我的当前实例的Visual Studio自动附加到子进程。这可行吗?

如果有VS插件可以实现这个功能,我会很高兴使用它。

编辑

最终,我选择了以下宏:

Public Sub CompileRunAndAttachToEhExtHost()

    DTE.Solution.SolutionBuild.Build(True)
    DTE.Solution.SolutionBuild.Debug()

    Dim trd As System.Threading.Thread = New System.Threading.Thread(AddressOf AttachToEhExtHost)
    trd.Start()

End Sub

Public Sub AttachToEhExtHost()
    Dim i As Integer = 0
    Do Until i = 50
        i = i + 1
        Try

            For Each proc As EnvDTE.Process In DTE.Debugger.LocalProcesses
                If (proc.Name.IndexOf("ehexthost.exe") <> -1) Then
                    proc.Attach()
                    Exit Sub
                End If
            Next
        Catch e As Exception
            ' dont care - stuff may be busy 
        End Try
        Threading.Thread.Sleep(100)
    Loop
End Sub

此外,我在我的博客上概述了如何启动此过程


1
有了新的Debugger2接口,还有另一种方法,http://www.codeplex.com/lazy/SourceControl/changeset/view/20095#307770 - Pablo Retyk
使用Debugger2接口是否有优势? - Sam Saffron
是的,你可以不用循环DTE.Debugger.LocalProcesses,而是直接获取进程proc = debugger2.GetProcesses(trans, "").Item(processName)。 - Pablo Retyk
我的VB语言有点生疏 - 我收到了“名称'proc'未声明”的错误提示 - 你有什么想法需要修复吗? - Tim
搞定了。应该是以下内容: 对于每个 proc As EnvDTE.Process 在 DTE.Debugger.LocalProcesses 中。 - Tim
5个回答

38

我会使用宏。我已经重新定义了我的F5函数,使其连接到ASP.NET进程,而不是通常执行的长时间构建/验证。这对我来说效果非常好,而且非常容易。

    For Each process In DTE.Debugger.LocalProcesses
        If (process.Name.IndexOf("aspnet_wp.exe") <> -1) Then
            process.Attach()
            Exit Sub
        End If
    Next

谢谢,我用这个工具来附加到 WebDev.WebServer 和 IE,当我按下 F4 时。 - Allen Rice
2
有什么建议吗?现在VS2012已经删除了宏,该怎么做呢? - mutex
你实际上不再需要这样做了!至少对于我所需的内容来说是这样。他们为Web项目添加了一个新选项:“不打开页面。等待外部应用程序的请求。”在项目-> Web设置下。但如果我需要连接到非Web进程,我不确定该怎么做。抱歉! - Jab

14

对于VS2012,宏已经被取消了,但可以使用标准键盘快捷方式来快速完成操作。例如,要附加到iisexpress.exe:

Ctrl + Alt + p - 弹出“附加进程”对话框

i - 跳转到列表中以i开头的第一个进程(对我而言是iisexpress.exe)

Enter - 附加

为了更快地完成操作,您还可以关闭调试IIS时的Visual Studio附加安全警告


11

请查看我编写的VisualStudio插件,名为Lazy


谢谢,我写这个代码的时候遇到了类似你的情况。我的进程被其他进程调用,我需要调试进程的初始化,所以我需要在它启动时附加它。如果你有任何问题,请告诉我。"在我的机器上可以运行" - Pablo Retyk
1
安装后,它只在VS2008中显示,而不在VS2010中显示。 - Andreas Haferburg
嘿 @pablito,你有计划将你的插件移植到VS2010/2012+吗? - Bora
我已经很久没有更新它了,但由于一些人似乎感兴趣,我很快就会将其移植到vs2010/12。 - Pablo Retyk

2
我正在调试一个在外部生成的进程中的C++插件,该进程在启动时抛出异常导致崩溃,以下方法对我非常有效:
添加免费的Visual Studio Reattach Extension。在启动进程之前,要求它重新附加到进程名称。它会弹出一个模态对话框,表示正在等待进程名称启动。
现在启动进程,Visual Studio调试器将立即附加,捕获异常并触发断点。
(这也是在媒体插件中,异常通常由Delphi上下文中的宿主进程捕获并重新抛出,因此我需要在此之前中断)。

0

如果你在Visual Studio中设置了类似的内容,你可以通过按F5自动附加到一个进程:

http://vvcap.net/db/ujYL7zeN_n_RgeprqCSM.htp

注意:将“Command”填写为可执行文件名,“Attach”必须为“yes”


谢谢!但是这个技巧对于C#项目不起作用,你在调试列表中没有这样的选项,只有启动外部程序的选项。 - Sam Saffron
我想我知道你的意思...你可以创建一个“虚拟”的C++项目并将其添加到你的解决方案中。只要它连接到正确的可执行文件,你就可以进行调试了。 - galets

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接