I have an application that runs hosted under the "w3wp.exe" process.
While debugging, I often find myself following these steps:
1 - Make some change
2 - Build the project
3 - Attach to "w3wp.exe" using the "attach to process" dialog under the Tools menu.
4 - Perform some action in the application to make my code execute, so I can step through it in the debugger
I'd like to automate step 3 in the post-build script, so that the IDE automatically attaches to the process after the build is completed. Note that I already launch the application as a part of the post-build process, so I can count on the process existing at this point.
Does anyone know a way to automate the "attach to process" command? Something from the command line would be especially nice, but a macro would do, too.
I'm using Visual Studio 2008 under Windows 7, 64 bit.
Edit @InSane basically gave me the right answer, but it does not work because I need to debug managed code, rather than native code. It seems that vsjitdebugger defaults to Native code, and thus my breakpoint is not hit. From inside the IDE, I can specify "managed code" and the debugger attaches as expected. So is there any way to point vsjitdebugger to managed code?
I was finally able to solve this problem with an example I found elsewhere on the internet. I'm sharing it here since this was helpful to me.
1 - Create a new command line application with the below code (this example is in VB.NET).
Option Strict Off
Option Explicit Off
Imports System
'On my machine, these EnvDTE* assemblies were here:
'C:\Program Files (x86)\Common Files\microsoft shared\MSEnv\PublicAssemblies
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports System.Diagnostics
Imports System.Threading
Module modMain
Function AttachToProcess(ByVal processName As String, _
ByVal Timeout As Integer) As Boolean
Dim proc As EnvDTE.Process
Dim attached As Boolean
Dim DTE2 As EnvDTE80.DTE2
Try
DTE2 = _
System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.9.0")
For Each proc In DTE2.Debugger.LocalProcesses
If (Right(proc.Name, Len(processName)).ToUpper = processName.ToUpper) Then
proc.Attach()
System.Threading.Thread.Sleep(Timeout)
attached = True
End If
Next
Catch Ex As Exception
Console.Write("Unable to Attach to Debugger : " & Ex.Message)
End Try
Return attached
End Function
Sub Main()
'to call w/ Command Line arguments follow this syntax
'AttachProcess <<ProcessName>> <<TimeOut>>
'AttachProcess app.exe 2000
Dim AppName As String = "w3wp.exe"
Dim TimeOut As Integer = 20000 '20 Seconds
Try
If Environment.GetCommandLineArgs().Length > 1 Then
AppName = Environment.GetCommandLineArgs(1)
End If
If Environment.GetCommandLineArgs().Length > 2 Then
If IsNumeric(Environment.GetCommandLineArgs(2)) Then
TimeOut = Environment.GetCommandLineArgs(2)
End If
End If
Environment.GetCommandLineArgs()
AttachToProcess(AppName, TimeOut)
Console.WriteLine("Attached!!")
Catch Ex As Exception
Console.Write("Unable to Attach to Debugger : " & Ex.Message)
End Try
End Sub
End Module
2 - Open the solution you want to debug in Visual Studio
3 - At the end of your "post-build" events, enter a call to this new utility, as in:
c:\AutoAttach.exe w3wp.exe 20000
4 - Build your application
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With