最近想结合发生在身边码农身上的一些小故事,尝试表达一个观点“Coding 是门技术,Debug 是门艺术”。

上期的分享《Coding 是门技术》主要通过引入身边 Code farmer 撸码的一些真实故事,掰扯了一下开发规范以及重构可以改变代码的设计的理念,并且文末我又尝试总结了,人人皆知的一个看似专业而又非专业的撸码套路(一篇流水账,而却忘了升华,我就喜欢这么自嘲)。

但是,作为码农,撸码肯定是日常必须,毕竟要靠撸码吃饭,但是为了能更好的保住饭碗,Debug 则显得尤为重要,因为鲁迅先生说过「程序猿 20% 的时间在 Coding,80% 的时间在 Debug」鲁迅先生又说「他从来没说过」。

好了,话不多说,请扶稳坐好,我们正式来聊聊 Debug 这门玄幻的艺术。

01. Debug 的精髓


Debug 的艺术,我简单归纳为 「Debug 三步曲」。

第一步:FindBug。

无论遇到任何问题,Debug 时一定要清晰牢记,通过剥丝抽茧的方式,努力逐步缩小范围,最终锁定 Bug 的藏身之处。

第二步:FixBug。

依据撸码经验,经过多轮的修复-验证-修复-验证,最终让Bug扼杀于无形之中。

(图片来源于网络)

第三步:RecordBug。

为了保证 Bug 不二过,当然一定要把 Bug 的原因、现象、解决方式记录在案,这样就以防其他老铁再入坑。

好了,接下来就一起看看,发生在身边高鸡攻城狮身上的一些有趣的 Debug。

02. Debug 的故事


故事一:运维小哥配置的 crontab 引发的 DeBug。

经常撸码的老铁都清楚,系统一般白天疯狂吸引客户,也就是疯狂吸金,晚上一般会启动 N 多个批处理,在运维小哥那儿也不例外,配置很多释放资源、机器巡检等一系列的 crontab 任务。

近期团队让运维小哥帮忙搞了一台新机器,上面部署了新服务,并且配置了一个每天凌晨 1 点 10 分定时执行清洗数据的任务。

10 1 * * * /app/clear.sh >> /app/log/clear.log

理想很丰满,现实却很骨感。每天凌晨 1 点定时任务却迟迟未执行,于是就开启了 Debug 的过程。

Step 01:FindBug。

核心原则「努力缩小 Bug 范围」。

  • 首先排除常规性的配置错误,例如目录、脚本名称配置错误;

  • 然后排除脚本是否有执行权限,通过 ls 命令,发现脚本执行权限正常,而且手动执行脚本也没毛病;

  • 接着重新调整 crontab 的执行时间,确认是否会执行,发现确实到点了不执行,不过却有一个很诡异的一个现象,那就是有一个每两分钟执行一次的测试脚本 test.sh 却能够正常执行;

  • 大胆猜测,由于每两分钟的任务正常执行,有小时配置的任务却不执行,此时不得不怀疑是机器的时间导致的?!运维小哥坚信时区没问题,因为近期刚调整过,但是处于 Debug 环节,还是需要通过命令再次确认时区信息。

如上图示意,发现时区配置确实没啥毛病。那哪里会出现问题呢?会不会是 crontab 服务启动的时候,时间还没有调整呢,导致 crontab 的时间与当前的时间不一致?

眼尖的同学,此时会发现,时区配置的确晚于 crond 启动时间。

Step 02:FixBug。

核心原则「扼杀 Bug 于无形」。

由于时区配置,但是没有重启 crontab 服务导致,那就重启 crond 服务呗,重启完,时间确实对了,效果如下。

修改完成之后,经测试完全 OK。目前再去看线上清理的批处理,一切跑的又是那么的完美。

Step 03:RecordBug。

核心原则「每一个 Bug 都载入史册」。

故事二:攻城狮玄幻的 rz 命令上传的奇葩 DeBug。

不知道大家平时喜欢用什么登录线上服务器,身边攻城狮用的最多的莫过于 SecureCRT,用这款工具日常连服务器、查日志不再话下,不过用的偏多的就是用 rz 命令、sz 命令。

假如要向服务器上传文件,用 rz 命令就可以轻松搞定;假如要下载文件,用 sz 命令也可以轻松搞定(没用过的老铁建议尝试一下,绝对会让你 WOW!)。

不过最近身边攻城狮光头强,倒是在用 rz 命令上传文件时,栽了个大跟头,先抛个情景对话,让我们感受一下光头强那种百思不得解的痛苦。

眼尖的同学会发现主要问题,在光头强同学输入 rz 命令后,总是提示如下信息。

rz waiting to receive. Starting zmodem transfer.  Press Ctrl+C to cancel.

然后就没有然后啦,汗颜。正常情况下输入完命令,会提示上传文件窗口,然后选择要上传的文件,就应该上传成功了。

何解?面对工具性的 Bug,无需花太多时间在 FindBug 上,直接可以跳到 FixBug 环节,建议直接卸掉重装就好了,但是令人匪夷所思的是重装了还是不好使啊,而且光头强还没有其它 ftp 上传工具。

此时脑海中应该弥补一个场景:紧急部署线上应用,但是就你一个人有登录堡垒机的权限,而你又无法进行上传文件,那么此情此景,只能用下面这张图来形容。

面对这种比较玄幻的问题,只能另辟蹊径,建议光头强老弟直接拖住上传的文件到 SecureCRT,未成想确实好使!

面对这种玄幻的奇葩问题,也只能奇葩对待啦。

03. Debug 的武器


武器推荐系列一:用 Debug 来发现「什么是别人家的代码?」

为什么别人家的代码,不但写的好,而且Bug 少,最重要的是从来没因为 Bug 扣过绩效,莫非有什么奇招。

撸码久了就知道了,Coding 是门技术,但是撸码也是有套路的,很多攻城狮在撸码完成之后,喜欢采用 FindBugs 工具插件,找找有没有潜在的代码风险。

不过也有很多老铁,撸码完成之后,喜欢用 sonarQube 来提升提升代码的逼格,随便贴一效果图。

上期分享我们提到了《阿里巴巴Java开发手册 v666.pdf》,其实也有一款把阿里巴巴 Java 开发手册中的规约的插件,可以在你撸码的时候,自动帮你检测是否符合规范(So,牛掰),该插件已经在 Github 上开源。

https://github.com/alibaba/p3c

以上几款让 Bug 扼杀在摇篮里的武器,感兴趣的老铁,可以亲自体验一下。

武器推荐系列二:线上甩锅的 DeBug。

久入职场,迟早会经历各种奇葩的锅。锅该背的背,不该的背坚决不背,要有自己的态度。但是面对不该你背的大黑锅,如果你却拿不出证据,只能哑巴吃黄连,有苦也说不出。

例如你刚上线了应用,服务器 cpu 或者内存就疯狂报警,此时微信群里直接把锅扣你头上,你该怎么应对?

那肯定是沉着冷静,并按照之前的一篇分享《这部技术葵花宝典真的很硬核》逐步去排查解决。

另外面对线上重要模块却没有任何日志输出,排查无从下手的情形时,不妨在关键位置打印日志,以便尽快定位问题,快速止损。

04. Debug 的态度


有 Bug 不可怕,Debug 是我们前行的催化剂。

面对 Bug 要沉着冷静,不要像生吞蜈蚣一样,百爪挠心。

Debug 要剥丝抽茧,努力缩小范围,找到 Bug 点;通过日常的经验积累,解决 Bug 于无形之中;针对 Fix 的 Bug一定要载入史册,因为它绝对是一笔财富。

再抛几个玄幻的问题 Debug 场景,结束咱们的分享。

  • 为什么你一来我这儿就好了?刚刚怎么调试都不行?!

    哎,Debug 是玄学艺术!

  • 为什么你这么一操作就好了?刚刚我也是这么操作的啊?!

    哎,Debug 是玄学艺术!

  • 线上部署了 4 台服务,配置都一样,项目 war 包也一样,为什么偏偏只有这一台有问题?几经排查无解,而且换一台机器又恢复了平静。

    哎,Debug 是玄学艺术!

好了,今天的分享,到这就结束啦,希望你们能够喜欢

Debug 是门艺术的更多相关文章

  1. Linux Kernel - Debug Guide (Linux内核调试指南 )

    http://blog.csdn.net/blizmax6/article/details/6747601 linux内核调试指南 一些前言 作者前言 知识从哪里来 为什么撰写本文档 为什么需要汇编级 ...

  2. [转载] 如何使用Lex/YACC

    原文: http://segmentfault.com/a/1190000000396608?hmsr=toutiao.io&utm_medium=toutiao.io&utm_sou ...

  3. linux内核调试指南

    linux内核调试指南 一些前言 作者前言 知识从哪里来 为什么撰写本文档 为什么需要汇编级调试 ***第一部分:基础知识*** 总纲:内核世界的陷阱 源码阅读的陷阱 代码调试的陷阱 原理理解的陷阱 ...

  4. OD: Vulnerabilities Analyze Skills

    第五篇了,漏洞分析案例 漏洞利用的灵活程度让这门技术变得似乎没有什么原则可言,只有实践后总结提高才能挥洒自如. 漏洞分析方法 目标:弄清攻击原理.评估潜在利用方式及风险等级.扎实的漏洞利用技术是进行漏 ...

  5. OO第二单元电梯作业总结

    目录 目录一.第一次作业分析设计策略基于度量分析程序结构二.第二次作业分析设计策略基于度量分析程序结构三.第三次作业分析设计策略基于度量分析程序结构四.分析自己程序的bug五.发现别人程序bug所采用 ...

  6. 【转】我的技术学习方法 — Anytao

    原文作者:anytao—王涛 他的著作:<你必须知道的.Net> 关于这个问题,也有不少刚刚入行的朋友向我问起.我想可能一千个人就有一千个答案,我不能保证自己的想法适合于所有的人,但是这确 ...

  7. 我理解的IOC技术在Java和C#中比较分析

    一直想用心写这个系列的文章,其实看得越多,也就越觉得自己在这方面的功力太浅,也就越不想班门弄斧啦,作为一个开篇,我想把这个技术深层次化,在之前的.net的一个MVC系列文章其实已经涉及到了,只是.ne ...

  8. 线程池ThreadPoolExecutor、Executors参数详解与源代码分析

    欢迎探讨,如有错误敬请指正 如需转载,请注明出处 http://www.cnblogs.com/nullzx/ 1. ThreadPoolExecutor数据成员 Private final Atom ...

  9. vijos1334 NASA的食物计划(二维费用的背包问题)

    背景 NASA(美国航空航天局)因为航天飞机的隔热瓦等其他安 全技术问题一直大伤脑筋,因此在各方压力下终止了航天 飞机的历史,但是此类事情会不会在以后发生,谁也无法 保证,在遇到这类航天问题时,解决方 ...

随机推荐

  1. 微信WXSS样式文件

    目录 WXSS官方文档 1. WXSS 1.1. 尺寸单位 1.2. 样式导入 1.3. 内联样式 1.4. 选择器 1.5. 全局样式与局部样式 WXSS官方文档 https://developer ...

  2. Feign 注解翻译器 三

    一.自定义注解翻译器 (1)JAXRS 注解翻译器实例 ① 导入JAXRS所需要的jar包 <dependency> <groupId>io.github.openfeign& ...

  3. 关于nw的简单应用

    最近使用到了桌面开发应用nw.js.进行简单的介绍一下,基本用法 nwjs实际上是基于node js的,支持node js的所有api 中文官网https://nwjs.org.cn/ 第一步.在官网 ...

  4. vue中犯下的小错误(一)

    在开发采筑平台SRM的移动项目中:一个页面,感觉没啥错误,但是页面报错如下: 页面中的data或者mothods都没有任何问题,但是这个报错很是让人纠结,后来发现,在使用子组件时候: 此tabShow ...

  5. 17 Spring Data JPA的常用接口分析

    思考 在客户的案例中,我们发现在自定义的CustomerDao中,并没有提供任何方法就可以使用其中的很多方法,那么这些方法究竟是怎么来的呢?答案很简单,对于我们自定义的Dao接口,由于继承了JpaRe ...

  6. call 和 apply 和 bind的区别

    有些东西说忘就往,每天记录自己忘记的东西重新学习一遍,挺好 作用:call()和apply()用法都是一样的,改变this的指向问题 区别:接收参数的方式不同, (bind 方法是附加在函数调用后面使 ...

  7. Js数组代替写循环的几个方法

    简介 循环是个不可避免的结构,而且不好复用,同时循环还很难加入其他操作中.更麻烦的是,使用循环就意味着在每一个新的迭代中有更多变化需要响应. 上了循环的控制结构会使代码看起来变得复杂,故而这里提几个替 ...

  8. js 小练习题

    <script> /*1.结论,IIFE中运行顺序3,1,执行test(4),会传递参数*/ /*var a=5; var test = (function(a){ console.log ...

  9. 文件上传transferTo一行代码的bug

    本次的项目环境为 Running with Spring Boot v1.5.10.RELEASE, Spring v4.3.14.RELEASE, 服务器环境为CentOS7.0. transfer ...

  10. Git 的简单使用及ssh配置问题-赖大大

    软件安装 第一步当然是安装啦. 官方网址:https://git-scm.com/ 具体操作 在你本地电脑的文件夹里右击鼠标,选Git base here 显然,你是在本地仓库的master分支上,通 ...