1

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

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

Update2:这是针对 IIS7 的 Windows 7。

4

5 回答 5

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
于 2011-02-03T23:24:14.377 回答
1

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

于 2010-04-16T16:05:48.803 回答
1

另一种选择是Visual Studio Gallery 中提供的WADA - W3WP Advanced Attacher 。我通过在 Extension Manager 的 Online Gallery 中搜索“attach worker”找到了它。

于 2012-02-24T16:49:49.803 回答
0

如果您可以在每个分支上执行请求,则可以使用Process Explorer或 Task Manager 之类的工具来查看哪个 ID 可能是哪个 ID,因为假设您可以获得这样的分离,可能会占用当前正在处理请求的 CPU 周期。

于 2010-04-16T16:03:54.427 回答
-1

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

于 2011-12-08T20:16:46.703 回答