lsekfe 发表于 2022-9-6 11:10:14

如何让Bug重现?如何让程序员乖乖改代码?看完就懂了!

作为一个程序猴子,最怕遇到的事情就是程序出现BUG,特别是线上系统出现BUG,生产环境可不能直接上服务器来调试。查看软件自身提供的日志
  这种办法最多只能够定位问题,因为像apache和nginx的错误日志只是显示某个请求是200还是500这样子,不过通过这简单的日志我们可以分析出有没有接口出现过错误,从而知道程序有没有BUG。主动记录业务操作信息
  记录日志真的很重要,可以直白的说一句,出了问题之后唯一可以拯救你的就是日志。那你也许会问该记录那些信息呢?我只能说这个得根据自己的业务来定。
  例如:
  (1)发送验证码,我会记录下什么时间向哪个号码发送什么验证码,服务商返回结果是什么。
  (2)如果是完成任务,我会记录下什么时间,用户完成了什么任务,获得什么奖励。
  (3)一个敏感信息操作,我会记录下,哪个用户什么时间修改,修改前数据,修改后数据分别是什么?
  出错的函数调用过程和原因一定要记录
  一个出错的例子:

例如上图,一看到这种数据就可以分析出出错的原因,而通常记录这种信息是非常简单的,很多框架只需要简单配置即可。但是请注意,这个仅仅是让我们知道在哪里发生了一个错误,错误类型是什么,我们通过这个信息还不足以重现错误。用户请求的数据和获取到的数据要记录。
  这个很重要,因为很多时候出现错误都是我们没有处理好边界值问题。我们记录下用户发送的数据,我们就可以模拟用户的请求,然后通过打断点分析出问题所在。请注意一个小小的问题,由于每一次请求都需要记录下这个信息,是会影响程序性能的,所以建议通过异步写入或者先放进内容再慢慢存储。慢着,这个看似不错的方案还存在一点点缺陷,模拟毕竟是模拟,有没有想过在出错的那次某些外部数据可能跟现在已经不一样了呢,这个时候就没法重现BUG了喔!记录出错的时候调用的函数顺序及每个函数在调用前后的变量如果每一步都把数据记录下来,那么不就可以看到出错时候的情形了吗,不就很清楚的定位到问题所在了吗?并且只需要在出错的时候才捕捉所有的数据,那么其实一个系统出现错误的次数一般不会太多,所以总的来说对应用效率影响不大,也不用再跟用户说你来在我面前重现问题这么坑人了。要记录下这些信息,我们只需要在出错的时候遍历函数的调用栈幁,记录下数据即可。我自己写了一个python的库来实现这个需求:https://github.com/yubang/python_debug
  自己的一些线上开发debug做法
  1. 凡是核心业务都是上日志,并且这些日志从不删除。
  2.用户的输入输出都记录,错误信息和栈堆也记录,这个办法已经帮我解决无数的问题,每当有人说这里有问题喔,我都可以默默看看日志,然后定位问题所在。


页: [1]
查看完整版本: 如何让Bug重现?如何让程序员乖乖改代码?看完就懂了!