如何调试仅在生产环境中出现的错误?

16

首先声明,我对这个问题一无所知,甚至不知道这个问题是否有客观答案。如果最终没有答案,我会删除或投票关闭这篇文章。

以下是情境描述:我刚编写了一个小型的Web服务。在我的机器上它能运行,在我的团队领导的机器上也能运行。据我所知,除了生产服务器之外的每台机器上都能运行。但当它在production服务器上运行失败时,异常信息来自第三方JAR文件,并且给出的信息很少。我在网上搜索了几个小时,但没有找到任何有用的信息。

那么追踪仅出现在生产环境中的问题需要哪些程序或工具呢?是否有标准方法或可能有相关工具类别?

激发这个问题的错误已经被修复,但那更多是由于幸运而不是有效的调试方法。我提出这个问题是为了以后参考。

编辑:
目前回答这个问题的答案可以总结为一个词:日志。唯一的问题是需要事先考虑。如果在现有系统中遇到缺乏良好记录的情况,或者客户担心敏感数据并且根本不希望在系统中使用大量的记录系统,该怎么办?

一些相关问题:
在生产系统中测试账户和产品
在生产代码/服务器上运行测试

7个回答

11

除了日志记录,以下是我和同事多年来使用的一些其他技巧……回溯到我们无法访问16位客户机上的Windows系统。 (我暴露了我的年龄吗?) 当然,并不是所有的方法都能/会奏效。

  • 分析您所看到的任何行为。
  • 尽可能地复现问题。
  • 逐行检查代码。
  • 与团队成员和对该代码几乎没有了解的人进行“橡皮鸭子调试”。与某人解释得越详细,发现问题的机会就越大。
  • 不要感到沮丧。休息5-10分钟。到楼/街道/其他地方去散步。在此期间不要考虑问题。
  • 倾听自己的直觉。

7
这是最困难的调试场景之一。答案将取决于生产系统的细节。您是否完全控制该系统?还是它安装在客户机上,您需要通过多次电话才能访问日志文件或修改配置参数?
我相信大多数人都会同意,使用日志记录是最有效的调试方法。您需要积极行动并尽可能添加更多的日志信息。但是,您必须能够根据需要启用和禁用日志记录。生产系统中的广泛调试日志可能会导致性能下降。出于同样的原因,您需要能够仅启用特定部分的日志记录。创建逻辑组的日志打印并仅启用您认为会提供最相关信息的部分。

2
我会从生产环境和测试环境之间的小差异入手,这些差异容易检查。通过实际测试排除明显的问题,如权限、防火墙、不同的版本等。有一次我走捷径,说“哦,那不可能是这个原因”,结果就是那样。
然后,我按照可能性和成本的优先级来进行更昂贵的测试。要有创意。想一些非常奇怪的事情,可能会引起您看到的行为。

很棒的是,它能引出“那不可能”的想法或者“那是不可能的!”我们都知道当卢克提到这个时发生了什么... - DevSolo

1
通常来说,“调试”(即附加到一个进程并检查执行情况)是行不通的 - 最重要的原因之一是数据敏感性(例如,开发人员很少有资格/清除去检查我们操纵的数据)。
所以,这通常归结为从次要来源和工件推断执行情况。然后,问题就变成了...
- 记录日志, - 记录日志, - 记录日志,
现在大多数编写的软件属于Java或.Net阵营,因此分别使用log4j和log4net。
此外,拥有一个经过验证的运维中心配置指南和验证流程也是有帮助的。请记住,负责硬件和环境的人很少了解他们托管的应用程序的配置要求。

0

我使用了可配置的日志系统,例如Log4J,以便在生产运行时查看发生了什么,这假定开发人员已经在日志中放置了有用的调试信息。

但要注意,日志记录可能会暴露一些敏感的私人数据,应尽可能进行编码和/或跳过。


0

除了日志记录外,其他技术包括保存请求数据,以便稍后将其提供给您自己的“相同”系统。这可以简单地将您收到的每个HTTP请求保存到文件中以供以后分析。现在,您可能正在记录大部分此类信息(特别是GET的URL),您只需要将标头和请求正文添加到混合中即可。

还可以向错误消息添加更多详细信息。例如,当您从例程中收到异常时,可以将用于该调用的参数添加到Exception错误中。或者至少添加全局状态信息(谁登录了,他们在哪个高级模块中,他们正在调用哪个高级功能等)。


0

一些建议:

  • 要有心理准备,一个bug可能由多个原因引起,所以不要局限于寻找一个原因。
  • 使用未处理的错误处理程序,它将跟踪错误并聚合相似的缺陷(greylogELMAH)。
  • 考虑使用迷你转储文件进行事后调试。
  • 为快速和肮脏的方法设定固定的时间框架,然后采用系统化的方法。
  • 尝试与同事一起对有缺陷的模块进行代码审查。新鲜的视角可能会有所帮助。
  • 使用版本控制系统(GIT、SVN)进行分治。
  • 修复时要小心,因为大约4%的所有修复都会引入新的bug。
  • 不要因为在生产环境中快速修复bug而省略标准的质量控制程序(例如代码审查)。
  • 修复后,请确保编写自动化测试,以防bug在以后的某个时候再次出现。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接