热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

最网最全bug定位套路,遇见bug再也不慌了

前言““不积跬步,无以至千里;不积小流,无以成江海。”想成为编程大佬也一样,不经过海量的bug、各种复杂的系统问题的处理

前言

““不积跬步,无以至千里;不积小流,无以成江海。”

想成为编程大佬也一样,不经过海量的bug、各种复杂的系统问题的处理经验,那么始终是纸上谈兵的小菜鸟。

那么如何做到遇到bug淡定自若,达到“他强任他强,清风拂山岗,他横由他横,明月照大江”的大佬境界呢?

本文结合自己多年的编程经验,给大家总结了这份bug定位套路大全,也许能对你有所帮助。




一、日志定位法

基本上大部分的bug异常问题,只要能找到相关的异常日志,那么就不用太慌了,根据提示的异常类型和出现位置,很容易就定位出异常原因。
可以说,日志是日常工作中定位bug,修复异常问题的首要依据。

有人可能说,那要是没有异常提示呢?
大部分情况下,可能和日志的输出级别有关。很多时候适当的降低日志级别,会输出更多程序运行的相关信息,给我们的bug修复提供更多的依据。

但要注意,生产环境上要控制好日志的输出级别,如果日志级别过低,可能会导致日志文件增长过快,对服务器的磁盘IO和存储空间造成较大的压力。
在spring boot中我们可以利用actuator组件实现日志级别的动态调整。


二、断点调试法

在开发过程中,遇到程序出现异常或执行效果不符的情况,有时可能只是代码逻辑的一些问题,并不会抛出异常,也就没有了相关的日志输出。这种情况下,最适合的就是在对应的方法打上断点,开启debug模式启动项目,逐步调试分析程序的执行步骤和数据变化的情况。

程序员老鸟都知道,能断点调试的bug,都不叫什么bug。

断点调试又分为2种情况:
1、本地断点调试
2、远程断点调试

很明显,本地断点调试是我们日常开发过程中用的最多的,在idea中给程序打上断点,然后通过debug模式启动项目,调用对应的方法,进入断点后通过F7和F8逐步调试。适用于本地开发环境。

而远程断点调试则是通过和远程运行的程序建立websocket连接来进行断点调试,本地的项目不用启动。适用于测试环境和生产环境。


三、google、百度大法

程序员圈子里有很多有趣的鄙视链,比如搞C的看不起搞java,搞java的看不起搞php的。
这里也说一条,用google的瞧不起用百度的。

但是我想说,年轻人才做选择,作为程序员老鸟,我都用。一般来说,百度更适合中国人的口味,搜索出的内容量也会比较多,但是过滤出高质量符合自己的场景的文章有时候比较费事。
google的话,感觉搜索结果中的文章质量会高很多,特别是针对国外的一些网站。

当遇到一个看不懂的异常时,将那一大串不明觉厉的异常日志直接扔到google,百度里,立刻搜出来各种大牛的处理问题的相关博文,这酸爽,大家都懂的。

当然,最关键的是搜索的关键字,这取决于你对bug现象的描述,越言简意赅搜索到的信息反而越多。


四、stackoverflow大法

如果你从事编程多年,还不知道stackoverflow这个牛逼的网站,我只能说你可能是个假程序员。
在这个网站里,你基本上可以找到你开发过程中遇到的所有bug。

如果找不到,你还可以在里面发起提问,会有很多大神给你提供思路和答疑,当然前提是你的英语还不错。


五、问题复现法

一般本地开发环境的异常问题都比较容易复现,比较困难的是测试环境,生产环境的异常问题。
比如网络问题导致的请求失败,服务器配置问题导致请求被拒绝,数据结构和数据记录不一致导致的异常,GC异常,偶然性或周期性出现的异常等等。

总的来说,就是开发环境和测试、生产环境的环境不一致导致问题很难复现。

1、尽可能减少程序运行环境之间的差异
2 、扩大日志记录的时间,记录多个异常周期内的日志
3、记录请求的入参出参
4、本地模拟环境重线异常问题

当你本地能复现问题后,就可以随便整了,可以采用各种手段尝试解决问题。成功后将解决方案照搬到生产环境就可以了。


六、排除法

很多异常很可能可以由多种原因引发,这时候你就需要采用排除法,针对每一个可能的原因去尝试。
还有的时候,针对一些中间件,组件参数的优化,也可以采用排除法。

在你对异常情况没有情绪定位的时候,可以采用排除法,尽可能的缩小异常查找的范围,进而定位问题。


七、同类比较法

这个也是我在开发过程中常用的一种异常定位办法。
典型的场景是,明明是相同或者类似的一个功能模块,A模块里面能正常运行,B模块里面缺一直出现问题。
这时候比较笨的办法就是仔细比较2个模块里面这个功能实现有那些查询,做一些对应的调整。

程序员不能光会Ctrl+C 和 Ctrl+ V,你可能需要更多的思考。


八、官方文档法

一般来说,官方文档是一个技术或框架的最准确的说明文档,是我们程序开发过程中最直接、最正确的首要依据。

很多时候在网上找的博客文章,往往由于没有说明问题的上下文环境,中间件或组件的版本不一致,导致对自己的问题定位没有什么指导价值。

这时候,通过官方文档你可以获取最正确的第一手资料,是帮助我们定位异常的重要依据。

查看官方文档的时候,一定要选择和自己项目中一致的版本号。


九、源码分析法

真正的大神,定位问题的手段往往都朴实无华。

各种问题都能够直接怼源码,通过手撕源码,达到“他自狠来他自恶 我自一口真气足”的大神境界。

任你异常变化万千,通过跟踪源码,直指问题核心,定位异常原因。

阅读源码这招威力虽然强大,但是对使用者的“内功”会有较高的要求,非3,5年内功不可轻易修炼,使用者需要量力而行。


十、大神求教法

开发过程中,bug万千,作为一个新入职场的小菜鸟,阅历尚浅,内功不够,遇到bug后,首先还是要自己多思多想,尽力尝试分析原因,独自解决问题。

每解决一个bug就是自己程序人生的一次成长的机会,所以不要轻易放过。

当尝试无果后,需要梳理好问题的上下文以及前因后果,然后施展终极大招——大神求教法。这里的大神可以是团队里的老人,可以是技术社区的大佬,可以是技术群里的高人。

得到大佬指点后重新尝试,解决问题后,需要做好相关的异常解决笔记,日积月累之下,自然也成为了同事眼中的大神。




总结

本文主要给大家分享了自己工作多年的bug处理经验,希望大家所有收获,遇见bug再也不慌。


推荐阅读
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 本文详细介绍了云服务器API接口的概念和作用,以及如何使用API接口管理云上资源和开发应用程序。通过创建实例API、调整实例配置API、关闭实例API和退还实例API等功能,可以实现云服务器的创建、配置修改和销毁等操作。对于想要学习云服务器API接口的人来说,本文提供了详细的入门指南和使用方法。如果想进一步了解相关知识或阅读更多相关文章,请关注编程笔记行业资讯频道。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 标题: ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • 本文介绍了sqlserver云存储和本地存储的区别,云存储是将数据存储在网络上,方便查看和调用;本地存储是将数据存储在电脑磁盘上,只能在存储的电脑上查看。同时提供了几种启动sqlserver的方法。此外,还介绍了如何导出数据库的步骤和工具。 ... [详细]
author-avatar
手机用户2502935255
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有