首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

和各种诡异 Bug 打交道 13 年,我总结了 18 个经验

即使这通常不会发生,在系统的其他部分(交互系统)bug也会导致它发生。 2.处理太早 这是上述“事件顺序”的一个特殊情况,但是它已导致了一些棘手的bug,所以它自成一派。...3.隐蔽故障 例如,一些最难找的的 bug 是由于出现了隐蔽故障而继续执行而不是给出错误的代码导致的。例如,系统调用绑定)返回未检查的错误代码。...测试 作为一名开发者,除非进行测试,否则我不会说完成一项功能。起码这意味着每一行新代码更改后的代码至少执行了一次。此外,单元测试功能测试也很好,但不够。...通过发送有待解码的随机性字节,我们发现了解码器的几个 bug。另一个例子是使用测试调用生成脚本,其中调用持续时间、回复延迟、第一方挂断等都是随机生成的内容。...其他的问题,像回路错误和极端案例,我见的少得多,因为我单元测试了更多逻辑,但这并不意味着那里没有 bug。这篇文章总结的经验教训,帮助我在编码、测试和调试这三个阶段尽量减小破坏。

65130

和各种诡异 Bug 打交道 13 年,我总结了 18 条经验

即使这通常不会发生,在系统的其他部分(交互系统)bug也会导致它发生。 2. 处理太早 这是上述“事件顺序”的一个特殊情况,但是它已导致了一些棘手的bug,所以它自成一派。...隐蔽故障 例如,一些最难找的的 bug 是由于出现了隐蔽故障而继续执行而不是给出错误的代码导致的。例如,系统调用绑定)返回未检查的错误代码。...测试 作为一名开发者,除非进行测试,否则我不会说完成一项功能。起码这意味着每一行新代码更改后的代码至少执行了一次。此外,单元测试功能测试也很好,但不够。...通过发送有待解码的随机性字节,我们发现了解码器的几个 bug。另一个例子是使用测试调用生成脚本,其中调用持续时间、回复延迟、第一方挂断等都是随机生成的内容。...其他的问题,像回路错误和极端案例,我见的少得多,因为我单元测试了更多逻辑,但这并不意味着那里没有 bug。这篇文章总结的经验教训,帮助我在编码、测试和调试这三个阶段尽量减小破坏。

87680
您找到你想要的搜索结果了吗?
是的
没有找到

13 年的 Bug 调试经验总结

一些最难跟踪的bug有部分是由那些静静失败并扩展而不是抛出错误的代码所导致的。例如,没有检查代码却返回错误的系统调用bind)。又如:解析代码在它遇到错误元素的时候只是返回而非抛出错误。...在错误状态持续了一段时间的调用,会使调试变得更难。最好一旦检测到故障就返回错误。 4.If。...另一个例子是可以进行API调用的一个命令行工具。通过启动逐渐添加所需小功能,我得到了一些非常有用的工具。自己写工具的好处是,我得到的正是我想要的。 在测试中发现所有的bug,那绝对是不可能的。...我见过很多这样的情况,让我明白,因为不寻常的配置意料之外的用法而导致不可思议的事情的发生,而我默认的假设是,他们是正确的,程序是错误的。 18.测试修复。如果bug修复已准备就绪,那就必须进行测试。...在工作于C++时所遇到的几类bug已经完全消失,像堆栈溢出,内存损坏,字符串问题和某种形式的内存泄漏。 其他问题,循环错误和边界情况,我看到的要少得多。但是,这并不意味着那里没有bug

71850

Github又放大招了!自动化审查代码神器,省时又省事!

Linters是用于查找源代码Bug错误,格式错误,构建不良的结构以及其他可能导致效率低下的代码问题的工具。 Super Linter通过自动化解决了许多需求。...Super Linter本身是一个打包在Docker容器的代码存储库,任何在GitHub上具有存储库的人都可以使用GitHub Action对其进行调用。...Super Linter可以设置为在打开拉取请求时运行,它会通知你是否通过代码更改,或者检测代码Bug,然后开发人员就可以返回其分支,修复Bug,并创建一个新的拉取请求。 ?...从代码库的README上看,Super Linter目前已支持Go、JavaScript、JSON、Markdown、Python3、Ruby等18种编程语言,并将于后续添加更多编程语言的支持: ?...但是,Super Linter也有一定的局限性: 因为它是运行时打包,所以无法更新依赖项 Super Linter不会从JSON包读取其他详细信息 用户无法从专用存储库下载其他代码库作为依赖项。

68610

13 年的 Bug 调试经验总结

一些最难跟踪的bug有部分是由那些静静失败并扩展而不是抛出错误的代码所导致的。例如,没有检查代码却返回错误的系统调用bind)。又如:解析代码在它遇到错误元素的时候只是返回而非抛出错误。...在错误状态持续了一段时间的调用,会使调试变得更难。最好一旦检测到故障就返回错误。 4.If。...另一个例子是可以进行API调用的一个命令行工具。通过启动逐渐添加所需小功能,我得到了一些非常有用的工具。自己写工具的好处是,我得到的正是我想要的。 在测试中发现所有的bug,那绝对是不可能的。...如果bug修复已准备就绪,那就必须进行测试。首先在修复前运行代码,并观察该bug。然后应用修复并重复测试案例。到此为止错误行为应消失。...其他问题,循环错误和边界情况,我看到的要少得多。但是,这并不意味着那里没有bug。这篇文章的经验教训旨在帮助减少编码,测试和调试三个阶段的bug

94890

13 年的 Bug 调试经验总结

一些最难跟踪的bug有部分是由那些静静失败并扩展而不是抛出错误的代码所导致的。例如,没有检查代码却返回错误的系统调用bind)。又如:解析代码在它遇到错误元素的时候只是返回而非抛出错误。...在错误状态持续了一段时间的调用,会使调试变得更难。最好一旦检测到故障就返回错误。 4.If。...另一个例子是可以进行API调用的一个命令行工具。通过启动逐渐添加所需小功能,我得到了一些非常有用的工具。自己写工具的好处是,我得到的正是我想要的。 在测试中发现所有的bug,那绝对是不可能的。...我见过很多这样的情况,让我明白,因为不寻常的配置意料之外的用法而导致不可思议的事情的发生,而我默认的假设是,他们是正确的,程序是错误的。 18.测试修复。如果bug修复已准备就绪,那就必须进行测试。...在工作于C++时所遇到的几类bug已经完全消失,像堆栈溢出,内存损坏,字符串问题和某种形式的内存泄漏。 其他问题,循环错误和边界情况,我看到的要少得多。但是,这并不意味着那里没有bug

70060

13 年的 Bug 调试经验总结

一些最难跟踪的bug有部分是由那些静静失败并扩展而不是抛出错误的代码所导致的。例如,没有检查代码却返回错误的系统调用bind)。又如:解析代码在它遇到错误元素的时候只是返回而非抛出错误。...在错误状态持续了一段时间的调用,会使调试变得更难。最好一旦检测到故障就返回错误。 4.If。...另一个例子是可以进行API调用的一个命令行工具。通过启动逐渐添加所需小功能,我得到了一些非常有用的工具。自己写工具的好处是,我得到的正是我想要的。 在测试中发现所有的bug,那绝对是不可能的。...我见过很多这样的情况,让我明白,因为不寻常的配置意料之外的用法而导致不可思议的事情的发生,而我默认的假设是,他们是正确的,程序是错误的。 18.测试修复。如果bug修复已准备就绪,那就必须进行测试。...在工作于C++时所遇到的几类bug已经完全消失,像堆栈溢出,内存损坏,字符串问题和某种形式的内存泄漏。 其他问题,循环错误和边界情况,我看到的要少得多。但是,这并不意味着那里没有bug

50120

13 年的 Bug 调试经验总结

一些最难跟踪的bug有部分是由那些静静失败并扩展而不是抛出错误的代码所导致的。例如,没有检查代码却返回错误的系统调用bind)。又如:解析代码在它遇到错误元素的时候只是返回而非抛出错误。...在错误状态持续了一段时间的调用,会使调试变得更难。最好一旦检测到故障就返回错误。 4.If。...另一个例子是可以进行API调用的一个命令行工具。通过启动逐渐添加所需小功能,我得到了一些非常有用的工具。自己写工具的好处是,我得到的正是我想要的。 在测试中发现所有的bug,那绝对是不可能的。...我见过很多这样的情况,让我明白,因为不寻常的配置意料之外的用法而导致不可思议的事情的发生,而我默认的假设是,他们是正确的,程序是错误的。 18.测试修复。如果bug修复已准备就绪,那就必须进行测试。...在工作于C++时所遇到的几类bug已经完全消失,像堆栈溢出,内存损坏,字符串问题和某种形式的内存泄漏。 其他问题,循环错误和边界情况,我看到的要少得多。但是,这并不意味着那里没有bug

69560

嵌入式大牛10年调Bug经验总结

使用过C ++,Ruby,Java和Python等。这篇文章的经验教训旨在帮助减少编码,测试和调试三个阶段的bug。 下面这些都是我经历过的会导致难点bug的问题: 1.事件顺序。...一些最难跟踪的bug有部分是由那些静静失败并扩展而不是抛出错误的代码所导致的。例如,没有检查代码却返回错误的系统调用(bind)。又如:解析代码在它遇到错误元素的时候只是返回而非抛出错误。...在错误状态持续了一段时间的调用,会使调试变得更难。最好一旦检测到故障就返回错误。 4.If。...我见过很多这样的情况,让我明白,因为不寻常的配置意料之外的用法而导致不可思议的事情的发生,而我默认的假设是,他们是正确的,程序是错误的。 5.测试修复。如果bug修复已准备就绪,那就必须进行测试。...其他观察结果 现在工作于C++时所遇到的几类bug已经完全消失,像堆栈溢出,内存损坏,字符串问题和某种形式的内存泄漏。 其他问题,循环错误和边界情况,我看到的要少得多。

43311

如何描述一个bug 如何定义bug的类型级别 bug的生命周期

定义一个bug的严重程度 每个公司的要求都不同,这里只是提供一个参考 Blocker(崩溃): 阻碍开发测试工作的问题;造成系统崩溃、死机、死循环,导致数据库数据丢失,与数据库连接错误,主要功能丧失...:代码错误、死循环、数据库发生死锁、重要的一级菜单功能不能使用等(该问题在测试较少出现,一旦出现应立即中止当前版本测试)。...Critical(严重): 系统主要功能部分丧失、数据库保存调用错误、用户数据丢失,一级功能菜单不能使用但是不影响其他功能的测试。...功能设计与需求严重不符,模块无法启动调用,程序重启、自动退出,关联程序间调用冲突,安全问题、稳定性等。:软件数据保存后数据库显示错误,用户所要求的功能缺失,程序接口错误,数值计算统计错误等。...:操作时间长、查询时间长、格式错误、边界条件错误,删除没有确认框、数据库表字段过多等(该问题实际测试存在最多) Minor(次要): 界面、性能缺陷,建议类问题,不影响操作功能的执行,可以优化性能的方案等

69220

InnoDB bugs found during research on InnoDB data storage(10.在研究InnoDB数据存储时发现的InnoDB bug

在研究InnoDB的存储格式和构建innodb_ruby和innodb_diagrams项目的过程,我和Davi Arnaut发现了很多InnoDB的bug。我想我应该提几个,因为它们相当有趣。...使用它来检查生产表提供了许多信息,可以继续寻找导致错误的原因。...Bug #67718: InnoDB drastically under-fills pages in certain conditions InnoDB在某些情况下会导致页填充不足,由于在插入过程过于积极地尝试基于插入顺序来优化页面分割...插入通常是通过队列和其他非即时机制进行的,因此IDs将发现它们进入数据库的方式略有混乱。 2.Nearly-ordered keys 另一个模式有一个主键和一个副键,它们的顺序相似,但不完全相同。...页面被分割后,插入将发生在两个结果页面的一个页面。 这忽略了在实践中非常常见的一种情况,即目标页已满,但它的一个多个相邻页有空闲空间,甚至可能几乎为空。

58200

我只是一名平庸的开发者

搞糟的原因包括: 语言错误 逻辑错误 设计错误 样式错误 安全错误 WTF错误(我向来最为喜欢的!) 关于“学习如何编写没有bug的代码”的魔法书是不存在的。...因为所有软件都有bug——除了这个框架之外。遇到bug我们就应该处理掉。 关键要点是:每个人编写的代码都不应该带有明显的错误。对的,至少,我们应该朝着这个目标去做。...生存指南: 编写测试。编写很多测试。从集成测试到单元测试。在每次pull请求前在CI运行测试。这可以避免一些逻辑错误; 使用静态类型或可选的静态类型。...在合并为master之前对其进行审查。以及合并后的某个时间也是如此; 付钱让其他人来审核你的代码。此手段可以产生巨大的积极影响!...这样,如果我的构建在测试部署失败,那么就会有报告发我。 生存指南: 自动化用于部署的任何内容; 使用docker进行应用程序开发、测试和部署; 使用部署工具。

831100

百万年薪程序员博文:Python程序员心得,我视它为生存指南!

搞糟的原因包括: 语言错误 逻辑错误 设计错误 样式错误 安全错误 WTF错误(我向来最为喜欢的!) 关于“学习如何编写没有bug的代码”的魔法书是不存在的。...因为所有软件都有bug——除了这个框架之外。遇到bug我们就应该处理掉。 关键要点是:每个人编写的代码都不应该带有明显的错误。对的,至少,我们应该朝着这个目标去做。...生存指南: 编写测试。编写很多测试。从集成测试到单元测试。在每次pull请求前在CI运行测试。这可以避免一些逻辑错误; 使用静态类型或可选的静态类型。...在合并为master之前对其进行审查。以及合并后的某个时间也是如此; 付钱让其他人来审核你的代码。此手段可以产生巨大的积极影响!...这样,如果我的构建在测试部署失败,那么就会有报告发我。 生存指南: 自动化用于部署的任何内容; 使用docker进行应用程序开发、测试和部署; 使用部署工具。

50800

平庸开发者的生存指南

搞糟的原因包括: 语言错误 逻辑错误 设计错误 样式错误 安全错误 WTF错误(我向来最为喜欢的!) 关于“学习如何编写没有bug的代码”的魔法书是不存在的。...因为所有软件都有bug——除了这个框架之外。遇到bug我们就应该处理掉。 关键要点是:每个人编写的代码都不应该带有明显的错误。对的,至少,我们应该朝着这个目标去做。...生存指南: 编写测试。编写很多测试。从集成测试到单元测试。在每次pull请求前在CI运行测试。这可以避免一些逻辑错误; 使用静态类型或可选的静态类型。...在合并为master之前对其进行审查。以及合并后的某个时间也是如此; 付钱让其他人来审核你的代码。此手段可以产生巨大的积极影响!...这样,如果我的构建在测试部署失败,那么就会有报告发我。 生存指南: 自动化用于部署的任何内容; 使用docker进行应用程序开发、测试和部署; 使用部署工具。

39310

平庸开发者的生存指南

搞糟的原因包括: 语言错误 逻辑错误 设计错误 样式错误 安全错误 WTF错误(我向来最为喜欢的!) 关于“学习如何编写没有bug的代码”的魔法书是不存在的。...因为所有软件都有bug——除了这个框架之外。遇到bug我们就应该处理掉。 关键要点是:每个人编写的代码都不应该带有明显的错误。对的,至少,我们应该朝着这个目标去做。...生存指南: 编写测试。编写很多测试。从集成测试到单元测试。在每次pull请求前在CI运行测试。这可以避免一些逻辑错误; 使用静态类型或可选的静态类型。...在合并为master之前对其进行审查。以及合并后的某个时间也是如此; 付钱让其他人来审核你的代码。此手段可以产生巨大的积极影响!...这样,如果我的构建在测试部署失败,那么就会有报告发我。 生存指南: 自动化用于部署的任何内容; 使用docker进行应用程序开发、测试和部署; 使用部署工具。

64320

原创 | 一头扎进 IoT Bugs 是种什么体验?

其中一些使用其他编程语言,Go、Ruby和c#。 选择的存储库在star和fork的数量上也是不同的。...这种类型的错误通常发生在将物联网设备引入物联网网络的早期阶段。每个设备必须配置正确,与其他硬件软件组件兼容,并能够与网络上的其他设备通信。第三个也是最常见的子类别是固件升级问题。...物联网开发人员犯的一些语义错误包括未处理好控制流、功能逻辑返回值。然而,一些语义bug与物联网系统的自动化逻辑有关,自动化应用程序的逻辑故障。上图显示了错误类别和根本原因的分布。...另外,P5、8,9所述,目前物联网的模拟解决方案还不够成熟,它们仅适用于有限的场景,测试高级控制器小单元测试,而不适合所有级别的测试系统测试。...五、讨论 在实践没有采用物联网测试解决方案: 原文参考文献已经提出了多种物联网测试工具和方法,设备模拟器、物联网单元测试框架等。

70020

测试人员必看-做好自动化测试的7大技能

从用户的角度查看软件,可以帮助测试人员识别UI和可用性测试,以发现bug,这是在自动化脚本难以编程的特性。 (2)人工测试也是必不可少的 自动化测试是一台机器,机器只做它被要求做的事。...它帮助测试人员使用最简单的方法进行思考和测试,而简单的方法很难在自动化脚本编程。即使是可视化的跨浏览器测试也需要手工方法。...这个工具也支持通过 CI 集成工具 Jenkins 来支持 CI。 4. Watir Watir 是一个基于 Ruby 库的开源的网页自动化测试工具。...在项目中,也可能会遇到这样的场景: “脚本在测试结果显示了一些错误,但是应用程序按照业务需求运行良好。脚本显示成功,但应用程序抛出了一些实时错误。”...因为它们是灵活的,允许用户记录任何错误,并根据错误如何影响项目根据优先级对它们进行排序。此外,它的可伸缩性允许团队成员之间轻松地交换信息。

2.3K00

软件测试:基础篇

- 测试阶段 -测试阶段是软件测试人员最为重要的工作阶段,根据测试用例和计划执行测试,在执行的过程记录、管理缺陷,测试完成后编写测试报告。编写测试报告是为了对缺陷进行分析。...:代码错误、死循环、数据库发生死锁、重要的一级菜单功能不能使用等。 2. Critical(严重): 系统主要功能部分缺失、一级功能菜单不能使用但是不影响其他功能的测试。...功能设计与需求严重不符,模块无法启动调用,程序重启、自动退出,关联程序间调用冲突,安全问题、稳定性等。(该等级问题出现在不影响其他功能测试的情况下可以继续该版本测试)。 3....:操作时间长、查询时间长、格式错误、边界条件错误,删除没有确认框、数据库表字段过多等(该问题实际测试存在最多)。 4....Rejected:如果认为不是Bug,则拒绝修改。 Delay:如果认为暂时不需要修改暂时不能修改,则延后修改。 Closed:修改Bug的状态经测试人员的回归测试通过后,关闭Bug

65620

Ruby 应用容器封装踩坑记录(Lobsters)

一般的 Web 应用封装都会经历下下几个阶段,整合源代码,安装应用依赖和环境,进行程序/产物的编译,调整权限和目录结构,进行测试,完成后对镜像打标签进行版本管理。 这次的踩坑记录亦是如此。...但是还是存在一些问题,我们继续进行优化,解决这些不应该存在的“警告”,避免程序在运行时出现其他问题。...第七回合:升级 Rake 版本到合适版本 接着来解决 rake 的版本问题,和 bundler 的处理思路一样,非必要,不需要进行额外指定是最好的。...在容器镜像文件我们有定义 bundle install --no-cache,所以这里错误提示后的建议的内容是不准确的,推测这里的问题是缺失 rake 依赖包,在镜像文件添加命令,对其进行安装。...但是报错依旧,再次看错误日志,看到一个隐藏逻辑:“rake 调用者是 bundler”,所以是不是应该先安装 rake ,再安装 bundler 呢?

4.8K00

Ruby 应用容器封装踩坑记录(Lobsters)

一般的 Web 应用封装都会经历下下几个阶段,整合源代码,安装应用依赖和环境,进行程序/产物的编译,调整权限和目录结构,进行测试,完成后对镜像打标签进行版本管理。 这次的踩坑记录亦是如此。...但是还是存在一些问题,我们继续进行优化,解决这些不应该存在的“警告”,避免程序在运行时出现其他问题。...第七回合:升级 Rake 版本到合适版本 接着来解决 rake 的版本问题,和 bundler 的处理思路一样,非必要,不需要进行额外指定是最好的。...在容器镜像文件我们有定义 bundle install--no-cache,所以这里错误提示后的建议的内容是不准确的,推测这里的问题是缺失 rake 依赖包,在镜像文件添加命令,对其进行安装。...但是报错依旧,再次看错误日志,看到一个隐藏逻辑:“rake 调用者是 bundler”,所以是不是应该先安装 rake ,再安装 bundler 呢?

7.4K10
领券