2009-09-26 20 views
16

Me gustaría depurar una aplicación .NET que falla inmediatamente al inicio (y existe sin un mensaje de error o registro), pero no puedo adjuntar un depurador porque el proceso existe casi inmediatamente después de que lo ejecute. No tengo el código fuente de la aplicación, así que no puedo hacer "Iniciar la depuración". He intentado utilizar un estudio macro de Visual para iniciar un proceso, se adhieren a ella, a continuación, romper, pero la macro es demasiado lento y por el tiempo que se encuentre el proceso, el proceso ya ha salido:Cómo adjuntar un depurador en la creación del proceso?

Imports System 
Imports EnvDTE80 
Imports EnvDTE90 
Imports System.Diagnostics 

Public Module Module1 
    Sub RunAndAttach() 
     Try 
      Dim dbg As Debugger3 = DTE.Debugger 
      Dim trans As Transport = dbg.Transports.Item("Default") 
      Dim sysProc As Process = System.Diagnostics.Process.Start(New ProcessStartInfo("C:\Temp\CrashingApp.exe") With {.WorkingDirectory = "C:\Temp"}) 
      Dim proc As EnvDTE90.Process3 = dbg.GetProcesses(trans, "ALLON-PC").Item("CrashingApp.exe") 
      If (Not sysProc.HasExited) Then 
       proc.Attach() 
       proc.Break(False) 
      Else 
       MsgBox("Process " + proc.Name + " has already has exited.") 
      End If 
     Catch ex As System.Exception 
      MsgBox(ex.Message) 
     End Try 
    End Sub 

End Module 

¿Existe una forma de conectar el depurador a un proceso recién creado, como lo hace F5?

Gracias!

Respuesta

20
  1. Cree un nuevo proyecto (un proyecto de consola está bien).
  2. Haga clic derecho en el proyecto y elija "Propiedades".
  3. Haga clic en la pestaña "Depurar".
  4. Elija "Iniciar programa externo:"
  5. Seleccione el programa.
  6. Hit F5.
+1

Buen truco! Solo en mi caso, presionar F5 habría ejecutado el programa y luego saldría inmediatamente. En cambio, usar Step Into provocó que el depurador se rompa al principio de Main(). ¡Gracias! –

1
  1. Puede usar windbg para comenzar el proceso.
  2. Puede usar reflector para descompilar y obtener la fuente y continuar desde allí.

Otra idea es utilizar process monitor para ver lo que el proceso está tratando de hacer. El error es probablemente causado por una dependencia en algo externo. Y el monitor de procesos puede ayudarlo a localizarlo.

Actualización: Puede usar el complemento reflector FileDisassembler para crear la solución completa y depurarla desde allí.

+0

Monitor de procesos: Probé eso. No hay fallas, alguna lógica interna toma la decisión de abandonar. P.ej. ProcMon no ayudaría si la aplicación al inicio se cierra si es un sábado. Reflector: la aplicación P/invoca en DLL no administradas y almacena el resultado en una variable local que no puedo ver su contenido debido a que no puedo adjuntar un depurador administrado. –

+0

También sobre el reflector: si quería volver a crear la solución de los desmontajes, ¿cómo puedo conseguir que descompile todo el conjunto y guarde todos los archivos fuente en el disco? ¿O necesito copiar/pegar manualmente cada clase y método? –

+0

El plugin FileDisassembler Reflector fue bastante útil, ¡gracias por eso! Mientras estaba en la carpeta Plugnis noté que Deblector, un plugin de depuración que desafortunadamente no era muy útil, y Reflexil, que le permite inyectar instrucciones MSIL.Acabo de inyectar un MessageBox.Show ("Adjuntar ahora.") Como la primera instrucción en Main(), que te da tanto tiempo como necesites para adjuntar el depurador (hasta que presionas OK), pero por supuesto el método de John es superior . –

3

El depurador requiere una cierta cantidad de procesamiento antes de que se pueda conectar. Por ejemplo, en ASP.Net, es difícil depurar eventos de "Application_Start" en IIS, porque es demasiado pronto: la aplicación debe iniciarse antes de que se pueda adjuntar un depurador.

Sin embargo, puede ejecutar su programa en Windbg y obtener una interrupción inmediata o un volcado de memoria. Hay un great tutorial on setting up windbg here, y en algunos de los comentarios en la publicación hay instrucciones sobre cómo ejecutar su .exe dentro de windbg y obtener un volcado inmediato.

+4

Puede depurar Application_Start iniciando la aplicación web desde Visual Studio configurándola como el proyecto de inicio, o colocando Debugger.Break() dentro de Application_Start y luego adjuntándola al tocar el diálogo de depuración. – adrianbanks

+0

Buen punto en Debugger.Break(). – womp

+0

Ambos no son opciones ya que no tengo el código fuente. Voy a intentar windbg. ¿Puedo usar VS para depurar un proceso al que está conectado windbg? De lo contrario, ¿qué utilidad tiene windbg en la depuración de un ensamblado administrado (vigilancia de variables locales, pila de llamadas, etc.)? –

0

Creo que puedes hacer simplemente "Archivo \ Abrir \ Proyecto/Solución", seleccionar el .exe como la "solución", y luego presionar F5.

+0

Ya lo intenté. Abrir> Proyecto/Solución no le permite abrir EXEs, y Abrir> Archivo simplemente muestra los recursos dentro de ese archivo, pero no le permite depurar. –

+0

Funciona para mí, hm. – Brian

+0

¿Con qué versión de Visual Studio? –

Cuestiones relacionadas