我有C#应用程序。我可以在调试模式下编译它,如果需要,可以使用任何标志等。
经过一段时间后,它无法正常工作(显着减速,部分挂起等等)
显然出了问题。作为第一次尝试,我希望看到在程序执行期间(捕获和未捕获)在任何地方出现的所有异常的完整列表。可能吗?我知道VS中有一个选项允许我在某些例外情况下“断点”。但我不想“断点”,而是想“记录”所有发生的异常,以便我以后再分析它们。
答案 0 :(得分:3)
如果您不确定可能发生的异常,请尝试在您的应用程序中使用 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 ...
}
我已使用Trace class on MSDN进行日志记录:
System.Diagnostics.Trace
这包括侦听您的Trace()
方法,然后写入日志文件/输出窗口/事件日志的侦听器,框架中包含的DefaultTraceListener
,TextWriterTraceListener
和EventLogTraceListener
。它允许您指定级别(警告,错误,信息)和类别。
答案 1 :(得分:3)
坦率地说,你不应该为此使用例外。您需要的是“检测”应用程序以记录代码中的关键活动,并带有日期时间戳,以便在出现问题后,您可以查看按时间顺序排列的日志,并查看代码无法执行的操作(以及在何处)做预期的事情,或者花费更长的时间。查看Microsoft Logging Application Blo ck或log4Net
通常,正确使用异常应限于应用程序(或模块或子例程/函数)无法成功完成其旨在提供的任何功能的情况。也应记录异常,但不应使用异常来跟踪除严重故障之外的任何事件。如果代码无法从失败中恢复,在大多数情况下,它应该只是导致应用程序停止。
事实上,大多数情况下,当出现错误并抛出异常时(除了最琐碎的问题),抛出异常时可用的信息只是诊断问题的第一步。在此之前的代码执行路径中发生的事情更常见于真正的问题......
答案 2 :(得分:0)
要回答问题,您可能需要(至少部分地)创建自己的调试器,该调试器将附加到您的进程并记录所有未处理和处理的异常。 This is probably where you want to start。此外,这是调试接口的MSDN Documentation。
这可以让你完成Visual Studio在进入Debug时所做的事情 - >异常并选中该框以在抛出异常时中断。唯一的区别是,不应该停止执行,而应该能够记录有关抛出异常的位置的信息(我认为异常的类型)。你会注意到的第一件事是这非常复杂。希望mdbg示例足够接近您所需要的,您可以稍微调整一下。
我也不承认这可能不是解决您尝试解决的潜在问题的最佳方法。如果您的程序中存在未处理的异常,您可能不需要任何额外的帮助来查找它们。除非代码执行以下操作,否则它们应该冒泡到表面:
try
{
. . . Some operation
}
catch(Exception){ } //Muddle on through - Very Bad!!!
如果问题是处理过的异常没有得到妥善处理,那么上述方法无法帮助您缩小问题的范围