所以我正在调试一些在不同的apppool中本地运行的网站(一个来自trunk,一个来自分支)。我在两个VS实例中打开了主干和分支解决方案。我想在一个中调试trunk,在另一个中调试。我想知道是否有办法知道每个w3wp.exe正在服务的应用程序池,知道在连接调试器时哪个应用程序池。
更新:这一点是在VS中编写一个宏,然后让我有一个按钮(每个有趣的应用程序池),可点击以附加调试器。所以解决方案最好不要涉及其他程序。
Update2:这是针对IIS7的Windows 7。
答案 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,但您必须在任务管理器中打开这些列,并且进程名称也必须与应用程序池相同(据我所知,这是默认值)
另请注意,此页面上列出的所有方法可能只显示当前正在运行的进程,这意味着如果您的特定进程由于空闲时间而关闭,则您首先要使用该站点以便将该进程放入列表中,在您的情况下,这意味着您应首先访问所有网站,以确保与其关联的流程正在运行。