我有 C# 应用程序。如果需要,我可以在调试模式下使用任何标志等编译它。
在某些时候它不能正常运行(显着减速,部分挂起等)
显然出了点问题。作为第一次尝试,我想查看在程序执行期间任何地方发生的所有异常的完整列表(捕获和未捕获)。是否可以?我知道 VS 中有一个选项可以让我在某些异常情况下“断点”。但我不想“断点”,而是想“记录”所有发生的异常,以便以后分析它们。
我有 C# 应用程序。如果需要,我可以在调试模式下使用任何标志等编译它。
在某些时候它不能正常运行(显着减速,部分挂起等)
显然出了点问题。作为第一次尝试,我想查看在程序执行期间任何地方发生的所有异常的完整列表(捕获和未捕获)。是否可以?我知道 VS 中有一个选项可以让我在某些异常情况下“断点”。但我不想“断点”,而是想“记录”所有发生的异常,以便以后分析它们。
如果您不确定哪里可能发生异常,请尝试在您的应用程序中使用UnhandledException 。
UnhandledException 事件处理从主 UI 线程抛出的未捕获异常。ThreadException 事件处理从非 UI 线程抛出的未捕获异常。
static void Main(string[] args)
{
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
//... do something ...
}
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
System.Diagnostics.Trace.WriteLine((e.ExceptionObject as Exception).Message, "Unhandled UI Exception");
// here you can log the exception ...
}
我在 MSDN 上使用 Trace 类进行日志记录:
System.Diagnostics.Trace
这包括侦听您的Trace()
方法的侦听器,然后写入日志文件/输出窗口/事件日志,框架中包含的侦听DefaultTraceListener
器TextWriterTraceListener
是EventLogTraceListener
. 它允许您指定级别(警告、错误、信息)和类别。
坦率地说,您不应该为此使用异常。您需要“检测”应用程序以使用日期时间戳记录代码中的关键活动,以便在出现问题后,您可以查看按时间顺序排列的日志并查看代码失败的内容(和位置)做预期的事情,或者花费比应有的时间更长的时间。查看Microsoft Logging Application Block或log4Net
一般而言,异常的正确使用应仅限于应用程序(或模块,或子例程/函数)无法成功完成其设计提供的任何功能的情况。异常也应该被记录下来,但是异常不应该被用来跟踪除了严重故障之外的任何事情。如果代码无法从故障中恢复,在大多数情况下,它应该只是导致应用程序停止。
事实上,大多数情况下,当出现问题并引发异常时(除了最琐碎的问题),在引发异常时可用的信息只是诊断问题的第一步。在此之前的代码执行路径中发生的事情往往是真正的问题所在......
要回答所提出的问题,您可能需要(至少部分地)创建自己的调试器,该调试器将附加到您的进程并记录所有未处理和已处理的异常。这可能是您想要开始的地方。另外,这里是调试接口的MSDN 文档。
当您转到 Debug -> Exceptions 并选中该框以在引发异常时中断时,这应该可以让您完全执行 Visual Studio 所做的事情。唯一的区别是,您应该能够记录有关引发异常的位置的信息,而不是停止执行(我认为是异常的类型)。您会注意到的第一件事是,这非常复杂。希望 mdbg 示例足够接近您的需要,您可以稍微调整一下。
我还将否认这可能不是解决您要解决的潜在问题的最佳方法。如果您的程序中有未处理的异常,您可能不需要任何额外的帮助来查找它们。除非代码执行以下操作,否则它们应该浮出水面:
try
{
. . . Some operation
}
catch(Exception){ } //Muddle on through - Very Bad!!!
如果问题是处理的异常没有得到正确处理,那么上述方法也无法帮助您缩小问题范围