2019独角兽企业重金招聘Python工程师标准>>>

1.事件顺序

当处理事件时,问以下问题富有成效:事件是否可以以不同的顺序到达?如果没收到这些事件怎么办?如果事件在同一行出现两次怎么办?即使这通常不会发生,在系统的其他部分(或交互系统)中的bug也会导致它发生。

2.处理太早

这是上述“事件顺序”中的一个特殊情况,但是它已导致了一些棘手的bug,所以它自成一派。例如,如果信令信息接收得过早,在配置和启动程序完成之前接收,许多奇怪的行为就会发生。另一个例子,当一个连接在被放入空闲列表之前就被标记为断开。当我们处理这个问题时,我们通常假设它处在空闲列表状态时被标记为断开(但是当时它为什么没有从这个列表上撤下?) 没考虑到事情有时发生过早是由于我们没有想到。

3.隐蔽故障

例如,一些最难找的的 bug 是由于出现了隐蔽故障而继续执行而不是给出错误的代码导致的。例如,系统调用(如绑定)返回未检查的错误代码。另一个例子:当遇到一个错误元素时,直接返回而不是给出错误的解析代码。调用在故障的状态下持续了一段时间,使得调试的难度加大。一旦故障被检测出,最好要及时返回这个错误。

4.If语句

含有多个条件的If语句(if (a or b),尤其是当嵌套时,if (x) else if (y)),给我导致了许多 bug。即使If语句在概念上很简单,当它有多个条件需要追踪时,很容易出错。最近我尝试重新把代码写得简洁,避免出现复杂的If语句。

5.Else

有一些bug的产生是由于没有恰当地考虑如果条件为假,什么应该发生。在几乎所有的情况下,每个If语句都应该有个else部分。而且,如果你在If语句的一个分支中设置了一个变量,你也许应该在其他分支也设置该变量。与此相关的是标志(flag)被设定的情况。仅仅添加设定标志的条件很容易,但是容易忘了添加应该重新设定标志的条件。任由永久性设定的标志留在那里可能会在将来导致 bug。

6.改变假设

一开始最难预防的许多bug是由不断变化的假设引起的。例如,最初仅仅只有一个客户,在这个假设下写了很多代码。后来某个时候,设计发生了变化,允许每天有多个客户事件。当这种情况发生,就很难改变受到新设计影响的所有情况。很容易找到显式依赖该变化的所有项,但是难的部分是,找到隐式依赖旧设计的所有情况。例如,可能有代码读取给定某一天的所有客户事件。一个隐式的假设可能是,结果集中元素的数量绝对不会大于客户数量。我没有好的方法可以预防这类问题,欢迎读者建议。

7.日志记录

深入了解程序所做的任务是至关重要的,尤其是当逻辑复杂的时候。确保添加足够的(但也别太多)日志记录。那样你就能弄清楚为什么程序在执行它执行的任务。让一切运转良好时,它无关紧要。但是只要问题发生(这不可避免),你会很庆幸你添加了合适的日志记录。

作为一名开发者,除非进行了测试,否则我不会说完成一项功能。起码这意味着每一行新代码或更改后的代码至少执行了一次。此外,单元测试或功能测试也很好,但不够。新功能还必须在类似产品的环境下进行测试和探究。唯有这样,我才可以说完成了一项功能。下面是 bug 在测试方面给予我的一些重要的经验教训:

8.零(zero)和空(null)

务必要以零和空(合适的情况下)来进行测试。对于字符串而言,这意味着既指长度为零的字符串,又指内容为空的字符串。另一个例子:在发送任何数据(零字节)之前,测试 TCP 连接的断开。没有使用这些组合来测试是 bug 悄然出现的头号原因,我在测试时是原本可以发现这些 bug 的。

9.添加和删除

新功能常常需要能够为系统添加新配置,比如说用于电话号码翻译的新配置文件。我们会自然而然的添加一个配置文件,来验证功能是否正常。然而,我发现很容易忘了还要测试配置文件的删除。

10.错误处理

处理错误的代码常常很难测试。最好由自动测试来检查错误处理代码,但有时这不可能。这种情况下,我有时采用的一招就是,临时修改代码,让错误处理代码运行。要做到这一点,最容易的方法就是反转if语句,比如说将if语句由 error_count > 0反转为 error_count == 0。另一个例子是误拼数据库列名,让所需的错误处理代码运行。

11.随机输入

另一种往往能够发现 bug 的测试方法是进行随机输入。例如,H.323 协议的 ASN.1 解码可处理二进制数据。通过发送有待解码的随机性字节,我们发现了解码器中的几个 bug。另一个例子是使用测试调用生成脚本,其中调用持续时间、回复延迟、第一方挂断等都是随机生成的内容。这些测试脚本暴露了无数 bug,尤其是接踵而至的事件引起的干扰。

12.检查什么不该发生

通常测试包括检查一些需要的行为发生。但是很容易忽略他的对立面——检查不该发生的事确实没发生。

13.自制工具

通常,我创建了自己的小工具来使测试更简易。例如,当我处理面向 VoIP 的 SIP 协议时,我写了一个小的脚本可以返回正标题和值。这个工具使得测试许多个别场景变得简单。另一个例子是可以调用 API 的命令行工具。从小的开始,逐渐添加一些需要的功能,我最终有许多有用的工具,写自己的小工具的优势是我得到我想要的功能。

14.讨论

在过去对我帮助最大的调试方法就是与同事讨论问题。我常常只要向同事描述问题,就足以认识到问题是什么。此外,即使同事不是很熟悉相应代码,常常也能給出好主意,表明哪里可能有问题。

15.密切注意

往往是当调试一个问题很长时间时,是因为我做了错误的假设。例如,我认为这个问题发生在一个特定的方法中,事实上,这个问题甚至根本不会出现在这个方法中。或者抛出的异常并不是我认为的那个。或者我认为最新版的软件在运行,但它其实是较老的版本。

16.最近的一次改动

本该运行的程序停止了,它通常是由最后的一次变动导致。有一次,最近的一次变动仅仅是日志,但是日志中的一个错误导致了更大的问题。

17.相信用户

有时当一个用户反馈问题时,我的本能反应是:这不可能,他们一定搞错了。但是我已经意识到我不应该这样做。我也不想这样,但更多次,事实证明他们报告的问题实际上发生了。

18.测试修复的效果

如果你已经修复了 bug,还需要再测试。首先运行修复前的代码,然后观察 bug。然后运用修复再次测试。现在 bug 的问题应该被消除了。继续这些步骤确保它确实是一个 bug,确保你的修复已经修复这个问题。简单但很必要。

阅读原文

转载于:https://my.oschina.net/u/3006003/blog/863646

跟各种诡异 Bug 打交道 13 年后的总结相关推荐

  1. WIN 10 又出诡异Bug,访问特定本地设备导致系统崩溃

    本文转载自 小道黑客 Windows 10 出现了新 bug:在浏览器的地址栏中或使用其他 Windows 命令打开特定路径,即可使电脑系统崩溃并显示蓝屏. 自去年 10 月以来,Windows 安全 ...

  2. android下前端开发诡异bug记录解决方法

    1.border-radius有bug,围不住background 描述:设置了border-radius后,背景色依然会从圆角里冒出来 解决方法:在设置了border-radius的容器加上back ...

  3. layui layer诡异bug记录

    1.新版本的layui使用table,最后一列工具栏会出现闪烁,重绘,测试发现我19年就没有这个bug,这个bug是后期引入的,看了很多更新记录,说后面会解决这个bug,但是没看到解决的结果,直到la ...

  4. Android P内联优化导致的一个诡异Bug

    问题背景 最近,我们的业务在动态加载一款第三方游戏时出现了奇怪的现象,本地开发测试体验良好,但是使用CI构建的正式包体验时会出现启动闪退. 问题分析 分析日志 首先,我们自然而然看了下Crash日志, ...

  5. 三星天气显示服务器不可用,三星手机天气APP出现诡异BUG!网友:这就是它爆炸的原因?...

    近日全国多位网友反映自己的三星手机天气报告出现了很严重的BUG,显示温度高达999度,这让不少三星用户很是震惊,甚至有的网友说,起床看到立马出门看了一下外面是不是真的. 从网友发布的截图来看,无论是手 ...

  6. UserData的诡异bug

    User Data: 是微软为IE专门在系统中开辟的一块存储空间,所以说只支持Windows+IE的组合,实际测试在2000(IE5.5).XP(IE6.IE7),Vista(IE7)下都是可以正常使 ...

  7. 麦肯锡用 160 页报告告诉我们:13 年后 8 亿人的饭碗会被机器人抢了

    点击上方"CSDN",选择"置顶公众号" 关键时刻,第一时间送达! 如今人工智能风生水起,有关其即将取代人类的威胁论一浪高过一浪,正符合「人红是非多」的经典理论 ...

  8. springboot 数据库连接出现的诡异bug No operations allowed after connection closed.

    看下面配置中 数据库连接池的配置 说明,重点关注红色部分 server:   port: 9013 spring:   application:     name: api   datasource: ...

  9. 技术抉择:阿里云13年后重构全部核心调度系统

    编辑 | Tina 在阿里云十三年的发展历史上,重新设计调度系统算得上是一个重要的技术抉择. 云计算是一个庞大的技术工程.2009 年,阿里云从 0 到 1 自建国产云计算系统"飞天&quo ...

最新文章

  1. 监控web站点目录下所有文件是否被恶意篡改
  2. [Trie] Luogu P2580 于是他错误的点名开始了
  3. 快递员要失业?两位前谷歌工程师研发出自动驾驶汽车只送货不载人
  4. The return types for the following stored procedures could not be detected
  5. 论文浅尝 | Convolutional 2D knowledge graph embedding
  6. ThirdServiceManager SDK
  7. 1024,节日快乐!
  8. 【李宏毅2020 ML/DL】补充:Support Vector Machine (SVM)
  9. 进程之基础知识(一)
  10. 秒搜神器everything背后的索引原理
  11. 分享:把个人网站封装生成百度小程序的方法
  12. 几行CSS让你的页面立体起来
  13. 1024 程序员节狂欢盛会,等了一年终于来了(内附大会日程)
  14. 年终奖变期权,曝字节跳动将开启员工期权兑换
  15. 8-3 实现分数类中的运算符重载
  16. 辉光管升压电路理论,让USB升压170V
  17. 什么是3D偏差分析?浩辰3D偏差分析应用技巧
  18. Unity ShadowMap
  19. LeetCode算法,每日一题,冲击字节跳动
  20. 计算机人用英语怎么说,一大批英语:一万,十万,百万,千万,亿,用英语怎么说哦...

热门文章

  1. Spring注入service为null另类解决办法 工具类 一般类 静态 非controller
  2. dede采集 标题不完整
  3. 标准C++中string类用法总结
  4. Python学习前的计划
  5. DataTable转换成IList
  6. 一种定位内存泄露的方法(Linux)
  7. IOS 之__bridge__bridge_transfer和__bridge_retained
  8. Alpha 冲刺报告(8/10)
  9. 全国各省市直辖市软考机构联系方式(办公电话、网址、联系邮箱)
  10. Gartner:2014年全球MSS市场分析