如何提高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,一经查实,立即删除!

相关文章

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

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

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

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

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

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

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

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

.NET6 中的 PriorityQueue

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

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

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

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的基础网络库,主要解决在某些情况导致解释http协议cpu暴增长的问题,同时使用BeetleX新版本针对的IndexOf的优化,使http协议解释上有着一定程度的性能提升。新版本同样也是支持win64和linux64两个版本,…

egg前面加什么_国威说阀:阀门前面为什么加国标美标日标之类的?

原标题:国威说阀:阀门前面为什么加国标美标日标之类的?美标阀门就是美国标准的意思,通常称呼的美标球阀,美标闸阀和其它什么阀门都是按照美国标准制造出来的阀门其中一类。标准的编制说明是一个非常重要的文件。它阐明…

读《有效需求分析》

最近在一个技术群里看到张逸大佬强力推荐一本关于需求分析的书《有效需求分析》,于是在 Kindle 上下单了,读完后有一种相见恨晚的感觉。本书特点从书中的一些案例可以看出,作者擅长 ToB 软件的需求分析,如果您是从事的 ToB 软件的…

超时锁定计算机,就会发现多了一个控制台锁定显示关闭超时选项

小技巧:锁定屏幕方法多在临时要离开电脑时,可用CtrlAltDel组合键、WinL组合键或在开始菜单中单击用户头像选择“锁定”手动锁屏;或借用“屏幕保护设置”设定自动定时锁屏。1. 探寻自动锁屏时间修改离开电脑一段时间后Windows 10会自动锁屏,但…

android数据存放map_ES6 的新鲜玩意儿——集合set、map、WeekSet、WeekMap

es6新增了Set、Map、WeekSet、WeekMap 四种数据结构。C#中有HashSet和Dictionary,HashSet和Dictionary都是范式集合,但是es6不支持接口开发,所以也就不存在范式。Set 是存唯一值的集合,Map是存键值对的集合。WeakSet、WeakMap分别…

大牛领导单独找我聊了两句:搞框架的同时别忘了算法

前言程序数据结构算法,好的算法能让程序更高效的运行;在当今数据信息时代,数据分析和数据处理肯定是避免不了,而算法便成为了很多公司门槛级的要求,特别是大厂;赶紧搞起来,说不定离进大厂就只差…

C#使用iTextSharp操作PDF文件

概述html文件怎么转成PDF文件?有的招聘网上的简历导成DOC文件,不能直接使用,这样造成很大的困扰,那么它还有一个格式,那就是html格式。将文件导出成html格式,然后再转成PDF文件,这样便可以直接使…

springboot 历史版本文档_Springboot看视频学太慢?来看看这份阿里深入实践Springboot文档...

前言:之前 Spring Boot 2.2没能按时发布,是由于 Spring Framework 5.2 的发布受阻而推迟。这次随着 Spring Framework 5.2.0 成功发布之后,Spring Boot 2.2 也紧跟其后,发布了第一个版本:2.2.0。关于Spring Boot的性能…

51CTO技术沙龙4月23日第四期:如何快速定位******

人 在江湖飘,哪能不挨刀?没有跟***打过交道的运维人员能有多少?恐怕工作时间长的朋友大多都遇到过。我们除了做好防御之外,也可以尝试着像“盗梦空间”那 样了解******的动向。也可以从追踪***到挖掘***隐藏技术。当然&#xff0c…

计算机软件损坏基本维修,学习修电脑基础没有用?客户电脑开机不显示,维修差点被坑!...

原标题:学习修电脑基础没有用?客户电脑开机不显示,维修差点被坑!电脑故障分为硬件故障与软件故障,硬件故障指的是硬件损坏,软件故障指的是系统损坏,硬件故障还可以分为真坏与假坏,真…

cass小插件集合_插件|如何精准提取CASS方格网高程点?

CASS的方格网土方计算时,在格网上会内插很多高程点,下图所示的黄色、蓝色和洋红色的高程点。怎么能批量提取这些点呢?CASS方格网截图CASS升级到10.1之后,增加了一个菜单:工程应用-注记生成数据文件。这个功能可以将文字…

使用.NET开发的数据库小工具 DbTool

数据库小工具 DbToolIntroDbTool 一个支持 DbFirst、ModelFirst 和 CodeFirst 的数据库小工具。DbFirst 是根据数据库中的表信息生成代码中的 Model,以及生成数据表结构文档ModelFirst 是根据数据表信息或者数据表结构文档生成创建数据库的脚本CodeFirst 是指根据 m…

古登堡是垂直搜索引擎吗_网站排名,提高内容输出频率,就一定要对排名好吗?-SEO...

如果你在长期做百度SEO一定会有这样一个明显的感觉,通过每天大量的输出相关性的内容,实际上是有利于提高网站的抓取频率与整站的权重。 而对于百度搜索引擎而言,对方也确实有这么一个考量,用于衡量一个网站的活跃度与覆盖搜索需求…