【问题标题】:What should go in a robust error message for debugging?用于调试的健壮错误消息中应该包含什么?
【发布时间】:2010-09-22 21:53:29
【问题描述】:

除了通知用户之外,我们还希望收集信息用于调试目的。我们的系统是一个只有大约 1400 名客户的小众系统,因此我们的资金并不如我们希望的那样充足,因此错误比我们希望的更常见。我们目前有一个窗口,该窗口以较大的字体显示错误消息的第一行,黄色背景以吸引用户的眼球,其下方的文本框中带有灰色背景的可怕部分。还有一个按钮可以将所有内容放在复制缓冲区中以发送给客户支持。我们试图访问的消息由 exception.Message、堆栈跟踪的最后五个部分以及导致错误的方法的名称 (Reflection.MethodBase) 组成。我们计划添加让用户说出他当时在做什么的能力,也许还有一个单选按钮来指示这种情况发生的频率,并将其写入日志文件。我们还应该包括哪些其他有用的信息?

我们也在考虑通过电子邮件将其发送给客户支持,但如果电子邮件失败,我们不会强调。电子邮件还有其他注意事项 - 客户支持可能会淹没其中,用户可能会反对,因为我们也会发送系统信息,等等。

我在 SO 上发现了两个类似的问题,但它们并没有真正关注我感兴趣的内容。Error Message Text - Best Practices 处理如何为用户制作有用的消息,Best way to handle error messages 处理在哪里保留错误ID 与错误文本。我对调试更感兴趣(因为不幸的是我们的系统确实有很多错误)。

【问题讨论】:

    标签: .net debugging error-handling


    【解决方案1】:

    如果您最终包含自动电子邮件提交,请将它们发送到新邮箱,以便您可以过滤它们并发送它们,而不会影响您现有的客户支持人员。

    除此之外,包括以下内容可能会很有用:

    • 如果您的产品有多个版本,则错误消息中的软件版本号。
    • UTC 日期/时间
    • 操作系统/浏览器/环境/等。 (任何相关)
    • 用户的安全角色、登录等
    • 跟踪用户的联系信息(电话、电子邮件等)
    • 错误屏幕上的您的联系信息

    【讨论】:

      【解决方案2】:

      我们使用以下方法获取系统指标。我们还记录用户/机器数据和堆栈。

      string _osSql = @"SELECT * FROM Win32_OperatingSystem";
      string _metric = string.Format("Metric Data:{0}", Environment.NewLine);
      
      foreach (Screen _screen in Screen.AllScreens)
      {
          if (_screen.Primary == true)
          {
              _metric += "Primary";
          }
      
          _metric += string.Format("Screen: Width:={0}, Height:={1}{2}", Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, Environment.NewLine);
      }
      
      ManagementObjectSearcher _mgmt = new ManagementObjectSearcher(_osSql);
      
      foreach (ManagementObject _o in _mgmt.Get())
      {
          _metric += string.Format("OS:={0} - {1}{2}", _o.Properties["Caption"].Value.ToString(), _o.Properties["CSDVersion"].Value.ToString(), Environment.NewLine);
          _metric += string.Format("Memory  Total:={0}, Available:={1}{2}", _o.Properties["TotalVisibleMemorySize"].Value.ToString(), _o.Properties["FreePhysicalMemory"].Value.ToString(), Environment.NewLine);
          _metric += string.Format("Description:={0}{1}", _o.Properties["Description"].Value.ToString(), Environment.NewLine);
          _metric += string.Format("TotalVisibleMemorySize:={0}{1}", _o.Properties["TotalVisibleMemorySize"].Value.ToString(), Environment.NewLine);
          _metric += string.Format("FreePhysicalMemory:={0}{1}", _o.Properties["FreePhysicalMemory"].Value.ToString(), Environment.NewLine);
      }
      

      【讨论】:

        【解决方案3】:

        我记录用户的输入(针对每个请求)、应用程序的当前状态(从本地变量到抛出代码)、错误消息和简短的堆栈跟踪(针对意外错误)。但是,出于安全原因,我只发送“客户友好”(公司批准)错误消息,其中包括一些纠正建议、联系信息和错误 ID(详细日志条目的 UUID)。

        【讨论】:

          猜你喜欢
          • 2010-12-04
          • 1970-01-01
          • 1970-01-01
          • 2011-08-18
          • 1970-01-01
          • 2019-01-31
          • 2012-05-26
          • 2013-05-21
          • 1970-01-01
          相关资源
          最近更新 更多