我通常在开发web应用程序,我的工作时间花在"Ctrl + Alt + P“上,按进程名进行排序,并选择w3wp.exe来附加调试器。
更糟糕的是,我正在开发一个跨越多个应用程序池的应用程序,所以我通常有2到3个w3wp.exe实例,并且不可能知道要附加到哪个实例,所以我通常最终会附加到所有应用程序上,这是过分的,但可以工作。
总之,这很烦人.
我的同事想出了一种让VS宏自动附加到w3wp.exe上的方法(他基本上记录了这个):
Sub AttachMacro()
Try
Dim dbg2 As EnvDTE80.Debugger2 = DTE.Debugger
Dim trans As EnvDTE80.Transport = dbg2.Transports.Item("Default")
Dim dbgeng(3) As EnvDTE80.Engine
dbgeng(0) = trans.Engines.Item("T-SQL")
dbgeng(1) = trans.Engines.Item("T-SQL")
dbgeng(2) = trans.Engines.Item("Managed")
Dim proc2 As EnvDTE80.Process2 = dbg2.GetProcesses(trans, "ENIAC").Item("w3wp.exe")
proc2.Attach2(dbgeng)
Catch ex As System.Exception
MsgBox(ex.Message)
End Try
End Sub我不太确定是否所有这些都是必要的,或者其他什么,我从来没有为VS做过宏,我真的不知道从哪里开始。
会有一种方法来修改这个宏,这样它就不会将自己附加到(一个w3wp.exe的实例)上,而是将自己附加到-- w3wp.exe的所有实例上?
发布于 2009-05-07 15:09:01
Sub MacroAttachToAllProcesses()
Try
Dim dbg2 As EnvDTE80.Debugger2 = DTE.Debugger
Dim trans As EnvDTE80.Transport = dbg2.Transports.Item("Default")
Dim dbgeng(3) As EnvDTE80.Engine
dbgeng(0) = trans.Engines.Item("T-SQL")
dbgeng(1) = trans.Engines.Item("T-SQL")
dbgeng(2) = trans.Engines.Item("Managed")
For Each theProcess As EnvDTE80.Process2 In dbg2.GetProcesses(trans, "COMPUTERNAME")
If theProcess.Name.Contains("w3wp.exe") Then
theProcess.Attach2(dbgeng)
End If
Next
Catch ex As System.Exception
MsgBox(ex.Message)
End Try
End Sub发布于 2010-06-21 02:55:16
我知道你正在为这个任务寻找一个宏,而我有类似的宏。但是,在开始调试时,我想解释一种将调试器附加到解决方案中的项目的方法。
这是一个鲜为人知的特性--如果您在解决方案浏览器中右键单击您的解决方案文件,选择属性,然后您可以定义多个启动项目及其操作。在运行调试器时,调试器将附加到列出的项目。
注意:如果您有一个web服务,它将打开一个浏览器窗口,但是您可以通过告诉它不要打开一个窗口而在项目的属性中禁用它。
发布于 2012-04-04 17:56:42
这就是我如何连接到远程w3wp进程的方式。它的运行速度比DanC的解决方案要快一些,而且还有一些额外的错误处理。
Private Sub AttachToW3wp(ByVal machineName As String)
' In order for this to work, you have to be running the Visual Studio 2010 Remote Debugging Monitor
' as your (domain) user.
' It won't work if the remote debugger is running as a service. I've tried every permutation of
' domain and username in the the transport qualifier, tried the obvious local system username,
' even tried looking at the network traffic
' in WireShark, I can't figure it out how to make it work if you are running as a service.
' If you are running the debugger as a service, even running the macro that gets created by VS's
' macro recorder when you attach to a process doesn't work.
Dim transportQualifier = machineName
Try
Dim processToAttachTo As String = "w3wp.exe"
Dim dbg2 As EnvDTE80.Debugger2 = DTE.Debugger
Dim trans As EnvDTE80.Transport = dbg2.Transports.Item("Default")
Dim dbgeng(2) As EnvDTE80.Engine
dbgeng(0) = trans.Engines.Item("T-SQL")
dbgeng(1) = trans.Engines.Item("Managed (v2.0, v1.1, v1.0)")
Dim processesRemote = dbg2.GetProcesses(trans, transportQualifier)
Dim attached As Boolean = False
Dim processRemote As EnvDTE80.Process2
For Each processRemote In processesRemote
' For some reason it takes a much longer time to get the remote process names then it
' does the user name, so let's skip over all the processes that have the wrong UserName.
If processRemote.UserName = "NETWORK SERVICE" AndAlso _
(Right(processRemote.Name, Len(processToAttachTo)) = processToAttachTo) Then
If processRemote.IsBeingDebugged Then
MsgBox(processToAttachTo & " on " & machineName & " is already being debugged")
Else
processRemote.Attach2(dbgeng)
End If
attached = True
End If
Next
If Not attached Then
MsgBox(processToAttachTo & " is not running on " & machineName & ".")
End If
Catch ex As System.Exception
MsgBox("Exception attempting to attach to " & transportQualifier & ": " & ex.Message)
End Try
End Subhttps://stackoverflow.com/questions/822955
复制相似问题