在VS2010中,有没有办法知道给定的w3wp.exe正在服务哪个应用程序池,然后决定将调试器附加到?

时间:2010-04-16 16:00:40

标签: debugging visual-studio-2010 process w3wp

所以我正在调试一些在不同的apppool中本地运行的网站(一个来自trunk,一个来自分支)。我在两个VS实例中打开了主干和分支解决方案。我想在一个中调试trunk,在另一个中调试。我想知道是否有办法知道每个w3wp.exe正在服务的应用程序池,知道在连接调试器时哪个应用程序池。

更新:这一点是在VS中编写一个宏,然后让我有一个按钮(每个有趣的应用程序池),可点击以附加调试器。所以解决方案最好不要涉及其他程序。

Update2:这是针对IIS7的Windows 7。

5 个答案:

答案 0 :(得分:4)

以下是我的核心宏。写一些单行调用它,比如AttachToW3wp("DefaultAppPool")命名你感兴趣的每个应用程序池,并为它们制作按钮和热键。

    Private Sub AttachToW3wp(ByVal appPoolName As String)
    Const processName As String = "w3wp.exe"
    Dim userName As String = String.Format("IIS APPPOOL\{0}", appPoolName)

    Try
        Dim debugger As EnvDTE90.Debugger3 = CType(DTE.Debugger, EnvDTE90.Debugger3)
        'debugger.DetachAll()

        Dim transport As EnvDTE80.Transport = debugger.Transports.Item("Default")
        Dim qualifier As String = Environment.MachineName '= My.Computer.Name
        Dim engines(3) As EnvDTE80.Engine
        engines(0) = transport.Engines.Item("Managed")
        engines(1) = transport.Engines.Item("Script")
        engines(2) = transport.Engines.Item("T-SQL")

        Dim successMessage As String = String.Empty
        For Each process As EnvDTE80.Process2 In debugger.GetProcesses(transport, qualifier)
            With process
                Dim fi As New System.IO.FileInfo(.Name)
                If fi.Name = processName AndAlso (String.Compare(.UserName, 0, userName, 0, Len(userName), True) = 0) Then
                    If .IsBeingDebugged Then Throw New Exception(String.Format("{0} {1} is already attached to a debugger.", processName, userName))

                    process.Attach2(engines)
                    successMessage = String.Format("Attached to {0} for {1} ({2})", processName, userName, .ProcessID)

                    Exit For
                End If
            End With
        Next

        If successMessage = String.Empty Then
            Throw New Exception(String.Format("{0} {1} not found.", processName, userName))
        Else
            Trace.WriteLine(successMessage)
        End If

    Catch ex As System.Exception
        MsgBox(ex.Message)
    End Try
End Sub

答案 1 :(得分:1)

查看此question的答案。您可以从命令窗口运行内置脚本来执行此操作。

答案 2 :(得分:1)

另一个选项是Visual Studio库中提供的WADA - W3WP Advanced Attacher。我通过在Extension Manager的在线图库中搜索“附加工作者”来找到它。

答案 3 :(得分:0)

如果您可以在每个分支上执行请求,您可以使用类似Process Explorer或任务管理器的内容来查看哪个ID可能占用当前处理请求的CPU周期,假设您可以得到这样的分离。

答案 4 :(得分:-1)

您可以使用任务管理器查看运行进程的用户名(通常与应用程序池名称相同)和进程ID,但您必须在任务管理器中打开这些列,并且进程名称也必须与应用程序池相同(据我所知,这是默认值) 另请注意,此页面上列出的所有方法可能只显示当前正在运行的进程,这意味着如果您的特定进程由于空闲时间而关闭,则您首先要使用该站点以便将该进程放入列表中,在您的情况下,这意味着您应首先访问所有网站,以确保与其关联的流程正在运行。