Как я могу сделать макрос Visual Studio, чтобы прикрепить отладчик ко всем экземплярам w3wp.exe?
-
03-07-2019 - |
Вопрос
Обычно я занимаюсь разработкой веб-приложений, и удивительно большое количество моего рабочего времени тратится на "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. ехе?
Решение
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
Другие советы
Я знаю, что вы ищете макрос для этой задачи, и у меня есть похожие макросы. Однако я хотел бы объяснить способ присоединения отладчика к проектам в вашем решении, когда вы начинаете отлаживать.
Это малоизвестная функция - если вы щелкнете правой кнопкой мыши по файлу решения в браузере решений, выберите «Свойства», затем вы сможете определить несколько проектов запуска и их действие. Ваш отладчик будет подключаться к перечисленным проектам при запуске.
Примечание. Если у вас есть веб-сервис, он откроет окно браузера, однако вы можете отключить его в свойствах проекта, сказав, что он не должен открывать окно.
Вот как я подключаюсь к удаленному процессу 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 Sub
Вы можете попробовать gflags.exe . Один из его вариантов - запуск отладчика, присоединенного к каждому вызову определенного исполняемого файла. Р>