2008-12-11 25 views
45

Hoy me encontré con un problema si necesitaba depurar un programa a distancia. El programa se lanzó desde otro sistema, por lo que realmente no tengo la oportunidad de interactuar con él en la línea de comando. Sin embargo, podría cambiar su fuente fácilmente.Cómo esperar hasta que esté conectado el depurador .NET remoto

Lo que tenía que suceder era que el programa comenzara normalmente, y luego esperar a que se adjunte a él con un depurador. No pude encontrar una manera de hacerlo que me hiciera feliz. Encontré el error, pero sin la ayuda del depurador.

while(true) { } 

mantenido el proceso vivo, y entonces podría "fijar próximo estado de cuenta" con el depurador, pero parecía torpe y grosero.

Console.ReadLine(); 

parecía extraño para escribir ya que no era en realidad una consola para que yo presiono entrar en. (No funcionó, tampoco. Establezca la siguiente instrucción y luego ejecute lo lleva de vuelta a ReadLine() espere).

¿Qué tipo de código puedo insertar en un programa .NET/CLR/C# que dice " espera aquí hasta que pueda adjuntar con un depurador "?

Respuesta

82

Puede utilizar la propiedad System.Diagnostics.Debugger.IsAttached para comprobar si un depurador asociado al proceso. Esta aplicación va a esperar hasta que un depurador se ha unido:

using System; 
using System.Diagnostics; 
using System.Threading; 

namespace DebugApp 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine("Waiting for debugger to attach"); 
      while (!Debugger.IsAttached) 
      { 
       Thread.Sleep(100); 
      } 
      Console.WriteLine("Debugger attached"); 
     } 
    } 
}
+1

Gracias por esta respuesta.Sabía que tenía que haber una forma de verificar el código si se conectaba un depurador, y este fue el primer/mejor resultado que obtuve al buscar. –

+0

Reemplazar el tiempo con un if y el sleep con una afirmación podría ser una mejor solución, ya que le permitirá continuar fácilmente si no desea adjuntar un depurador cada vez. – Luke

+0

¿Es posible usar algún tipo de evento de 'Debugger' y esperar un' AutoResetEvent' hasta que se produzca el evento 'IsAttached'? – Pixar

5

No sé, ya que nunca lo he probado pero me pregunto si podría usar System.Diagnostics.Debugger.Break() para que llegue a un punto de interrupción y luego esperar a que se adjunte un depurador. Supongo que un depurador remoto funcionaría, pero no estoy seguro y actualmente no tengo acceso a mi entorno doméstico, donde podría simularlo fácilmente y probar mi teoría. Hay un MSDN article hablando de usarlo en una aplicación ASP.Net así que me imagino que funcionaría.

0

Establezca un tiempo de espera que le da tiempo para conectar el depurador.

Thread.Sleep(30000); 
1
Debug.Assert(true); 

también debería funcionar supongo. Por cierto, también se enfrentan a este proble a veces y hago

MessageBox.Show() 

: P: P

11

Esto suena como exactamente lo que necesita:

Debugger.Launch(); 

http://msdn.microsoft.com/en-us/library/system.diagnostics.debugger.launch.aspx

"lanza y adjunta un depurador al proceso."

+4

Esta es absolutamente la respuesta que desea si no está haciendo una depuración remota. Siempre que el código que desea depurar esté en el equipo local, esta línea de código abrirá una ventana emergente que le permite depurarlo con Visual Studio. (Sin embargo, si implementa este código en un cuadro de prueba o producción, la ventana aparecerá allí y su aplicación podría parecer bloqueada) – kbaribeau

+3

tiene que hacerlo en secon kbaribeau: Esto solo funciona si desea adjuntar un depurador local. OP solicitó un depurador remoto y, en este caso, Debugger.Launch() no servirá, ya que no puede seleccionar un depurador remoto en la ventana emergente y terminará el exe si selecciona no adjuntar un depurador – buddybubble

0

La conexión del depurador remoto funciona exactamente igual que con el depurador local.

En primer lugar, haga lo habitual:

System.Diagnostics.Debugger.Launch(); 

Aparecerá un mensaje para eligieron depurador. En este punto, la ejecución se suspende, por lo que puede adjuntar un depurador remoto y seleccionar "No" en el aviso.

+1

Probé eso y seleccionar "no" terminará el programa incluso si un depurador remoto ya está adjunto – buddybubble

Cuestiones relacionadas