我正在寻找一个用于.NET的库/工具,它几乎记录了我的C#应用程序(Windows窗体)中发生的所有事情。
问题是我正在向客户端(Windows XP)提供应用程序,在完成某项任务后,会出现经典的Microsoft错误窗口:
“ ApplicationName 遇到过 问题和需要关闭。我们是 很抱歉给您带来不便“
我正在处理我的应用程序异常,但这是外部的,我无法从该错误中得到任何结果,所以我希望任何自动化库可以帮助我。
如果记录执行的每一行代码,它会工作,orr只记录在出现错误之前正在执行的行,或者可以给我更多关于该错误的信息。
P.S :这是一个多线程应用程序,需要Timer控件(一个用于每隔5秒观看一个文件夹,另一个用于观看线程列表......)。我在这里使用Windows 7,一切似乎都运行正常。
答案 0 :(得分:4)
我认为你不会找到你刚插入的日志记录工具,它会记录发生的每一件事。您将不得不插入任何日志框架所具有的钩子。 Here是一个受欢迎的,免费的。
答案 1 :(得分:2)
为什么不登录Windows事件查看器,这就是它的用途。从简单的配置设置,您可以将其切换为包括所有级别,例如,4-Verbose,3-信息,2-warning,1-Error,您只需将消息记录为这4种类型之一。您也可以将它与布尔跟踪开关结合起来进行调试跟踪,但这不是必需的。
Windows事件查看器还为您提供摘要,可以远程连接,系统管理员可以轻松使用它。
using System;
使用System.Diagnostics;
class MySample {
public static void Main(){
// Create the source, if it does not already exist.
if(!EventLog.SourceExists("MySource")){
EventLog.CreateEventSource("MySource", "MyNewLog");
Console.WriteLine("CreatingEventSource");
}
// Create an EventLog instance and assign its source.
EventLog myLog = new EventLog();
myLog.Source = "MySource";
// Write an informational entry to the event log.
myLog.WriteEntry("Writing to event log.");
}
}
听起来你需要的是放置断点并逐步执行代码,如果它是线程化的,只需在步骤完成代码时打开visual studio中的线程窗口。如果许多线程难以调试,暂时会对您的计时器造成更长的延迟。
答案 2 :(得分:2)
来自的想法 C#: Try-catch every line of code without individual try-catch blocks
我创建了一个这样的类:
public delegate void VoidDelegate();
public static class L
{
public static void g(VoidDelegate v)
{
DateTime now1, now2;
StackTrace trace = new StackTrace(true);
now1 = DateTime.Now;
v();
now2 = DateTime.Now;
File.AppendAllText(@"C:\L.g",
now1.ToString("yyyy/MM/dd HH:mm:ss.fffffff") + "\t" +
trace.GetFrame(1).GetFileName() + ":" + trace.GetFrame(1).GetFileLineNumber() + "\t" +
(now2 - now1).Seconds.ToString() + ((now2 - now1).Milliseconds / 1000f).ToString().Substring(1) +
Environment.NewLine);
}
}
要应用日志,您可以添加
L.g(() =>/**/
和
/**/);
到每一条可能的行,例如
string[] sAryArg = null;
L.g(() =>/**/sAryArg = Environment.GetCommandLineArgs()/**/);
L.g(() =>/**/this.lblUserName.Text = sAryArg[3]/**/);
L.g(() =>/**/this.lblDatabase.Text = DbUtil._sEnvID_/**/);
L.g(() =>/**/this.lblVersion.Text =
Assembly.GetExecutingAssembly().GetName().Version.Major.ToString() + "." +
Assembly.GetExecutingAssembly().GetName().Version.Minor.ToString() + "." +
Assembly.GetExecutingAssembly().GetName().Version.Build.ToString()/**/);
生成的日志文件如下所示:
2012/02/29 10:41:18.1835418 D:\ xxx \ frmMain.cs:351 0.015
2012/02/29 10:41:18.1991666 D:\ xxx \ frmMain.cs:352 1.203
要禁用日志,只需批量删除周围的两个标记即可。
答案 3 :(得分:1)
关于您的要求(“几乎记录我的C#应用程序中发生的所有事情”),您将获得的最接近的是使用具有AOP支持和自动异常处理的日志记录框架。面向方面编程将允许您检测方法并跟踪方法执行。与SmartInspect等记录工具(免责声明:我是SmartInspect背后的开发人员)一起,您可以监控和分析方法执行并查看上下文中的异常(参见下面的屏幕截图)。
要记录您的应用程序数据和事件,您必须手动检测代码,实际上没有办法解决它。如果您有一个大型应用程序,一次手动检测所有代码将不起作用(这太耗时),所以我通常建议首先从最关键的例程和模块开始。
alt text http://www.gurock.com/images/feature/smartinspect-screenshot.png
答案 4 :(得分:0)
你试过ETW吗? ETW是Windows中速度最快,开销最小的日志记录系统。 ETW内置于内核中。 MS为他们构建的每个应用程序使用ETW,从Windows到VS.NET。
这不是自动日志记录工具。但是,无需修改代码,即可为应用程序中的每个调用提供堆栈跟踪。如果您需要添加自定义日志消息,那么您可以为此编写代码。
以下是ETW的部分链接,我在ETW in managed code上的帖子也很少
答案 5 :(得分:-2)
我过去曾使用log4net。您可以将其连接起来,以便在发生未捕获的异常时,将其记录到文件中或写入数据库。
答案 6 :(得分:-2)
尝试在具有不同入门级别的窗口事件查看器中记录您的异常。检查MSDN http://support.microsoft.com/kb/307024
中的示例代码