【问题标题】:Attaching to a child process automatically in Visual Studio during Debugging调试期间在 Visual Studio 中自动附加到子进程
【发布时间】:2009-01-08 00:30:30
【问题描述】:

为媒体中心编写插件时,您的插件托管在 ehexthost.exe 中,此 exe 从 ehshell.exe 启动,您无法直接启动它,而是将特殊参数传递给 ehshell.exe,它将启动插件在一个单独的过程中。

当我们调试 media browser 时,我发现附加到第二个进程的过程有点笨拙,我知道 Debugger.Attach 以及一些我可以使用的 special registry 条目。

这两种方法都不完全符合我的要求。我想要的是按 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

另外,我在我的博客上概述了如何get this going 的过程。

【问题讨论】:

  • 新的 Debugger2 接口还有其他方法,codeplex.com/lazy/SourceControl/changeset/view/20095#307770
  • 使用Debugger2接口有优势吗?
  • 是的,而不是在 DTE.Debugger.LocalProcesses 上循环,您只需获取进程 proc = debugger2.GetProcesses(trans, "").Item(processName)
  • 我的 VB 很生锈 - 我得到“名称 'proc' 未声明” - 关于需要修复什么的任何想法?
  • 想通了。应该如下: For Each proc As EnvDTE.Process In DTE.Debugger.LocalProcesses

标签: c# .net visual-studio debugging visual-studio-debugging


【解决方案1】:

我会使用宏。我重新定义了我的 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

【讨论】:

  • 谢谢,当我按下 F4 时,我用它来附加到 WebDev.WebServer 和 IE
  • 有什么建议可以在 VS2012 中执行此操作,因为他们已经删除了宏?
  • 您实际上不再需要!至少不是因为我需要它。他们为 Web 项目添加了一个新选项,即“不要打开页面。等待来自外部应用程序的请求”。在项目下-> web 设置。不过,如果我需要附加到非 Web 进程,我不确定该怎么做。对不起!
【解决方案2】:

对于 VS2012,宏已被删除,但您仍然可以使用标准键盘快捷键快速完成。例如,附加到 iisexpress.exe:

Ctrl + Alt + p - 打开附加到进程对话框

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

输入 - 附加

想要超速,也可以Turn off Visual Studio Attach security warning when debugging IIS

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 谢谢,我是在遇到和你类似的场景时写的.如果您有任何问题,请告诉我。 “它在我的机器上工作”
    • 我安装后,它只显示在VS2008,而不是VS2010。
    • 嘿@pablito,你有计划将你的插件移植到VS2010/2012+吗?
    • 好久没更新了,不过好像有人感兴趣我会尽快移植到vs2010/12的。
    【解决方案4】:

    我在一个外部生成的进程中调试了一个 C++ 插件,该进程在启动时抛出异常而崩溃,这对我来说非常有效:

    添加免费的Reattach Extension for Visual Studio。要求它在启动之前重新附加到进程名称。它会弹出一个模式对话框,说它正在等待进程名称启动。

    现在启动进程,Visual Studio 调试器将立即附加,捕获异常并命中断点。

    (这也在媒体插件中,异常通常在 Delphi 上下文中被宿主进程捕获并重新抛出,因此我需要在此之前中断)。

    【讨论】:

      【解决方案5】:

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

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

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

      【讨论】:

      • 谢谢!但是这个技巧不适用于 C# 项目,你在调试列表中没有类似的选项,只有启动外部程序的选项
      • 我想我知道你的意思......你可以创建一个“虚拟”c++ 项目并将其添加到你的解决方案中。只要它附加了一个正确的可执行文件,你就可以调试了。
      猜你喜欢
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 2018-10-15
      相关资源
      最近更新 更多