2010-10-05 12 views
6

Tengo una aplicación que se ejecuta alojada en el proceso "w3wp.exe"."Adjuntar al proceso" como un evento posterior a la construcción

Durante la depuración, a menudo me encuentro a mí mismo siguiendo estos pasos:

1 - Hacer un cambio

2 - Generar el proyecto

3 - Unir al "w3wp.exe" utilizando el "adjuntar para procesar el cuadro de diálogo "Herramientas".

4 - Realizar algún tipo de acción en la aplicación para ejecutar el código, por lo que puedo paso a través de él en el depurador

me gustaría para automatizar el paso 3 en la secuencia de comandos posterior a la generación, por lo que el IDE se conecta automáticamente al proceso una vez que se completa la construcción. Tenga en cuenta que ya lanzo la aplicación como parte del proceso posterior a la creación, por lo que puedo contar con el proceso existente en este momento.

¿Alguien sabe una forma de automatizar el comando "adjuntar al proceso"? Algo de la línea de comandos sería especialmente agradable, pero una macro también lo haría.

Estoy usando Visual Studio 2008 en Windows 7, 64 bit.

Editar @InSane básicamente me dio la respuesta correcta, pero no funciona porque necesito para depurar código administrado, en lugar de código nativo. Parece que vsjitdebugger se establece de forma predeterminada en el código nativo, y por lo tanto mi punto de corte no se golpea. Desde adentro del IDE, puedo especificar "código administrado" y el depurador se adjunta como se esperaba. Entonces, ¿hay alguna manera de apuntar vsjitdebugger al código administrado?

Respuesta

6

que finalmente fue capaz de resolver este problema con un ejemplo que encontré en otro lugar en el Internet. Lo estoy compartiendo aquí ya que esto fue útil para mí.

1 - Cree una nueva aplicación de línea de comandos con el siguiente código (este ejemplo está en 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 - Abrir la solución que desea depurar en Visual Studio

3 - Al final de sus eventos "post-construcción", introduzca una llamada a esta nueva utilidad, como en:

c:\AutoAttach.exe w3wp.exe 20000 

4 - Generar la aplicación

+2

tenemos que actualizar la cadena "VisualStudio.DTE.9.0" para la respectiva versión del estudio visual. Para VisualStudio2012, será "VisualStudio.DTE.11.0" – NavaRajan

+0

Para Visual studio 2015 será "VisualStudio.DTE.14.0" – bluray

2

Puede probar el siguiente comando desde la línea de comandos de Windows.

Si funciona como esperaba, puede ponerlo como parte de sus pasos de postconstrucción.

ProcessID es la ID del proceso que ha iniciado y que desea adjuntar.

vsjitdebugger.exe -p ProcessId 

Otras opciones para el uso de esto desde la línea de comandos incluyen: - alt text

+0

Vota por una sugerencia genial, pero no funciona del todo. Si uso ese comando, me pregunta si quiero usar el depurador actual o iniciar uno nuevo. Elijo el actual, y piensa bastante duro por un tiempo, pero luego aparece cualquier punto de interrupción que he establecido "Actualmente no se alcanzará el punto de interrupción. No se han cargado símbolos para este documento". Si selecciono manualmente el mismo proceso desde dentro del IDE, entonces el punto de interrupción se configura correctamente. ¿Algunas ideas? – JosephStyons

+0

@JosephStyons - No estoy seguro si esto funcionará pero es posible que tenga que especificar la carpeta de símbolos de depuración de antemano en VS -> Opciones -> Depuración -> Símbolos -> Ubicaciones de archivos de símbolos ->. Eso puede ayudar al depurador a saber dónde buscar los símbolos ... – InSane

+0

mismo problema, lo estoy haciendo con un script de PowerShell ejecutado en el evento posterior a la compilación y me pide usar el debuger actual o uno nuevo, pero luego el hitpoint es no golpeado –

0

Aquí se mejora la versión de José. Agregué esto: -dont show console (Configure en su Proyecto en "Aplicación" el Tipo de Salida a "Aplicación de Windows".) - configuro el argumento de la línea de comando de tiempo de espera a 0 (¿por qué es necesario?) - agregué la tercera línea de comando arg url, que se inicia con Firefox, pero solo después de que el sitio se cargó internamente en el programa. esto se debe a que algunos sitios, especialmente dotnetnuke, tardan mucho tiempo en cargarse después de la compilación. así que de esta forma Firefox te llevará al explorador Firefox en primer plano solo después de que todo esté listo para probar, lleva hasta 1 minuto en mi computadora. puedes trabajar en otra cosa mientras tanto. PS. este editor de stackoverflow es un poco tonto. Es por eso que este texto no tiene un formato bonito. si agrego el código de los boletines de lista a continuación, no aparece como código.

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 
Imports System.Collections.Generic 
Imports System.Linq 
Imports System.Text 
Imports System.Net 

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.11.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 
        Exit For 
       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 
     Dim Url As String = "http://www.dnndev.me/" 
     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 

      If Environment.GetCommandLineArgs().Length > 3 Then 
       Url = Environment.GetCommandLineArgs(3) 
      End If 

      Environment.GetCommandLineArgs() 
      AttachToProcess(AppName, TimeOut) 
      'Console.WriteLine("Attached!!") 

      'load site for faster opening later 
      Using client = New WebClient() 
       Dim contents = client.DownloadString(Url) 
      End Using 

      'open site in firefox 
      Dim ExternalProcess As New System.Diagnostics.Process() 
      ExternalProcess.StartInfo.FileName = "c:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe" 
      ExternalProcess.StartInfo.WindowStyle = ProcessWindowStyle.Minimized 
      ExternalProcess.StartInfo.Arguments = "-url " & Url 
      ExternalProcess.Start() 
      'ExternalProcess.WaitForExit() 

     Catch Ex As Exception 
      Console.Write("Unable to Attach to Debugger : " & Ex.Message) 
     End Try 
    End Sub 
End Module 
+0

Esto no me forma. Usando VS2015, ¿podría ser esa la razón? Básicamente use los eventos de compilación para ejecutar un programa, luego este programa para "adjuntar". Agregué un BP a mi proyecto principal pero no se golpea. Puedo hacerlo manualmente sin problema. – AbstractDissonance

1

Aquí hay una función de PowerShell inspirada en @ JosephStyons. Funciona con cualquier versión VS sin cambios.

function Debug-ProcessVS([int] $processId) 
{ 
    $vsProcess = Get-Process devenv | Select-Object -First 1 
    if (!$vsProcess) {throw "Visual Studio is not running"} 
    $vsMajorVersion = $vsProcess.FileVersion -replace '^(\d+).*', '$1' 
    $dte = [System.Runtime.InteropServices.Marshal]::GetActiveObject("VisualStudio.DTE.$vsMajorVersion.0") 
    $debugee = $dte.Debugger.LocalProcesses | ? {$_.ProcessID -eq $processId} 
    if (!$debugee) {throw "Process with ID $processId does not exist."} 
    $debugee.Attach() 
} 
Cuestiones relacionadas