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

Debugging 在VS2010中,是否有办法知道给定w3wp.exe服务于哪个应用程序池,然后决定将调试器附加到哪个应用程序池?,debugging,visual-studio-2010,process,w3wp,Debugging,Visual Studio 2010,Process,W3wp,所以我正在调试一些网站,一个来自主干,一个来自本地运行的分支,在单独的应用程序池中。我在两个VS实例中打开了主干和分支解决方案。我想在其中调试主干,在另一个中调试分支。我想知道是否有办法知道每个w3wp.exe服务于哪个应用程序池,以及在附加调试器时知道哪个应用程序池是哪个应用程序池 更新:要点是在VS中编写一个宏,然后让我在每个应用程序池中都有一个按钮,可以单击该按钮将调试器附加到其中。因此,解决方案最好不涉及其他项目 更新2:这是在Windows 7上针对IIS7执行的。如果您可以在每个分支

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

更新:要点是在VS中编写一个宏,然后让我在每个应用程序池中都有一个按钮,可以单击该按钮将调试器附加到其中。因此,解决方案最好不涉及其他项目


更新2:这是在Windows 7上针对IIS7执行的。

如果您可以在每个分支上执行请求,您可以使用类似于或任务管理器的工具查看哪个ID,这可能是因为假设您可以获得这样的分离,则可能占用当前处理请求的CPU周期。

如果您可以在每个分支上执行请求,您可以使用诸如或任务管理器之类的工具来查看哪个ID,哪个ID可能占用当前处理请求的CPU周期(假设您可以获得这样的分离)。

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

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

下面是我的核心宏。编写几个单行sub来调用它,比如AttachToW3wpDefaultAppPool,命名您感兴趣的每个应用程序池,并为它们制作按钮和热键

    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

下面是我的核心宏。编写几个单行sub来调用它,比如AttachToW3wpDefaultAppPool,命名您感兴趣的每个应用程序池,并为它们制作按钮和热键

    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

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

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

另一个选项是Visual Studio Gallery中提供的。我通过在Extension Manager的联机图库中搜索attach worker找到了它。

另一个选项是Visual Studio图库中提供的。我通过在Extension Manager的在线图库中搜索attach worker找到了它