【发布时间】:2010-04-08 08:32:54
【问题描述】:
最近,我们的客户遇到了意外崩溃。我们已经在他们的本地机器上记录了错误。是否有一种机制使他们能够在应用程序崩溃或发生意外行为时以某种方式“发送错误日志”?
换句话说,我如何知道应用程序已冻结、挂起或崩溃,以便我可以发送某些内容,并覆盖正常的“无响应”Windows 消息?
【问题讨论】:
标签: c# logging error-logging
最近,我们的客户遇到了意外崩溃。我们已经在他们的本地机器上记录了错误。是否有一种机制使他们能够在应用程序崩溃或发生意外行为时以某种方式“发送错误日志”?
换句话说,我如何知道应用程序已冻结、挂起或崩溃,以便我可以发送某些内容,并覆盖正常的“无响应”Windows 消息?
【问题讨论】:
标签: c# logging error-logging
如果它挂起,我认为您无能为力,但如果它崩溃,您可以使用UnhandledExceptionEventHandler 捕获其中一些崩溃。
您可以通过检查应用程序何时启动来处理挂起,如果它以前正确关闭并将“关闭”消息写入日志,如果没有,您可以询问用户是否要发送日志给你。
【讨论】:
过去,我很幸运能够使用如下代码将异常记录到 Web 服务(只要允许客户端注销到 Internet)。这是用于记录您尚未捕获的任何内容。如果您在发布模式下编译应用程序,但同时包含 pdb 文件,您将获得带有行号的堆栈跟踪。
您还应该记录程序集的版本,以了解哪个版本的应用程序给您带来了错误。
public void RegisterHandlers()
{
Application.ThreadException += new ThreadExceptionEventHandler(ThreadExceptionFunction);
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(UnhandledExceptionFunction);
}
private void UnhandledExceptionFunction(object sender, UnhandledExceptionEventArgs args)
{
Exception e = (Exception)args.ExceptionObject;
ExceptionLogger(e.StackTrace);
}
private void ThreadExceptionFunction(object sender, ThreadExceptionEventArgs args)
{
ExceptionLogger(args.Exception.StackTrace);
}
private void ExceptionLogger(string trace)
{
// log the message to a webservice
}
【讨论】: