6

Normalmente estoy desarrollando aplicaciones web, y una cantidad sorprendentemente grande de mi tiempo de trabajo se gasta haciendo "Ctrl + Alt + P", ordenando por Nombre del proceso y seleccionando w3wp.exe para adjuntar mi depurador.¿Cómo puedo hacer una macro de Visual Studio para adjuntar el depurador a todas las instancias de w3wp.exe?

Para empeorar las cosas, estoy trabajando en una aplicación que abarca varios grupos de aplicaciones, por lo que normalmente tengo 2 o 3 instancias de w3wp.exe, y es imposible saber a cuál adjuntar, por lo que normalmente finalizo adjuntar a todos ellos, que es excesivo pero funciona.

Con todo, esto es bastante molesto ...

Mi colega encontró una manera de tener un VS Macro para fijar automáticamente a W3WP.exe (que básicamente grabó este):

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 

No estoy seguro de si todo lo que es necesario, o lo que sea, nunca he creado una macro para VS, realmente no sé por dónde empezar.

Habría una manera de modificar esta macro para que en lugar de unir a sí una instancia de w3wp.exe, que se adhiere a todas las casos de w3wp.exe?

+0

esta característica realmente debería ser parte de Visual Studio. ¿Alguien quiere hacer un problema de conexión o verificar uno existente? –

Respuesta

8
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 
+0

Vaya más lejos y asígnelo a una barra de herramientas ... desplácese hasta la parte inferior de esta publicación: http://www.milkcarton.com/blog/2007/05/20/Using+Visual+Studio+Macros+To+Increase+Productivity.aspx –

+0

Parece que la URL de este blog ha cambiado, por lo que el pensamiento vale la pena actualizando para que no tenga que encontrarlo como yo. http://www.milkcarton.com/blog/default,month,2007-05.aspx – Cragly

+2

Use 'System.Environment.MachineName' en lugar de ComputerName – Jeremy

0

Es posible que desee comprobar gflags.exe. Una de sus opciones es un depurador para ejecutar asociado a cada invocación de un ejecutable en particular.

+0

No estoy muy seguro de que funcione ... ¿Qué es lo que va a hacer? ¿Abra una nueva instancia de Visual Studio cada vez que se ejecute w3wp.exe? Necesito varios procesos w3wp.exe conectados a la misma instancia de VS, y necesito que sea LA instancia en la que tengo mi proyecto cargado ... –

1

Sé que está buscando una macro para esta tarea, y tengo macros similares. Sin embargo, me gustaría explicar una forma de adjuntar el depurador a los proyectos en su solución cuando comience a depurar.

Es una característica poco conocida: si hace clic derecho en el archivo de solución en el navegador de la solución, elija propiedades, puede definir varios proyectos de inicio y su acción. Su depurador se adjuntará a los proyectos enumerados cuando lo ejecute.

Nota: Si tiene un servicio web, se abrirá una ventana del navegador, sin embargo, puede desactivarlo en las propiedades del proyecto diciéndole que no abra una ventana.

1

Así me conecto a un proceso w3wp remoto. Funciona un poco más rápido que la solución de DanC y tiene un manejo extra de errores.

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 
Cuestiones relacionadas