Debugging 调试仅用于生产的错误的过程是什么?

Debugging 调试仅用于生产的错误的过程是什么?,debugging,production-environment,Debugging,Production Environment,让我先说一下,我对这个话题太无知了,我甚至不知道这个问题是否有客观的答案。如果结果是“不是”,我将删除或投票关闭该帖子 下面是一个场景:我刚刚编写了一个小web服务。它在我的机器上工作。它在我队长的机器上工作。据我所知,除了生产服务器,它在每台机器上都能工作。生产服务器在发生故障时抛出的异常源于第三方JAR文件,并且在信息上很吝啬。我在网上搜索了几个小时,但没有找到任何有用的东西 那么,跟踪仅在生产机器上发生的问题的程序是什么?是否有一个标准的方法,或者可能有一个类别/系列的工具 引发这个问题的

让我先说一下,我对这个话题太无知了,我甚至不知道这个问题是否有客观的答案。如果结果是“不是”,我将删除或投票关闭该帖子

下面是一个场景:我刚刚编写了一个小web服务。它在我的机器上工作。它在我队长的机器上工作。据我所知,除了生产服务器,它在每台机器上都能工作。生产服务器在发生故障时抛出的异常源于第三方JAR文件,并且在信息上很吝啬。我在网上搜索了几个小时,但没有找到任何有用的东西

那么,跟踪仅在生产机器上发生的问题的程序是什么?是否有一个标准的方法,或者可能有一个类别/系列的工具

引发这个问题的错误已经被修复,但这更多的是因为运气好,而不是可靠的调试方法。我问这个问题是为了将来参考

编辑:
到目前为止,这个问题的答案似乎可以用一个词来概括:日志记录。日志记录的一个问题是它需要预先考虑。如果在现有系统中出现日志记录不良的情况,或者客户担心敏感数据,不希望在系统中首先使用大量日志记录系统,该怎么办

一些相关问题:


这是最困难的调试场景之一。答案将取决于生产系统的细节。这是一个你完全控制的系统吗?或者它安装在客户机上,您需要通过多次电话才能访问日志文件或修改配置参数


我相信大多数人都会同意,最有效的调试方法是使用日志记录。您需要主动采取行动,并添加尽可能多的日志信息。但是,您必须能够根据需要启用和禁用日志记录。生产系统中大量的调试日志可能会降低性能。出于同样的原因,您需要能够只启用日志记录的特定部分。创建日志打印输出的逻辑组,并仅启用您认为它将为您提供最相关信息的组。

我使用了一个可配置的日志系统(如Log4J)来查看生产运行时发生的情况,这假设开发人员已将有用的调试信息放入日志中

但要注意,日志记录可能会暴露一些合理的私有数据,这些数据应该在可能的情况下进行编码和/或跳过。

通常来说,“调试”[即连接到进程并检查执行]是不可行的,原因有很多,其中最不重要的原因是数据敏感性[例如,开发人员很少有资格检查我们处理的数据]

所以这通常归结为从次要源和工件推断执行。然后归结为

  • 伐木
  • 伐木
  • 伐木
现在编写的大部分软件属于Java或.Net阵营,因此分别利用log4j和log4net


此外,有一个以防误操作为中心的配置指南和验证过程也会有所帮助。请记住,负责硬件和环境的人员很少了解他们托管的应用程序的配置要求。

除了日志记录之外,其他技术还包括保存请求数据,然后将这些数据输入到您的应用程序中稍后拥有“完全相同”的系统。这可能很简单,只需将收到的每个HTTP请求保存到一个文件中以供以后分析。现在,您可能正在记录大部分信息(尤其是GET的URL),您只需将头和请求体添加到混合中即可


向错误消息添加更多详细信息也很方便。例如,当您从例程中获取异常时,您可以将该调用中使用的参数添加到异常错误中。或者,至少可以添加全局状态信息(谁登录、他们在哪个高级模块中、他们在调用哪个高级函数等).

除了非常宝贵的日志记录之外,以下是我和我的同事多年来使用的一些其他技术……回到我们无法访问的客户端机器上的16位windows。(我自己约会了吗?)诚然,并不是每件事都能/将起作用

  • 分析你看到的任何和所有行为
  • 复制,如果可能的话,复制它
  • 桌面检查,仔细检查你怀疑的代码
  • 与团队成员和对代码不太熟悉或不熟悉的人交流。你向别人解释的越多,你发现问题的机会就越大
  • 不要灰心。休息5-10分钟。快速穿过大楼/街道/任何东西。在那一刻不要考虑问题
  • 听你的直觉

我会从生产和测试之间微小的、易于检查的差异开始。通过实际测试消除明显的东西,如权限、防火墙、不同版本等。有一次我抄近路说哦,不可能,是的

然后,我会根据可能性和成本优先考虑更昂贵的测试。要有创意。想想可能导致你看到的行为的真正奇怪的事情。

一些建议:

  • 要准备好bug可能是由多个原因引起的,所以不要把你的思维局限于只寻找一个原因
  • 使用未处理的错误处理程序,它将跟踪错误并聚合类似的缺陷(,)
  • 考虑使用小型转储文件进行事后调试
  • 为快速和肮脏的方法制定固定的时间框架,然后采用系统的方法
  • 和你的一位同事一起尝试代码检查有缺陷的模块。新的视图可能会有所帮助
  • 使用您的版本控制系统分而治之