2010-05-13 66 views
8

我正在重写我的意外错误处理过程,并且我想问问社区:当您的软件在现场崩溃时,您会捕获哪些信息?

什么信息在您写入崩溃的软件时自动捕获和手动捕获?

现在,我捕捉到了几个项目,其中一些是:

自动:

  1. 应用坠毁
  2. 版本的应用程序的坠毁
  3. 堆栈跟踪的名称
  4. 操作系统版本
  5. 应用程序使用的RAM阳离子
  6. 处理器数量
  7. 屏幕截图:(仅适用于非公开的应用程序)
  8. 用户姓名和联系方式(从Active Directory)

手册:

  1. 用户在什么环境下(即:什么公司,技术支持电话号码,RA号码等)
  2. 什么时候用户期望发生? (典型的回答是:“不崩溃”)
  3. 步骤来重现

你捕捉什么其他位的信息,帮助你发现一个应用问题的真正原因,特别是考虑到大多数用户只需混搭。当记者问到告诉你发生了什么键盘

对于我使用C#,WPF和.NET版本4的记录,但我不一定要限制自己的

相关:。What to: Collect Information When Software Crashes

相关:What should be included in the state-of-the-art error and exception handling strategy?

回答

0

(这有点的Windows/.NET特有的,但是那是你的问题的说明,我认为这是在这方面非常有用的信息。)

除非你的应用程序是严格的单线程,你需要一个转储文件(至少为所有线程提供堆栈),而不仅仅是引发异常的线程的堆栈跟踪。

生成一个不太大的转储,并且有足够的信息来为您提供有用的托管堆栈跟踪,这有点棘手,但有一个非常有用的实用程序,称为clrdump,它将为您处理一些更高级的细节。

Clrdump大多是Microsoft的DbgHelp.dll的包装。您可以直接使用DbgHelp - 请参阅this question - 但您会得到一个“完整的小型转储”,其大小与应用程序的虚拟地址空间一样大,可能相当大。 Clrdump做了一个很好的工作,创建一个只有堆栈跟踪的小转储,并且有足够的信息让SOS能够读取它们。

0

LA Transtar还保留一个只保存故障的关键日志。该日志包含正在进行的输入和程序跟踪。日志在每个新事务开始时重置。

0

你没有提到进程日志记录(比如Linux中的syslog,Windows的Event Viewer)。由于我也有一个系统管理员的背景,我真的很感谢与日志设施的程序。如果可以选择详细级别,则更好。

这对你更了解环境很有好处,如果你的用户必须与其他工具进行某种类型的集成工作,这对你的用户是有好处的。

如果您的用户更具技术性,您可以要求他们将日志记录详细程度设置为最大值并再次重现错误。

0

基本上,没有黄金法则,你必须遵循和实施它在每个应用程序。根据您的业务应用程序和场景,发生错误时收集信息最适合包含不同的内容。

你提到的那些是正常的,但这里有一点更是好到可以登录:

  • 背景下你的程序的关键和复杂的操作,输入参数 - 一些物体重算法 - 最大风险,有产阶级
  • 的状态下为你的程序

例如:你的程序的流程就像是一个状态自动机,你有5个州的d你已经达到状态3.

  • 如果你有一个应用程序,它是服务器 - 客户端,同时收集日志 - 从供应商和消费方面

  • 内存转储不是一般的好建议 - 做只有当您需要了解您无法控制的框架或JVM中的问题时(例如)。 OutOfMemoryError例如

0

我没有在您的列表中看到最重要的信息(当我们谈论dotnet/Java代码级别时)。
异常类型,消息和跟踪。
您可以使用简单的代码来捕捉任何异常,并“写入日志”/“直接发送到电子邮件”。

1

而且现在从偏执阵营:(

考虑什么行业软件的目标。收集有关用户(即使是活动目录名)或网络上的任何信息,可以让您的应用反对票,并可能进行责任。即什么如果你的错误数据库被破坏,并且这些信息被用来侵入银行或政府实验室网络,那么包含IP的错误报告会被注意到吗?你可以被起诉吗?也许......例如,如果您需要收集网络特定数据以诊断网络问题,请考虑让您的应用程序在将数据发回给您之前用占位符替换任何系统名称或IP。 (emailSrvr1,bankAcctNumSrv,成为srvr1和srvr2)这是追查问题时更大的痛苦,但也许值得。这仍然捕获可能会让你陷入困境的信息,但可能会有所帮助。

我一直在与高端企业和政府合作几年,这为我的观点着色,但它可能值得考虑你正在收集什么以及它如何被存储。

相关问题