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