Search code examples
.netvisual-studiovisual-studio-2005debuggingvisual-studio-macros

How can I make a Visual Studio Macro to attach the debugger to all instances of w3wp.exe?


I'm normally developing web apps, and a surprisingly large amount of my work time is spent doing "Ctrl + Alt + P", sorting by Process Name, and picking w3wp.exe to attach my debugger.

To make matters worse, I'm working on an app that spans several application pools, so I normally have 2 or 3 instances of w3wp.exe, and it's impossible to know which one to attach to, so I normally end up attaching to all of them, which is overkill but works.

All in all, this is pretty annoying...

My colleague figured out a way to have a VS Macro to automatically attach to w3wp.exe (he basically recorded this):

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

I'm not really sure whether all that is necessary, or anything, I have never made a macro for VS, I don't really know where to start.

Would there be a way to modify this macro so that instead of attaching itself to an instance of w3wp.exe, it will attach itself to all instances of w3wp.exe?


Solution

  • 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