Can.NET código fuente: ¿codifica un punto de interrupción de depuración?


Estoy buscando una manera en.NET (2.0, C# en particular) para que el código fuente desencadene una interrupción de depuración como si se hubiera establecido un punto de interrupción en ese punto, sin tener que recordar establecer un punto de interrupción específico allí en el depurador, y sin interferir con el tiempo de ejecución de producción.

Nuestro código necesita tragar excepciones en producción para que no interrumpamos una aplicación cliente que enlaza con nosotros, pero estoy tratando de configurarlo para que tales errores aparezcan para ser analizados si sucede que se ejecuta en un depurador, y de lo contrario se ignorará de forma segura.

Mi intento de usar Debug.Assert(false) ha sido menos que ideal, y asumo que Debug.Fail() se comportaría de la misma manera. Teóricamente no debería tener ningún efecto en producción, y se detiene con éxito al depurar, pero por diseño no hay (por lo que puedo decir) ninguna manera de continuar la ejecución si desea ignorar ese error, como podría hacerlo con un punto de interrupción real, y como lo haría en producción donde tragamos el error. También aparentemente rompe la evaluación del estado variable porque el depurador en realidad se detiene en el código nativo del sistema y no en el nuestro, por lo que su ayuda de depuración es limitada. (Tal vez me estoy perdiendo alguna forma de volver a las cosas para ver las variables y así sucesivamente donde sucedió. ???)

Esperaba algo como Debug.Break(), pero no parece existir (a menos que tal vez en una versión posterior de.NET?), y ningún otro método Debug parece aplicable, tampoco.

Actualización: Mientras que ctacke la respuesta es la mejor coincidencia para lo que estaba buscando, desde entonces también he descubierto un truco con la depuración.Assert () when cuando se ejecuta en el depurador Pause Pause el depurador, vaya al código para la depuración.Assert call pending (resaltada en verde porque está abajo en el código del framework) y presiona Step-Out (shift-F11), luego presiona Ignore en el cuadro de diálogo assert. Esto dejará al depurador en pausa al devolver la aserción (y podrá continuar la ejecución como si no hubiera ocurrido, porque fue ignorada). Puede haber otras formas de hacer lo mismo (¿hacer Reintento al golpear hace esto más directamente?), pero esta manera era intuitiva.

Author: Mogsdad, 2008-12-12

7 answers

Probablemente estás buscando algo como esto:

if(System.Diagnostics.Debugger.IsAttached)
  System.Diagnostics.Debugger.Break();

Por supuesto que todavía se compilará en una compilación de lanzamiento. Si desea que se comporte más como el objeto Debug donde el código simplemente no existe en una compilación de lanzamiento, entonces podría hacer algo como esto:

[Conditional("DEBUG")]
void DebugBreak()
{
  if(System.Diagnostics.Debugger.IsAttached)
    System.Diagnostics.Debugger.Break();
}

Luego agrega una llamada en tu código.

 120
Author: ctacke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-12 00:02:20

Sistema.Diagnostico.Depurador.¿Descanso?

 11
Author: shahkalpesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-11 23:56:42

Una vez me encontré con una situación en la que esto no funcionó

System.Diagnostics.Debugger.Break();

Pero esto hizo

System.Diagnostics.Debugger.Launch();
 8
Author: CheGueVerra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-11 23:58:57

Si desea tener solo una línea de código en lugar de 4, wrap

#if DEBUG
       if (Debugger.IsAttached)
            Debugger.Break();
#endif

Hacia

public static class DebugHelper
{
    [DebuggerHidden]
    [Conditional("DEBUG")]
    public static void Stop()
    {
       if (Debugger.IsAttached)
            Debugger.Break();
    }
}

Y use

DebugHelper.Stop();

DebuggerHiddenAttribute se agrega para evitar que el depurador se detenga en el código interno del método Stop y entre en el método con F11.

 6
Author: Sergey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-27 14:21:34

¿Qué tal configurar Visual Studio para que aparezca con el depurador incluso si lo tragas?

Haz esto:

  • Vaya a Debug->Exceptions...
  • Encuentra la excepción correcta, o agrégala si es tuya
  • Marque la casilla" Lanzado " para la excepción

Esto detendrá Visual Studio en la ubicación en la que se lanza la excepción, no solo si no se maneja.

Puedes ver más información aquí.

 4
Author: Lasse Vågsæther Karlsen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-12 00:02:41

Un buen truco que encontré es poner Depurador.Break () en el ctor de tu excepción.

 3
Author: Jonathan C Dickinson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-12 08:12:19

En Visual Studio 2010, pulsar Reintentar en un cuadro de diálogo Debug.Assert le lleva a la aserción de depuración fallida, como si tuviera un punto de interrupción.

 1
Author: Aren Cambre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-22 20:52:53