¿Cómo adjunto Visual Studio a un proceso que aún no se ha iniciado?

89

Tengo un programa .NET que no se puede ejecutar desde Visual Studio por algunas razones (archivo de Excel creado a partir de un proyecto de plantilla de Excel 2010) para el cual necesito depurar eventos de inicio.

Si quiero depurar eventos que vienen después de la inicialización del programa, no hay problema. Ejecuto el programa desde el explorador, adjunto el proceso a Visual Studio y agrego algunos puntos de interrupción en el código. Pero aquí, necesito poner puntos de interrupción en los eventos de inicio. Necesito poder adjuntar procesos a Visual Studio, no dependiendo de un PID, sino de un nombre de proceso específico o cualquier otra solución que funcione.

¡Por supuesto, agregar un Thread.Sleep(1000)en mis eventos de inicio para darme algo de tiempo para adjuntar el proceso en Visual Studio está fuera de discusión!

Ucodia
fuente

Respuestas:

97

De hecho, puedes; no te apegas a él, lo inicias. En las propiedades de su proyecto, en la pestaña Depuración, especifique la ruta del programa al que desea adjuntar en el cuadro de texto "Comando".

También puede ingresar cualquier argumento de línea de comandos para el programa en el cuadro "Argumentos de comando":

ingrese la descripción de la imagen aquí

Asegúrese de que "Adjuntar" esté establecido en "No".

Tibi
fuente
6
Buena solución, pero tenga en cuenta que presionar F5 no funciona en este caso. En su lugar, haga clic con el botón derecho en el proyecto correspondiente y haga clic en 'Depurar> Iniciar nueva instancia' en el menú contextual.
Herman Cordes
1
Para que F5 funcione, su proyecto debe ser el Proyecto inicial en la solución. Para ello, en el explorador de soluciones, haga clic con el botón derecho en el proyecto y seleccione "Establecer como proyecto de inicio".
Tibi
1
Además, si su programa tiene algunas dependencias externas, también debe cambiar el "Directorio de trabajo".
Priyank
Es posible que sea necesario marcar "Habilitar depuración de código nativo" (propiedades del proyecto → DepurarHabilitar depuradores ).
Peter Mortensen
¿Y cómo se hace esto para una solución completa con 40 proyectos?
Tony Tannous
23

Estaba depurando un complemento de C ++ en un proceso generado externamente que se bloqueó al lanzar una excepción al inicio y esto funcionó perfectamente para mí:

Agregue la extensión Reattach gratis para Visual Studio . Pídale que se vuelva a adjuntar al nombre del proceso antes de que se inicie. Aparecerá un cuadro de diálogo modal que dice que está esperando que se inicie el nombre del proceso.

Ahora inicie el proceso y el depurador de Visual Studio se adjuntará inmediatamente, detectando excepciones y alcanzando puntos de interrupción.

mstrange
fuente
¡Mil veces sí!
itslittlejohn
Tengo un punto muerto. Solicitó la autenticación de administrador cuando se lanzó mi objetivo, y después de escribir pwd y reiniciar vs, Reattach desapareció. Solo vs sin autenticación de administrador contiene Reattach.
Eric
2
No me funciona. Todavía se adhiere demasiado tarde, después de que ya sucedió el accidente. Parece comprobar los procesos existentes una vez por segundo, lo cual es completamente inútil para esta aplicación.
riv
20

Siga estos pasos si tiene Visual Studio 2017-2019:

  1. Archivo> Abrir> Proyecto / Solución
  2. Elija su .exe
  3. Depurar> Iniciar depuración

Mucho más fácil que otras sugerencias: no tiene que meterse con las propiedades del proyecto y no se necesitan extensiones.

Matt Thomas
fuente
Pero tendrá que decirle a Visual Studio dónde están los símbolos de depuración, si no los encuentra automáticamente
Matt Thomas
1
rápido, fácil de hacer en 5 segundos, me encanta. Gracias
ComradeJoecool
1
Se lanzó mi exe, pero no se pudo establecer un punto de interrupción. ¿Qué tengo que hacer?
Eric
2
@Eric Si mi comentario anterior no lo aborda, le recomiendo que lo haga como una pregunta SO en lugar de un comentario. Su problema tendrá más visibilidad y tendrá la oportunidad de explicar su escenario específico. ¡Entonces háganos saber lo que encuentra!
Matt Thomas
11

Encontré esta respuesta cuando buscaba algo similar. En mi caso, no podía simplemente usar el ejecutable como el programa de inicio de mi proyecto porque necesitaba iniciarse en un entorno muy específico que no podía reproducir fácilmente (a saber: iniciado desde cygwin).

Eché un vistazo a la extensión Reattach como lo sugirió mrstrange y también a la extensión Attach To Anything muy similar ... pero mi ejecutable parecía cerrarse demasiado rápido para que las extensiones notificaran y adjuntaran.

Lo que finalmente me ayudó fue esto: https://stackoverflow.com/a/4042545/1560865 , que hace referencia al artículo de MSDN Cómo: Iniciar el depurador automáticamente , que a su vez enumera los siguientes pasos:

  1. Inicie el Editor del registro (regedit).
  2. En el Editor del registro, abra la carpeta HKEY_LOCAL_MACHINE.
  3. Vaya a HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows NT \ currentversion \ opciones de ejecución del archivo de imagen.
  4. En la carpeta Opciones de ejecución de archivos de imagen , busque el nombre de la aplicación que desea depurar, como myapp.exe . Si no puede encontrar la aplicación que desea depurar:
    a. Haga clic con el botón derecho en la carpeta Opciones de ejecución de archivos de imagen y, en el menú de acceso directo, haga clic en Nueva clave .
    segundo. Haga clic con el botón derecho en la nueva clave y, en el menú de acceso directo, haga clic en Cambiar nombre . C. Edite el nombre de la clave al nombre de su aplicación; myapp.exe , en este ejemplo.
  5. Haga clic con el botón derecho en la carpeta myapp.exe y, en el menú de acceso directo, haga clic en Nuevo valor de cadena .
  6. Haga clic con el botón derecho en el nuevo valor de cadena y, en el menú contextual, haga clic en Cambiar nombre.
  7. Cambie el nombre a debugger.
  8. Haga clic con el botón derecho en el nuevo valor de cadena y, en el menú contextual, haga clic en Modificar . El Editar cadena aparece el cuadro de diálogo.
  9. En el cuadro Información del valor , escriba vsjitdebugger.exe.
  10. Haga clic en Aceptar .
  11. En el menú Registro , haga clic en Salir .
  12. El directorio que contiene vsjitdebugger.exe debe estar en la ruta del sistema. Para agregarlo a la ruta del sistema, siga estos pasos:
    a. Abra el Panel de control en la vista clásica y haga doble clic en Sistema .
    segundo. Haga clic en Configuración avanzada del sistema .
    C. En Propiedades del sistema , haga clic en la pestaña Avanzado .
    re. En la pestaña Avanzado , haga clic en Variables de entorno .
    mi. En el cuadro de diálogo Variables de entorno, en Variables del sistema , seleccione Ruta y , a continuación, haga clic en el botón Editar .
    F. En Editar variable del sistemacuadro de diálogo, agregue el directorio al cuadro Valor de variable . Utilice un punto y coma para separarlo de otras entradas de la lista.
    gramo. Haga clic en Aceptar para cerrar el cuadro de diálogo Editar variable del sistema .
    h. Haga clic en Aceptar para cerrar el cuadro de diálogo Variables de entorno .
    yo. Haga clic en Aceptar para cerrar el cuadro de diálogo Propiedades del sistema .
  13. Ahora, use cualquier método para iniciar su aplicación. Visual Studio iniciará y cargará la aplicación.

¡Espero que esto ayude a alguien más en el futuro!

Hauke ​​P.
fuente
3
Aquí están las instrucciones para este mismo proceso con versiones más recientes de VS (hasta 2019): docs.microsoft.com/en-us/visualstudio/debugger/…
brichins
3

Si no hay ningún proceso, Visual Studio no puede adjuntarlo .

Sin embargo, puede configurar el programa de inicio de su proyecto para que sea algo diferente a la salida de su proyecto.

ChrisF
fuente
Ya investigué si lo que quiero hacer es correcto, y de hecho lo es. Mi situación no es un caso habitual de depuración de Visual Studio. Tengo un proyecto de plantilla de Excel 2010 desarrollado en Visual Studio y las hojas de plantilla tienen eventos de inicio. Ejecuto esta plantilla desde Visual Studio, agrego algunos datos en mis hojas de Excel y guardo el archivo en el disco. Entonces, la única forma en que puedo abrir este archivo que también se basa en el ensamblaje de la plantilla, es abrirlo desde el explorador, por lo tanto, no puedo depurar los eventos de inicio en este caso y, por supuesto, tengo algún procesamiento de datos en el inicio como el enlace de datos.
Ucodia
Es posible que sea necesario marcar "Habilitar depuración de código nativo" (propiedades del proyecto → DepurarHabilitar depuradores ).
Peter Mortensen
3

Puede mostrar un cuadro de mensaje, esto bloquearía la aplicación, luego adjunte o vuelva a adjuntar el depurador al proceso y haga clic en Aceptar para continuar:

MessageBox.Show("Attach process to debugger and click ok!");

puede agregarlo al constructor de formularios (si usa winforms), por lo que esto se ejecutará antes que cualquier otra cosa, excepto para la inicialización de componentes:

public MainForm()
{
    InitializeComponent();
    MessageBox.Show("Attach process to debugger and click ok!");
}

Cuando termine su depuración, comente esa línea.

Raynet
fuente
3

Puede iniciar el depurador desde su código a través de

public static void Main(string[] args)
{
  System.Diagnostics.Debugger.Launch();
}

Pero no elimine esta línea antes de enviar su solicitud. Tal vez quieras usar indicadores del compilador para estar seguro:

    public static void Main(string[] args)
    {
      #if debug
      System.Diagnostics.Debugger.Launch();
      #endif
    }
Alguien
fuente
2
Esta debería ser la respuesta aceptada para todos los casos en los que esté esperando algún proceso externo para iniciar su aplicación.
TravellingFox
2

Una pequeña solución que podría adaptarse a muchas personas.

  • en la primera línea de código que ejecutará el exe, agregue este comando

    System.Threading.Thread.Sleep (20000)

Eso hará que el exe duerma durante 20 segundos antes de que comience a procesar cualquier cosa. Luego, tiene 20 segundos para adjuntar al proceso, que se puede hacer rápidamente con ctrl + alt + p, luego busque el proceso, luego ingrese para adjuntar.

No es una gran respuesta, pero funcionó de maravilla para mí: -)

usuario2728841
fuente
Tuve que depurar un CGI escrito en "C" para el que tenía el código fuente. Era una solución simple y fácil para tener tiempo de adjuntar al proceso en segundo plano.
Joël Hecht