讨论一下改 bug 的方式,日志输出为主代替 debug 工具为主的优缺点

2020-03-21 10:54:32 +08:00
 mitiskysean

前段时间和一位字节跳动开发长者,估计 40+,是个真开发长者了。底层计算系统开发负责人,佩服的是依然一线主力开发。当时聊到日常开发时,长者表示他开发过程基本上很少 debug,逻辑异常都是通过运行日志来定位。

大致原因是,通过 debug 工具单步断点调试,是非常低效的开发行为。因为一次 debug 后只解决了当前的 bug,并没有让系统更易于维护,而每次通过完善日志来定位问题,问题定位会逐渐清晰且容易。而且断点对于复杂系统调试是非常麻烦的,首先定位问题出现大致范围就很耗时,完全没有通过日志来得清晰,当然具体细节通过断点 debug 是没有问题,毕竟日志输出是整体逻辑,没有输出太多细节信息,细节处问题还是需要通过 debug 工具。

当时听完蛮惊讶的,不过后来想一下,觉得好像是这么一回事。出现问题-->输出完善清晰的日志-->定位问题-->辅助 debug 工具-->解决问题,同时完善信息-->再次出现问题....的确好像会让整个系统更为清晰。最近试了一下,自觉效果不错,只是过程感觉有点不适,总是不自觉想直接开点 debug 去调。但是从结果上,由于被调试目的驱使,输出的运行信息的确更为高效且清晰,也的确同一模块问题定位因为日志逐渐完善会加速。

不过我觉得这个方法有个使用前提:开发水平较高,bug 多是结构逻辑上的。比方说事务漏提交导致后续的问,改动通过调用某模块方法来解决。而是某个方法细节出了问题,比如某个方法资源没释放,导致另外一处的问题,那这通过 bug 通过日志定位的话,估计输出一大堆信息吧。

老铁们怎么看这个问题,业界是否已有类似的开发模式啊?

7299 次点击
所在节点    Java
74 条回复
zhuangzhuang1988
2020-03-21 22:47:17 +08:00
@hoyixi 其实本身不是 非 A 即 B 得问题, 我代码里都用, 特别是动态调试别人的框架时候, 肯定上 debugger.
同意的人很多扯 , 静态语言 和 单元测试 都不是一个维度的, 比较.
liango
2020-03-21 22:59:38 +08:00
哪个更快定位就用哪个
Inn0Vat10n
2020-03-21 23:56:05 +08:00
哪个方便用哪个,哪个能用用哪个,这么简单的问题还用的着争吗
123444a
2020-03-22 00:56:08 +08:00
coredump,很简单的
mingl0280
2020-03-22 04:04:47 +08:00
@hoyixi 还是被日志惯坏了,有时候(比方说驱动引起莫名其妙蓝屏、内核搞事什么的)你没法看日志的。那种情况只能挂调试器上去 debug,不然你看到的东西是好几个线程输出的不相关内容,根本没法用。
mingl0280
2020-03-22 04:09:22 +08:00
@hoyixi 正常人根本不会说只用某一种 debug 手段,挂调试器能解决日志有时候打不出来的问题,看日志有时候能看出调试器挂不了的问题,都是手段而已,怎么就这个高那个低了?
xuanbg
2020-03-22 09:15:08 +08:00
通过日志直接定位到关键点,如果发现代码明显写错了或者不完善,就直接改。如果发现结果和预期不符,但貌似代码逻辑没错,就打断点看看实际的数据是否符合预期。数据不符合预期肯定是别的地方写错了导致的。
hoyixi
2020-03-22 13:03:11 +08:00
@mingl0280
不好意思,我有说过 高低 吗,我也说了“某些”,你自己也提了 “有时候”

我批的是有些人无打日志的习惯,甚至根本不知道日志跟踪定位。
pkookp8
2020-03-22 13:15:28 +08:00
两者结合吧
需要的关键信息加日志
写的功能加单元测试或调试命令

出现问题可以通过日志分析
辅助调试命令观察现象,辅助单元测试快速调试
具体也和环境,系统,设计框架,历史遗留的代码有关
这些事也没有绝对的好与坏,能有一定理由,符合公司的代码习惯即可
aguesuka
2020-03-22 21:26:39 +08:00
长者表示他开发过程基本上很少 debug,逻辑异常都是通过运行日志来定位。

就我个人在调试代码的时候,一般用 assert+debugger,生产环境用日志。idea 可以打 AssertionError 的断点,assert false 就相当于进入断点,就我而言效果比日志强太多
laball
2020-03-23 00:22:11 +08:00
Debug 效率确实比较低!而且系统越大越复杂,效率越低;
有的时候一次 Debug 需要的条件非常复杂,自己构造,还不如打日志跑一遍来得快,如果代码对于单元测试支持的好,会得到一些改善;
另外就是多线程的 Bug,调试可能没有打日志靠谱;

40+的一线开发,应该是什么都见过的主,而且,应该都是处理大型系统什么的,对他来说,日志,确实是一把利剑;
发现问题 ——> 日志打点 ——> 重现一遍 ——> 直接修复,或者只调试一小段代码;
对他来说,效率是第一位的;
nmap
2020-03-23 10:16:08 +08:00
这不是常识么,你见过真正的生产环境么?能让你用 gdb 上去调?
Aresxue
2020-03-23 10:35:19 +08:00
生产远程 debug 模式又不能开, 出了问题当然主要就是靠日志。 但日志要做好解耦, 不然是一件十分消耗性能的事情。另外日志的输出是交错的, 有时候可能会比较难以区分,因此在日志之外 JVM 的监控工具也应该有效利用上, 比如 pinpoint 和 arthas
LouisGuo
2020-03-23 13:17:12 +08:00
大佬的思路还是很清晰的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/654798

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX