写点什么

如何有效地报告 Bug?

  • 2012-10-08
  • 本文字数:2297 字

    阅读完需:约 8 分钟

自由软件开发者 Simon Tatham 针对如何有效地报告 Bug 发表了自己的看法,他列举了一系列拙劣 Bug 报告的例子,并提出了改正建议。

Simon 首先列举了一系列拙劣 Bug 报告的例子,包括:

  • 在报告中说“不好用”;
  • 所报告内容毫无意义;
  • 在报告中用户没有提供足够的信息;
  • 在报告中提供了错误信息;
  • 所报告的问题是由于用户的过失而产生的;
  • 所报告的问题是由于其他程序的错误而产生的;
  • 所报告的问题是由于网络错误而产生的;

接着,他点出了报告 Bug 的目的:

简单地说,报告 bug 的目的是为了让程序员看到程序的错误。您可以亲自示范,也可以给出能导致程序出错的、详尽的操作步骤。如果程序出错了,程序员会收集额外的信息直到找到错误的原因;如果程序没有出错,那么他们会请您继续关注这个问题,收集相关的信息。

在 bug 报告里,要设法搞清什么是事实(例如:“我在电脑旁”和“XX 出现了”)什么是推测(例如:“我想问题可能是出在……”)。如果愿意的话,您可以省去推测,但是千万别省略事实。

然后,Simon 针对 Bug 报告的不同问题分别提出了自己的见解:

“程序不好用”

程序员不是弱智:如果程序一点都不好用,他们不可能不知道。他们不知道一定是因为程序在他们看来工作得很正常。所以,或者是您作过一些与他们不同的操作,或者是您的环境与他们不同。他们需要信息,报告 bug 也是为了提供信息。信息总是越多越好。

许多程序,特别是自由软件,会公布一个“已知 bug 列表”。如果您找到的 bug 在列表里已经有了,那就不必再报告了,但是如果您认为自己掌握的信息比列表中的丰富,那无论如何也要与程序员联系。您提供的信息可能会使他们更简单地修复 bug。

“演示给我看”

报告 bug 的最好的方法之一是“演示”给程序员看。让程序员站在电脑前,运行他们的程序,指出程序的错误。让他们看着您启动电脑、运行程序、如何进行操作以及程序对您的输入有何反应。

他们对自己写的软件了如指掌,他们知道哪些地方不会出问题,而哪些地方最可能出问题。他们本能地知道应该注意什么。在程序真的出错之前,他们可能已经注意到某些地方不对劲,这些都会给他们一些线索。他们会观察程序测试中的每一个细节,并且选出他们认为有用的信息。

这些可能还不够。也许他们觉得还需要更多的信息,会请您重复刚才的操作。他们可能在这期间需要与您交流一下,以便在他们需要的时候让 bug 重新出现。他们可能会改变一些操作,看看这个错误的产生是个别问题还是相关的一类问题。如果您不走运,他们可能需要坐下来,拿出一堆开发工具,花上几个小时来好好地研究一下。但是最重要的是在程序出错的时候让程序员在电脑旁。一旦他们看到了问题,他们通常会找到原因并开始试着修改。

“哪儿出错了?在我看来一切正常哦!”

如果您给了程序员一长串输入和指令,他们执行以后没有出现错误,那是因为您没有给他们足够的信息,可能错误不是在每台计算机上都出现,您的系统可能和他们的在某些地方不一样。有时候程序的行为可能和您预想的不一样,这也许是误会,但是您会认为程序出错了,程序员却认为这是对的。

同样也要描述发生了什么。精确的描述您看到了什么。告诉他们为什么您觉得自己所看到的是错误的,最好再告诉他们,您认为自己应该看到什么。如果您只是说:“程序出错了”,那您很可能漏掉了非常重要的信息。

如果您看到了错误消息,一定要仔细、准确的告诉程序员,这确实很重要。在这种情况下,程序员只要修正错误,而不用去找错误。他们需要知道是什么出问题了,系统所报的错误消息正好帮助了他们。如果您没有更好的方法记住这些消息,就把它们写下来。只报告“程序出了一个错”是毫无意义的,除非您把错误消息一块报上来。

特殊情况下,如果有错误消息号,一定要把这些号码告诉程序员。不要以为您看不出任何意义,它就没有意义。错误消息号包含了能被程序员读懂的各种信息,并且很有可能包含重要的线索。给错误消息编号是因为用语言描述计算机错误常常令人费解。用这种方式告诉您错误的所在是一个最好的办法。

在这种情形下,程序员的排错工作会十分高效。他们不知道发生了什么,也不可能到现场去观察,所以他们一直在搜寻有价值的线索。错误消息、错误消息号以及一些莫名其妙的延迟,都是很重要的线索,就像办案时的指纹一样重要,保存好。

如果您使用 UNIX 系统,程序可能会产生一个内核输出(coredump)。内核输出是特别有用的线索来源,别扔了它们。另一方面,大多数程序员不喜欢收到含有大量内核输出文件的 EMAIL,所以在发邮件之前最好先问一下。还有一点要注意:内核输出文件记录了完整的程序状态,也就是说任何秘密(可能当时程序正在处理一些私人信息或秘密数据)都可能包含在内核输出文件里。

除此之外,Simon 还举了其他一些例子,他最后总结到:

  • bug 报告的首要目的是让程序员亲眼看到错误。如果您不能亲自做给他们看,给他们能使程序出错的详细的操作步骤。
  • 如果首要目的不能达成,程序员不能看到程序出错。这就需要 bug 报告的第二个目的来描述程序的什么地方出毛病了。详细的描述每一件事情:您看到了什么,您想看到什么,把错误消息记下来,尤其是“错误消息号”。
  • 当您的计算机做了什么您料想不到的事,不要动!在您平静下来之前什么都别做。不要做您认为不安全的事。
  • 尽量试着自己“诊断”程序出错的原因(如果您认为自己可以的话)。即使做出了“诊断”,您仍然应该报告“症状”。
  • 如果程序员需要,请准备好额外的信息。如果他们不需要,就不会问您要。他们不会故意为难自己。您手头上一定要有程序的版本号,它很可能是必需品。
  • 表述清楚,确保您的意思不能被曲解。
  • 总的来说,最重要的是要做到精确。程序员喜欢精确。

感兴趣的读者可以查看 Simon 的原文和中文版翻译

2012-10-08 18:112669
用户头像

发布了 501 篇内容, 共 247.4 次阅读, 收获喜欢 57 次。

关注

评论

发布
暂无评论
发现更多内容

「2024」不再内卷,让AI低代码带你玩点新花样!

优秀

AI 低代码 AI低代码 AI 人工智能

IO模型介绍(select、poll、epoll)

京东零售技术

Java 后端 io

✅inventory hint,解决热点数据如何高效更新

派大星

:MySQL 数据库 java 编程 热点数据

聊聊CWE 4.14 与 ISA/IEC 62443中,如何保障工业软件的安全性

华为云开发者联盟

安全 开发 华为云 华为云开发者联盟 工业软件

arthas火焰图async-profiler在云交易中的运用

京东科技开发者

官宣!前联邦快递亚太区董事总经理 Robin 加入 Tapdata 担任首席运营官

tapdata

数据库

嘿!AI 编码新玩法上线!

阿里巴巴云原生

阿里云 AI 云原生

度小满轩辕:金融行业的大模型实战派

脑极体

AI

ChatGPT是什么意思?从产品简介、替代软件到应用场景等全方位解读!

彭宏豪95

人工智能 在线白板 AIGC ChatGPT 效率软件

Metes and Bounds Pro for Mac(房地产契约绘图软件) v6.1.1激活版

iMac小白

1688 API接口与ERP系统的集成与应用

Anzexi58

ERP接口 API 文档

业界首份 GitLab DevSecOps 线上成熟度评估邀您来测

极狐GitLab

Java HashMap 和 HashSet 的高效使用技巧

小万哥

Java 程序人生 编程语言 软件工程 后端开发

【教程】oc代码混淆_OC代码混淆工具

从keys命令出发-浅谈redis的字典和字典迭代器

京东科技开发者

低代码与前端框架:现代软件开发的新黄金搭档

快乐非自愿限量之名

软件开发 低代码 前端框架

四种领导风格的大白话理解

芃篙君

管理

Easysearch 内核完善之 OOM 内存溢出优化案例一则

极限实验室

elasticsearch OOM 内存 easysearch

Mysql join加多条件与where的区别

百度搜索:蓝易云

MySQL 云计算 Linux 运维 云服务器

如何修复MySQL中损坏的表

百度搜索:蓝易云

MySQL 云计算 Linux 运维 云服务器

LLVM编译报错解决:collect2: fatal error: ld terminated with signal 9 [Killed]

百度搜索:蓝易云

云计算 Linux 运维 云服务器 ECS

人工智能的本质是编程+数学吗?

算法的秘密

两会热议高质量发展 华大北斗用芯领航

江湖老铁

JetBrains RubyMine 2023 for mac v2023.3.5中文激活版

iMac小白

10个AI人工智能PPT生成软件,轻松搞定PPT制作!

彭宏豪95

人工智能 在线白板 AIGC 效率软件 AI生成PPT

100M 768 维向量数据,Zilliz Cloud 稳定支持 Shulex VOC 业务场景

Zilliz

AI Zilliz 向量数据库 zillizcloud

re:Invent 产品体验与感受分享:Amazon ElastiCache Serverless 缓存的即时扩展

亚马逊云科技 (Amazon Web Services)

Serverless

Libcomm通信库:GaussDB(DWS) 为解决建联过多的小妙招

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 华为云GaussDB(DWS)

跨端轻量JavaScript引擎的实现与探索

京东科技开发者

印度股票盘开发

GangguHK

你知道h.265吧?但关于AV1编码格式你也来了解一下吗?

Geek_ee6d52

如何有效地报告Bug?_语言 & 开发_崔康_InfoQ精选文章