如何提高Debug效率

大家好,我是Z哥。

可以不夸张地说,程序员可能有一半的时间都在修bug。虽说,根据28原则大部分bug都可以在搜索引擎上搜到(业务性bug除外),但是往往剩下的那20%bug会花费我们80%的时间。

虽然解决这个问题最好的是方式减少产生bug,但是再怎么减都不可能减到0,我们还是有必要提高自己Debug的效率。

因为在Debug方面,水平高的人可能在效率上能领先至少一个数量级。我在这个行业从业将近9年,我见过太多这样的案例了。网上也流传过一个传播度很高的案例,有一个阿里内部的团队排查好几天未果的一个问题,去请教多隆大神,分分钟就搞定了。

很多人的Debug能力之所以长期止步不前,在我看来主要原因是两个。

  • 一是对IDE的功能不够了解,只会用平时一直在用的基础功能。

  • 二是没有掌握一个合理的Debug思路,属于“运气型”选手。

不同的编程语言,主流的IDE都不同,所以我主要就第二点展开说说我的经验。

有些经验的程序员都知道,Debug的过程最重要的不是怎么修复bug,而是怎么找到产生bug的地方。所以,下面要讲的思路主要也是围绕排查bug相关。

/01  缩小问题范围/

缩小问题范围的方式有很多,本质上其实是从当时的环境中找到与问题更高相关的变量。最常见的变量主要在以下这些:

  • 运行环境

  • 所操作的数据

  • 浏览器

  • 对应的源码版本

建议你先从这几个变量进行验证。然后再弄清楚上一次正常操作与当前出现bug的操作之间的这段时间发生过什么。大多数情况下,问题的根源就藏在这里面。那种潜藏很久才遇到的疑难问题,毕竟是少数。

/02  提炼并优化每一类bug的标准处理流程/

工作中很多流程需要SOP,在修复bug这件事上也可以这么做,如此可以将每一次修复一个疑难bug的过程给沉淀下来。

常见的bug类型主要有4类:

  1. 输出与预期不符

  2. 程序报错

  3. 程序明显响应慢

  4. 程序crash

每一类都有适合它们的排查方式,如果你总是用同一个套路去排查这4类问题,效率自然不会太高。

01  输出与预期不符

这种bug最头疼,为什么呢?因为它不像那种异常、报错的bug,有堆栈信息,可以快速缩小排查范围,甚至直接定位到产生的地方。

那么怎么办呢?如果这个问题在测试环境,那么最简单,直接单步调试走起,这个时候如果对IDE的调试工具掌握得越深入,效率也会越高,比如条件变量、多线程调试等等。

这里多说一句,强烈建议每个人掌握自己所用IDE的条件变量和多线程调试这两种方法,在当前的大环境下,整个软件开发领域的大型项目和多线程运用都比几年前高得多。

如果没法单步调试的情况,那么只能通过多打一些日志,来达到接近单步调试的效果。不过这点需要你做一些预判,在一些代码分支、可疑位置打上日志即可,毕竟编写记录日志的代码也需要时间不是。

02  序报错

这种bug对有些经验的程序员来说是最简单了,因为直接告诉了你产生异常的代码位置。

但是对新手就不同了,很多新手会拿着描述异常的一堆文字去搜索引擎搜,比如(NullPointer Exception),搜出来N多文章,一篇一篇看下来并尝试都发现不能解决自己的问题,其实就是由于自己还没习惯于去看堆栈信息。因为别人的NullPointer Exception和你的NullPointer Exception产生的原因并不一样。

堆栈信息中记录了整个调用链路,所以通过这里你可以看到完整的方法调用顺序。

不过值得提醒的是,在日常编写的代码的时候,千万不能随意的try catch代码块,然后throw一个new exception,因为这会导致堆栈信息不完整。

03  程序明显响应慢

这种问题一般是在产生资源竞争,或者资源紧张的时候发生。排查他们的难度也比较高。

如果说前面两类问题中,高水平和低水平的区别只在于解决效率的高低上,那么这个问题对低水平的程序员们来说可能是不管花多少时间都找不到问题的原因。

不过不要紧,我建议你以后遇到这种情况,优先从以下这几个指标入手。

  • TCP连接数

  • 内存占用率

  • 线程数

对于TCP连接,你身边得常备一份netstat命令手册,然后敲入命令,分别查看连接数是否接近到了65535?TIME_WAIT、CLOSE_WAIT状态的连接是不是过多?

大多数情况下,TCP连接相关的问题主要就是两个:

  1. 连接使用完后未及时释放

  2. 针对高频调用未使用长链接,而使用了短链接。此时一旦下游服务响应慢就会快速打满65535个连接。

对内存问题的分析,主要是就是通过分析GC来进行,主要关注是否有什么类型的对象占用内存过大了。如果存在过大的情况,主要原因是以下两个:

  1. 某个大对象应该是共享使用的,在代码里不小心写成了每一个实例各自一份。

  2. 某个对象分配的时候不小心带上了static关键字,导致GC一直无法回收为其分配的内存。

不同的编程语音有不同的GC分析工具,需要熟练掌握。

对线程的分析,和TCP连接类似,主要集中在线程的数量和状态上。线程并不是数量越多、性能就越好。数量越多,可能花在线程之间的上下文切换上的时候就比实际执行代码逻辑还要多。

另外,是不是有大量线程blocked或者deadlocked了?随便挑其中一个线程,分析其当前的堆栈信息,就是问题所在。

04  程序crash

导致crash的主要原因有两点。

  1. 是由于前面提到的原因3未及时察觉,导致程序运行直到资源耗尽,由操作系统干预强行终止运行。

  2. 代码中存在未捕获的exception。

第一点参照原因3的处理方式。

第二点就很简单了,在代码的最外层做一个大大的try catch,然后打上日志将堆栈信息记录下来,发布到线上,自然就能看到是那里出现的问题,然后转到原因2的处理方式。

最后,提高Debug能力必须要多实践。所以,我是非常建议你在条件允许的情况下,勇敢地去挑起排查线上疑难杂症的任务,甚至并不是你直接负责的功能模块。

可能在外人看来你在帮别人“擦屁股”,但这会让你的Debug能力得到明显的提升,并且容易形成对你的依赖,让你越来越强。

好了,总结一下。

这篇呢,Z哥和你分享了我对提高Debug效率这件事的看法。

想要提高Debug的效率,一是要对IDE工具有熟练的了解,知道一些高阶的使用方式。二是要对Debug有一套自己的思路。

对于第二点,我建议的步骤是:

  1. 缩小问题范围

  2. 提炼并优化每一类bug的标准处理流程

Bug主要分为4类,我在文中给出的思路也区分了这4类:

  1. 输出与预期不符

  2. 程序报错

  3. 程序明显响应慢

  4. 程序crash

希望对你有所帮助。

在我看来,Debug是一件很好玩,也很有成就感的事情,不亚于设计一个项目的框架。而且Debug还能让你真正地体会到什么是“魔鬼藏在细节里”。

推荐阅读:

  • 过于在意别人的看法,怎么办?

  • 你见过的“垃圾”项目是这样子么?

原创不易,如果你觉得这篇文章还不错,就「在看」或者「分享」一下吧。鼓励我的创作 :)

如果你有关于软件架构、分布式系统、产品、运营的困惑

可以试试点击「阅读原文

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/303689.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中断原理在计算机中的应用,最新 计算机原理与应用 复习3-判断题

最新 计算机原理与应用 复习题目1.INTR、INTA和NMI信号都是与中断有关的信号。( ) √2.8088在访问存储器时,必须用HOLD和HLDA两条信号线指示出总线是否可用。( )3.在8088时序中,在时钟周期T4状态期间,S2S1S0的任何变化指示一个总线周期的开始…

baidumap vue 判断范围_懂一点前端—Vue快速入门

01. 什么是 VueVue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架,是当下很火的一个 JavaScript MVVM 库,是以 数据驱动和组件化 的思想构建的。MVVM 模式简述下图不仅概括了 MVVM 模式 (Model-View-ViewModel)&#xff0c…

open*** 结合pam_mysql认证 failed to authenticate: Permission denied

open***的认证有很多方式,比如证书认证,用户名密码认证,而用户名密码认证也可用通过两种方式实现,一是使用pam_mysql实现open***利用mysql认证,二是使用radius实现open***利用mysql认证,网上这种配置都很多…

用文本挖掘剖析近5万首《全唐诗》,发现了这些有趣的秘密

楔子近些年来,弘扬中华传统文化的现象级综艺节目不断涌现,如《中国汉字听写大会》、《中国成语大会》、《中国谜语大会》、《中国诗词大会》等,其背后的社会成因,在于人们对中国文化中最精致文字的膜拜心理,虽然浸淫于…

如何在 C#9 中使用顶级程序 (top-level)

当我们用 C# 进行编码的时候,总需要写很多的模板代码,即使是最简单的 console 程序,想象一下,如果去测试一个 类库 或者 API 的功能,通常你会用 Console 程序去实现,在开始工作的时候会发现你受到了 C# 标准模板的限制…

跨部门不配合工作_跨部门协作,队友总是“甩锅”,这三个方法教你快速避坑!...

在日常的工作中,你觉得跨部门沟通的时间占用了多少时间?前阵子我经常会看到有人抱怨,说跨部门沟通的工作实在太难了,同事总是推脱扯皮,领导交代下来的事情,要么说不是自己的职责,要么说以前没做…

web页面在线编辑功能

首先在web.config文件中添加 <system.web> <httpHandlers> <add verb"GET" path"FtbWebResource.axd" type"FreeTextBoxControls.AssemblyResourceHandler,FreeTextBox"/> </httpHandlers></system.web> 注…

html哪个是最大标题,在下面的HTML中,哪个是最大的标题( )

参考答案如下下中单选(2分) 新民主主义革命的三大法宝是( )单选(2分) 关于计算机为什么基于二进制数来实现&#xff0c;标题下列说法不正确的是单选(3分) “某些人天生具有一些特质&#xff0c;下中这些特质会使他们成为伟大的领导者。”这是以下哪种理论的观点?标题单选(3分)…

C#通过工厂模式,我把一大堆if干掉了

概述之前做微信项目的时候&#xff0c;会涉及到一个回调&#xff0c;大家都知道回调事件是很多类型的&#xff0c;一般是根据不同的类型在进行不同的逻辑处理。这样就会延伸出一个问题&#xff0c;就是入口处会有一大堆if判断。这样本身是没什么问题的&#xff0c;只是看起来比…

再过四十年,你的女朋友可能是个美丽的机器人!不信你看

“美国西部、科幻、人工智能 、 机器人革命”&#xff0c;这 4 个看似不相关的元素却组成了一部新神剧《西部世界&#xff1a;Westworld》。《西部世界》可是聚粉丝千万&#xff0c;由1973年迈克尔克里奇顿执导的同名电影改编而成的电视剧。在剧中&#xff0c;整个“西部世界”…

mac下nvm_Mac OS 使用 nvm 管理 node 与 npm 版本

nvm 是 Mac 下的 node 管理工具&#xff0c;有点类似管理 Ruby 的 rvm&#xff0c;如果是需要管理 Windows 下的 node&#xff0c;官方推荐是使用 nvmw 或 nvm-windows 。以下具体说下 Mac 系统中的安装与使用细节(Windows 系统仅供类比参考)。1. 卸载已安装到全局的 node/npm如…

如何解决ORA-12638: 身份证明检索失败错误

今天连接一个以前正常连接的Oracle数据库&#xff0c;突然报错ORA-12638&#xff0c;说身份证明检索失败。感觉很奇怪&#xff0c;后来一查&#xff0c;发现是因为我电脑是出于Windows的Domain中的&#xff0c;而sqlnet文件中指定的认证方式是MTS&#xff0c;所以出错了。 解决…

模型存储在哪里_最强的模型工作收纳站「Artty Station」登场!

大部分做模型的人&#xff0c;都有同一个梦想——那就是「属于自己的模型空间」。但很少有人&#xff0c;有足够的空间去收纳自己的模型工具。而现在&#xff0c;一款号称史上最强的模型收纳站「Artty Station」横空出世了&#xff0c;现在正在日本网站Makuake上进行众筹&#…

.NET6 中的 PriorityQueue

.NET6 中的 PriorityQueueIntro.NET 6 中引入了一个新的集合类型 PriorityQueue&#xff0c;正如它的名字那样&#xff0c;在普通的 Queue 基础之上增加了优先级的支持&#xff0c;接下来就一起来看一下怎么使用&#xff0c;以及一些常用的使用场景介绍。Get Started来看一个简…

成渝地区微型计算机产业,2020届广州市高三年级调研测试文综地理试题(含答案).doc...

2020届广州市高三年级调研测试文综地理试题(含答案).doc2020届广州市高三年级调研测试文科综合(地理部分)一、选择题下表为我国四个省市2009年、2018年微型计算机产量对比表。据此完成1-3题。1与上海、江苏相比&#xff0c;2009年成渝地区微型计算机生产处于“空白”状态&#…

大数据教你实现预测未来,这不是梦

随着数据挖掘与人工智能技术的发展&#xff0c;越来越多的企业将大数据运用到生产实践与决策指导中。其中&#xff0c;构建合适的模型对未来的趋势进行预测&#xff0c;是数据挖掘中十分重要的一部分。本文将通过一个小案例教会你如何利用数据挖掘技术实现预测未来不是梦。【工…

简单而不简陋﹣wp7视觉点滴

一直就很期待&#xff0c;引入了Metro设计理念的wp7的真实操作体验&#xff0c;现在终于如愿了。拿到测试机&#xff0c;首先迅速的过了一遍&#xff0c;第一印象就是界面简单明了&#xff0c;没有华丽的高光、没有跌宕的质感&#xff0c;真的感觉就像在公共场所看到的信息指示…

ros发布节点信息python_vscode开发ROS1(13)-python实现话题通信(msg)

写在最前面1, ros也是可以使用python进行编程的, 而且相比c来说, ros更加简单.使用python创建第一个ROS程序1, 在ros_test目录下, 新建一个scripts文件夹.2, 修改CMakeLists.txt文件, 在find_package中添加rospyfind_package(catkin REQUIRED COMPONENTS roscpp ... #其他的包 …

BeetleX 之 WebApi网关1.5.8发布

这一版本的主要升级了BeetleX的基础网络库&#xff0c;主要解决在某些情况导致解释http协议cpu暴增长的问题&#xff0c;同时使用BeetleX新版本针对的IndexOf的优化&#xff0c;使http协议解释上有着一定程度的性能提升。新版本同样也是支持win64和linux64两个版本&#xff0c;…

html css 重复,CSS重复定义的问题请教_html/css_WEB-ITnose

&#xff0c;是不是就无效了&#xff1f;回复讨论(解决方案)外部css样式和内部css样式同时存在&#xff0c;以内部css样式为准。内部css样式与标签的style属性同时存在&#xff0c;以style属性的样式为准。你说的这种情况应该是两者都会有效&#xff0c;但CSS类的优先级更高&am…