程序员新人怎样在复杂代码中找 bug?


我曾经做了两年大型软件的维护工作,那个项目有 10 多年了,大约 3000 万行以上的代码,参与过开发的有数千人,代码 checkout 出来有大约 5 个 GB,而且 bug 特别多,open 的有上千,即使最高优先级的 showstopper 也有上百。分享下我的 debug 的经验 ——



  1. 优先解决那些可重现的,可重现的 bug 特别好找,反复调试测试就好了,先把好解决的干掉,这样最节约时间。

  2. 对于某些 bug 没有头绪或者现象古怪不知道从哪里下手,找有经验的同事问一下思路,因为在那种开发多年的大型系统里,经常会反复出现同样原因的 bug,原因都类似,改了一处,过一阵子另外一处又冒出来,而且无法根治。比如:我那个系统里有个特别危险的 API,接口参数比较难用,一旦有人用错了某些情况下就会出诡异的现象,解决很简单,找到调用这个 API 的地方把调用方式写对就好了。为什么不根治呢?因为要保持兼容性不能改接口了。Windows 系统里就好多这种烂 API。问下老员工吧,说不定他们都遇到过好多次了。

  3. 放大现象,有些 bug 现象不太明显,那么就想办法增大它的破坏性,把现象放大。这只是个思路,具体怎么放大只能根据具体的代码来定。比如:美剧《豪斯医生》里有一集,怀疑病人心肺有问题,就让病人去跑步机上跑步,加重心肺负担,从而放大症状。

  4. 二分法定位,把程序逻辑一点点注释掉,看看还会不会出问题,类似二分查找的方法,逐步缩小问题范围。

  5. 模拟现场,有时候我会问自己,如果我要实现 bug 描述的现象我要怎么写代码才行?比如:我遇到一个死锁问题,但是检查代码发现所有的锁都是配对的,没有忘记解锁的地方,而且锁很简单就是一个普通的临界段,保护几行赋值语句而已。这样的代码怎么写才能让他死锁呢?我想如果让我故意制造这样一个现象,只有在上锁的时候强制杀掉线程了。既然这样就可以去看看有谁强杀线程了没有。

  6. 制作工具,针对某些 bug 编写一些调试辅助工具。比如,我那个系统没有完善的崩溃报告,虽然也有 dump,但是分析出来的 callstack 经常不准。于是我为解决崩溃问题编写了个工具,会自动扫描代码,在每个函数入口和出口插入 log,以此来定位崩溃点。

  7. 掩盖问题,虽然这样做有点不厚道,但是有时不得不这么做。有些 bug 找不到真正的 root cause,但是又要在规定时间内解决,那么我们就可以治疗症状而不去找病因。比如用 try catch 掩盖一些奇怪的崩溃。不到万不得已不要这么干,未来可能会付出更大代价。


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

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

相关文章

谈到云原生, 绕不开容器化

传送门什么是云原生?云原生设计理念.NET微服务Containers现在谈到云原生, 绕不开“容器”。在《Cloud Native Patterns》一书中,作者Cornelia Davis指出:“容器是云原生应用的基石”;云原生基金会将微服务容器化作为云…

如果有人问你什么是大数据?不妨说说这10个典型的大数据案例

在听Gartner的分析师Doug Laney用55分钟讲述55个大数据应用案例之前,你可能对于大数据是否落地还心存疑虑。Laney的演讲如同莎士比亚的全集一样,不过可能“缺乏娱乐性而更具信息量”(也许对于技术人员来说是这样的)。 这个演讲是对…

各高校寒假时间公布_高校放假哪家长?多所高校寒假时间公布!

11月25日2021年放假安排公布大家发现2020年已经接近尾声对于学生族来说考试近了寒假也快到了快来看看高校放假哪家长? (如有调整变动,以各高校最新通知为准)山东大学1月11日开始放假到2月28日结束寒假一共49天山东师范大学1月31日开始放假到3月6日结束寒…

ASP.NET Core 对Controller进行单元测试

单元测试对我们的代码质量非常重要。很多同学都会对业务逻辑或者工具方法写测试用例,但是往往忽略了对Controller层写单元测试。我所在的公司没见过一个对Controller写过测试的。今天来演示下如果对Controller进行单元测试。以下内容默认您对单元测试有所了解&#…

12对胸椎对应体表标志_铁路信号之信号表示器及标志(三)

信 号 标 志1.信号标志,设在列车运行方向左侧(警冲标除外)。双线区段的轨道电路调谐区标志设在线路外侧。(1)警冲标:设在两会合线路线间距离为4 m的中间。线间距离不足4m时,设在两线路中心线最大…

python 画树 递归_python递归函数绘制分形树的方法

分形几何学的基本思想:客观事物具有自相似性的层次结构,局部和整体在形态,功能,信息,时间,空间等方面具有统计意义上的相似性,称为自相似性,自相似性是指局部是整体成比例缩小的性质…

mui 时间样式错乱_微信编辑器样式排版错位怎么回事?

有小伙伴反映在使用365编辑器时遇到素材样式无法正常使用的情况,出现排版错乱的情况,今天猫头鹰针对这个问题写了一篇避坑指南,或许能帮到小伙伴们~365微信编辑器样式排版错位怎么回事?这种情况的发生其实是排版过程中的错误操作导…

海德汉编程详细手册_UG编程海德汉系统螺旋铣孔最后一刀欠切解决方案

 提示:点击上方"NX网"↑ 免费订阅 关注老叶今天给大家分享一个海德汉螺旋铣孔最后一圈不加工:新建一个模型,只要是深度不能整除螺距,都会存在这样的问题OK 新建一个默认后处理用来测试最后一圈确实存在问题…

逝者如斯,且听我胡说八道

【导读】嗯、转瞬即逝,还未来得及转身,2020就又这么溜了,溜了,趁其弥留之际,通过小作坊对2020年做个基本总结当我决心要写一篇总结时,我发现我要完了,这可不是一两个小时就能搞定的事情&#xf…

汇总:2017 年 IT 界最严重的裁员事件

裁员年年都有,今年特别多从微软、Oracle、IBM,到思科、HPE,再到雅虎、stackoverflow,无论是处于转型变革中的老牌巨头,还是日渐成熟的创新型公司,在动荡的科技行业,裁员风波一浪高过一浪&#x…

2020 年终总结:变化 积累

这是「进击的Coder」的第 32 篇个人随想作者:崔庆才之前写年终总结都是在每年正月,今年也不例外了。2020 年,对每个人来说都是特殊的一年,突入其来的新冠疫情给大家的生活带来了很大的变化,尤其上班年困难的时候&#…

11尺寸长宽 iphone_新手必知LED显示屏尺寸规格及计算方法

前言:LED屏幕在生活中,随处可见,显示屏、广播屏等等,但是LED尺寸怎么计算的,你知道吗?今天我们一起了解一下LED屏幕尺寸的计算方法。一、点间距的计算1、各单元板常见型号及尺寸LED屏普遍是用单元板做的。L…

ISA服务器之域内×××用户在外网通过CA验证连接域内×××服务器

一般情况下用户在连接服务器是是要输入密码的,如果这样的话,那么在一些公共场合输入密码的时候很有可能造成密码的泄露,从而造成不必要的损失。口令验证协议虽然硬件上的要求没有质询握手协议那么高,但是,在安全性上面…

高斯、柯西、拉格朗日都还在的话,他们应该最喜欢这个公众号

在现实生活中,你和谁在一起的确很重要,甚至能改变你的成长轨迹,决定你的人生成败。 是否还记得,当你跟学霸做同学的时候,你总会莫名其妙跟他一起撸题目;当宿舍其他兄弟正在打游戏的时候,你也想着…

div css标记,前端初学者必学的div加css标签

原标题:前端初学者必学的div加css标签今天给大家分享前端初学者必须要学习的标签,这些标签你都会了吗?DIV加css标签页头:header登录条:loginBar标志:logo侧栏:sideBar广告:banner导航:nav子导航:subNav菜单:menu子菜单:subMenu搜索:search滚动…

python123动物重量排序_Python爬虫图片学习(一)

Python爬虫学习 一、Python安装与调用 python官网安装地址:https://www.python.org/python帮助手册:在本机的路径C:\Users\Administrator\AppData\Local\Programs\Python\Python37\Doc 创建一个1.py文件,右键打开.py文件,用IDLE方…

activity 防止多次打开_Android开发Activity任务和返回栈

任务是用户在执行某项工作时与之互动的一系列 Activity 的集合。这些 Activity 按照每个 Activity 打开的顺序排列在一个返回堆栈中。例如,电子邮件应用可能有一个 Activity 来显示新邮件列表。当用户选择一封邮件时,系统会打开一个新的 Activity 来显示…

全程图解:Centos 5.2 下 ORACLE10G 安装配置

1、检查并安装ORACLE必须的软件包在CENTOS上安装Oracle,需要将ORACLE所必须的软件包逐一安装, 参考Oracle安装文档关于Red Hat Enterprise Linux 4.0部分,所需的软件包如下:binutils-2.17.50.0.6-6.el5compat-db-4.2.52-5.1compat-libstdc-33-3.2.3-61co…

提升代码可读性的 10 个技巧

具有较强可读性的代码,能帮助你调试程序,不让自己活得太累。 代码可读性是计算机编程领域中普遍存在的问题。这也是我们成为开发者首先要学习的事情之一。本文会详细介绍在编写强可读性代码时最佳实践中最重要的一部分内容。 1 - 注释和文档 IDE&#xf…