2009-12-23 24 views
49

Quiero adjuntarme a un proceso (a.exe) tan pronto como se genera, ¿es factible con VS? Solo sé el nombre del proceso. En realidad, lo que quiero lograr es establecer un punto de interrupción en el código C#, pero el código pertenece a otro ejecutable que se ejecutará con la aplicación actual en ejecución (c.exe). El código está dentro del período de inicialización, por lo que me es imposible hacer la conexión manualmente.Visual Studio: adjuntar automáticamente a un proceso cuando se genera el proceso

+0

¿Nos puede dar más contexto? ¿Eres el propietario del proceso? ¿Es tu código? ¿Es ese proceso llamando a tu código? –

+0

Sí, soy el propietario de todo el proceso. –

Respuesta

52

Cuando me enfrenté a esta situación antes (y controlé ambos procesos), encontré una solución decente para llamar al Debugger.Launch() en el punto de entrada del proceso de desove. VS luego mostrará un cuadro de diálogo y le permitirá conectarse al proceso.

+4

solo funciona en lenguajes .NET. No para C++, por ejemplo – guilhermecgs

3

¿Qué tal esto: proyecto abierto para a.exe en VS, defina los puntos de interrupción, etc. A continuación, abra las propiedades del proyecto para a.exe, depuración pestaña y establezca Comando a c.exe. Luego solo presione Depurar.

Desafortunadamente, nunca hice esto con proyectos administrados, así que puedo estar fuera de lugar aquí. Sin embargo, así es como lo haría con proyectos no administrados (C++). Creo que el depurador administrado también debería ser compatible.

+0

En mi situación, el ejecutable que quiero depurar se inicia como parte de la puesta en marcha de otro ejecutable. Supongo que esa es la fuerza impulsora detrás de la pregunta. –

+0

funcionó para mí. Rápido y fácil para casos directos, pero posiblemente no sea bueno para los más complejos. – AbstractDissonance

0

Si el código C# que se puso en marcha por código no administrado a continuación, asegúrese de comprobar "depuración de código no administrado" @Project propiedades - Opciones> depuración ..

23

MSDN tiene [Cómo: Iniciar el depurador automáticamente] [1] - esto permitiría omitir la plétora de cuadros de diálogo de confirmación de clics de trabajo ocupado [sin apagar el UAC u otro desorden]. El artículo enumera los siguientes pasos:

  1. iniciar el Editor del Registro (regedit).
  2. En el Editor del registro, abra la carpeta HKEY_LOCAL_MACHINE.
  3. Navegue a las opciones de ejecución del archivo HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows NT \ currentversion \ image.
  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 busque la aplicación que desea depurar:
    a. Haga clic con el botón secundario en la carpeta Opciones de ejecución de archivos de imagen, y en el menú contextual, haga clic en Nueva clave.
    b. Haga clic con el botón derecho en la nueva clave y, en el menú contextual, haga clic en Cambie el nombre. c. Edite el nombre de la tecla al nombre de su aplicación; myapp.exe, en este ejemplo.
  5. Haga clic con el botón secundario en la carpeta myapp.exe, y en el menú contextual, 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 depurador.
  8. Haga clic con el botón derecho en el nuevo valor de cadena y, en el menú contextual, haga clic en Modificar. Aparecerá el cuadro de diálogo Editar cadena.
  9. En el Cuadro de datos de valor, tipo 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.
    b. Haga clic en Configuración avanzada del sistema.
    c. En Propiedades del sistema, haga clic en la ficha Advanced.
    d. En la ficha Advanced, haga clic en Variables de entorno.
    e. En el cuadro de diálogo Variables deMedio Ambiente, bajo variables del sistema, seleccione Ruta, a continuación, haga clic en el botón Editar .
    f. En el cuadro de diálogo Editar variable de sistema, agregue el directorio al cuadro Variable value. Use un punto y coma para separarlo de otras entradas en la lista.
    g. Haga clic en Aceptar para cerrar Editar variable de sistema cuadro de diálogo.
    h. Haga clic en Aceptar para cerrar el cuadro de diálogo Variables de entorno . i. Haga clic en Aceptar para cerrar el cuadro de diálogo Propiedades del sistema .
  13. Ahora, utilice cualquier método para iniciar su aplicación. Visual Studio se iniciará y cargar la aplicación

    [1]: http://msdn.microsoft.com/en-us/library/a329t4ed(v=vs.100).aspx

+2

Me gusta esta respuesta porque funciona si su código está construido en modo Release con PDB activado. El método anterior de Debugger.Launch() no funciona si está integrado en el modo de lanzamiento. – Pretzel

3

También puede utilizar gflags.exe util que viene con herramientas de depuración de Windows, todo lo que necesita hacer es gflags abiertas. exe luego ve al archivo de imagen ingresa el nombre del proceso (a.exe) presiona la pestaña y marca la casilla de depuración, en el cuadro de texto ingresa la ruta vs con la opción/debugexe (es decir, "C: \ Archivos de programa (x86) \ Microsoft Visual Studio 10.0 \ Common7 \ IDE \ devenv.exe "/ debugexe)

El estudio visual automático se abrirá onc e el proceso se está ejecutando, puede agregar sus puntos de interrupción y presionar Ejecutar.

3

"Entrian Attach" es un complemento de Visual Studio que hace exactamente esto: le dice el nombre de su ejecutable y adjunta el depurador a medida que se inicia el proceso, independientemente de cómo se haya iniciado, antes de ejecutar cualquier código.

(Divulgación: soy el autor. Construí Attach porque tengo este problema todo el tiempo!)

+0

No funcionó para mí ... Pude ver los símbolos cargados pero luego el proceso continuaría ejecutándose y se cerraría. Tal vez sea porque estaba tratando de conectarme a un proceso que no tenía en la solución y, por lo tanto, no había un punto de interrupción. –

+0

@NelsonRothermel: me gustaría ayudar, pero Stack Overflow no es el lugar adecuado para el soporte técnico de Entrian Solutions. :-) Envíeme un correo electrónico ([email protected]) si desea que intente ayudar con su problema. Hay algunas cosas fáciles de probar. – RichieHindle

+1

Terminé haciendo que funcionara con gflags.exe y la clave para mí era romper con cierto tipo de excepción, así que creo que su solución realmente habría funcionado si lo hubiera configurado correctamente. No lo necesitaré ahora, pero es un complemento interesante que podría ser útil en el futuro. –

5

He estado buscando alguna forma de hacer esto cuando ejecuto una aplicación de consola dentro de una prueba de aceptación.

me encontré con esto hoy - https://blogs.msdn.microsoft.com/visualstudioalm/2014/11/24/introducing-the-child-process-debugging-power-tool/

Es un complemento para Visual Studio, y funciona un convite. Cuando depuro una prueba de aceptación (uso el corrector de prueba de resharper) y coloco un punto de interrupción dentro de la aplicación que se inicia, ahora puedo depurar la aplicación en la misma instancia de Visual Studio.

+0

Esta es la forma más fácil de todas las soluciones que he probado aquí. Se instala fácilmente y solo funciona. No se requieren cambios de código. –

6

Otra buena solución es utilizar la extensión de Visual Studio "ReAttach". Se puede encontrar here.

Si su proceso no se está ejecutando actualmente, ReAttach le pedirá que lo inicie y lo conecte tan pronto como esté disponible.

0

A partir de VS 2013 SP2, hay una herramienta gratuita de Microsoft, que hace lo mismo que "Spawned Catcher Proceso" se mencionó antes - adjuntar todos los procesos que se inician mediante un proceso Ya en la depuración. Nota: Solo he probado esto con C++ no administrado (esto funciona a la perfección).

Microsoft Child Process Debugging Power Tool

MSDN Blog entry

Cuestiones relacionadas