Estoy buscando un modo 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 la producción.¿Puede el código fuente de .NET codificar un punto de interrupción de depuración?
Nuestro código necesita tragarse excepciones en la producción para no interrumpir una aplicación cliente que se vincule con nosotros, pero estoy tratando de configurarlo para que esos errores aparezcan para ser analizados si resulta ser corriendo en un depurador, y de lo contrario será ignorado de forma segura.
Mi intento de utilizar Debug.Assert(false)
ha sido menos que ideal, y supongo que Debug.Fail()
se comportaría de la misma manera. En teoría, no debería tener ningún efecto en la producción, y se detiene con éxito cuando se depura, pero por diseño (hasta donde puedo decir) no hay forma de continuar la ejecución si se quiere ignorar ese error, como se podría hacer con un punto de ruptura real , y como lo haría en producción donde tragamos el error. También aparentemente rompe la evaluación de estado variable porque el depurador realmente se detiene en el código del sistema nativo y no en el nuestro, por lo que la ayuda para la depuración es limitada. (Tal vez me falta alguna forma de volver a las cosas para ver las variables y así sucesivamente dónde 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: Si bien la respuesta de ctacke es la mejor opción para lo que yo estaba buscando, he puesto también descubrió un truco con Debug.Assert() - cuando se ejecuta en el depurador - Pausa el depurador, vaya a el código para la depuración. Afirma la llamada pendiente (resaltada en verde porque está abajo en el código de la estructura) y presiona Salir (shift-F11), luego presiona Ignorar en el cuadro de diálogo de afirmación. Esto dejará el depurador en pausa al retorno de la declaración (y podrá continuar la ejecución como si no hubiera ocurrido, porque se ignoró). Puede haber otras formas de hacer más o menos lo mismo (¿es mejor intentarlo de nuevo con Reintentar?), Pero de esta manera fue intuitivo.
también puede usar #if DEBUG ... #endif en su lugar –
Claro, pero es mucho más feo que un condicional porque tiene que ajustar cada llamada al método con la directiva precompiladora también. – ctacke
Para aclarar, desde MSDN: 'Cuando se llama a un método marcado como condicional, la presencia o ausencia del símbolo de preprocesamiento especificado determina si la llamada se incluye u omite. Si el símbolo está definido, la llamada está incluida; de lo contrario, la llamada se omite, así como 'Un método condicional debe ser un método en una declaración de clase o estructura y debe tener un tipo de retorno de vacío. – Kiruse