代码之家  ›  专栏  ›  技术社区  ›  Peter Mounce

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

  •  1
  • Peter Mounce  · 技术社区  · 16 年前

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

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

    更新2:这是针对iis7的windows 7。

    5 回复  |  直到 14 年前
        1
  •  1
  •   JK.    14 年前

    另一个选择是 WADA - W3WP Advanced Attacher 在Visual Studio库中提供。我在扩展管理器的在线图库中搜索“附加工作人员”找到了它。

        2
  •  4
  •   NaN    15 年前

    下面是我的核心宏。写几个单列子调用它,比如 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
    
        3
  •  1
  •   Community Mohan Dere    9 年前

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

        4
  •  0
  •   JB King    16 年前

    如果可以在每个分支上执行请求,可以使用 Process Explorer 或者任务管理器来查看哪个id可能占用当前处理请求的cpu周期(假设您可以获得这样的分离)。

        5
  •  -1
  •   yoel halb    14 年前

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