当您的软件在现场崩溃时,您会捕获哪些信息?

时间:2010-05-13 20:17:32

标签: error-handling production-environment

我正在努力重写我意想不到的错误处理流程,我想问一下社区:

当你写的软件崩溃时,你会自动和手动捕获哪些信息?

现在,我捕获了一些项目,其中一些是:

自动

  1. 崩溃的应用程序名称
  2. 崩溃的应用程序版本
  3. 堆栈跟踪
  4. 操作系统版本
  5. 应用程序使用的RAM
  6. 处理器数量
  7. 截屏:(仅限非公开应用程序)
  8. 用户名和联系信息(来自Active Directory)
  9. 手册

    1. 用户的背景是什么(即:什么公司,技术支持电话号码,RA号等......)
    2. 用户什么时候发生? (典型的回应:“不要崩溃”)
    3. 重现的步骤。
    4. 您捕获的其他信息有助于您发现应用程序问题的真正原因,特别是考虑到大多数用户在被要求告诉您发生了什么时只是简单地粘贴键盘。

      对于我正在使用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?

6 个答案:

答案 0 :(得分:1)

现在来自偏执狂营地:(

考虑软件所针对的行业。收集有关用户(甚至活动目录名称)或网络的任何信息可能会使您的应用程序被黑名单并可能带来责任。即如果您的错误数据库被泄露并且该信息被用于闯入银行或政府实验室网络,该怎么办?是否会注意到包含其IP的错误报告?你可以被起诉吗?也许...

例如,如果您需要收集网络特定数据来诊断网络问题,请考虑让您的应用在将数据发回给您之前用占位符替换任何系统名称或IP。 (emailSrvr1,bankAcctNumSrv,变成srvr1和srvr2)追踪问题是一个更大的痛苦,但可能是值得的。这仍然可以捕获可能让您遇到麻烦的信息,但可能有所帮助。

我和高端企业和政府一起工作了几年,这使我的观点更加鲜明,但是可能值得考虑一下你收集的内容以及它的存储方式。

答案 1 :(得分:0)

LA Transtar还会保留仅针对故障保存的密钥日志。此日志包含正在进行的程序的输入和跟踪。在每个新事务开始时重置日志。

答案 2 :(得分:0)

(这有点特定于Windows / .NET,但这是你在问题中指定的内容,我认为在这种情况下这是非常有用的信息。)

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

生成一个不太大并且有足够信息为您提供有用的托管堆栈跟踪的转储有点棘手,但是有一个非常有用的实用工具叫clrdump,它将处理一些gorier细节。你。

Clrdump主要是微软DbgHelp.dll的包装器。您可以直接使用DbgHelp - 请参阅this question - 但随后您将获得一个“完整的minidump”,它将与您的应用程序的虚拟地址空间一样大,这可能非常大。 Clrdump可以很好地创建一个只有堆栈跟踪的小转储,以及足够的信息以便SOS能够读取它们。

答案 3 :(得分:0)

您没有提及进程日志记录(如Linux中的syslog,Windows的事件查看器?)。由于我也有一个系统管理员背景,我真的很欣赏带有日志工具的程序。如果可以选择详细程度,那就更好了。

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

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

答案 4 :(得分:0)

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

你提到的那些都没关系,但是这里记录的更好一点:

  • 关键和复杂操作的输入参数
  • 程序的上下文 - 一些算法繁重的对象 - 风险最大的类
  • 您的计划的状态

示例:您的程序流程就像一个状态自动机,您有5个状态,并且您已达到状态3.

  • 如果您的应用程序是服务器客户端,则从提供者和消费方收集两个日志

  • 内存转储通常不是一个好建议 - 只有当您需要了解框架或JVM(例如)中无法控制的问题时才能执行此操作。 OutOfMemoryError例如

答案 5 :(得分:0)

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