提高调试能力的一些方法
创始人
2024-03-02 12:17:16
0

你们好!我一直在编写一本关于调试的杂志(这是 目录的初稿)。

作为其中的一部分,我认为阅读一些关于调试的学术论文可能会很有趣,上周 Greg Wilson 给我发了一些关于调试学术研究的论文。

其中一篇论文(《建立一个调试教学的框架[付费墙]》)对我们有效调试所需的不同种类的知识/技能进行了分类,我非常喜欢。它来自另一篇关于故障排除的更一般性的论文:《学会排错:一个新的基于理论的设计架构》。

我认为这个分类对于思考如何更好地进行调试是一个非常有用的结构,所以我把论文中的五个类别重新规划为你可以采取的行动,以提高调试的效率。

以下是这些行动:

1、学习代码库

要调试一些代码,你需要了解你正在使用的代码库。

这似乎有点显而易见(当然,不了解代码的工作原理,你就无法调试代码!)

这种学习随着时间的推移会很自然地发生,而且实际上调试也是 学习 一个新的代码库如何工作的最好方法之一—— 看到一些代码是如何崩溃的,有助于你了解它是如何工作的。

该论文将此称为“系统知识”。

2、学习系统

论文中提到,你需要了解编程语言,但我认为不止于此 —— 为了修复 bug,往往你需要学习很多更广泛的环境,而不仅仅是语言。

举个例子,如果你是后端 Web 开发者,你可能需要的一些“系统”知识包括:

  • HTTP 缓存如何工作
  • CORS
  • 数据库事务是如何工作的

我发现我经常需要更有意识地去学习像这样的系统性的东西 —— 我需要真正花时间去查找和阅读它们。

该论文将此称为“领域知识”。

3、学习你的工具

现在有很多工具,例如:

  • 调试器(GDB 等)
  • 浏览器开发工具
  • 剖析器 profiler
  • strace / ltrace
  • tcpdump / wireshark
  • 核心转储
  • 甚至像错误信息这样的基本东西(如何正确阅读它们)

我在这个博客上写了很多关于调试工具的文章,并且肯定学习这些工具给我带来了巨大的变化。

该论文将此称为“处理性知识”。

4、学习策略

这是最模糊的一类,在如何高效调试的过程中,我们都有很多策略和启发式方法。比如说:

  • 写一个单元测试
  • 写一个小的独立程序来重现这个错误
  • 找到一个能工作的版本的代码,看看有什么变化
  • 打印出无数的东西
  • 增加额外的日志记录
  • 休息一下
  • 向朋友解释这个错误,然后在中途发现问题所在
  • 查看 GitHub 上的问题,看看是否有匹配的问题

在写这本杂志的时候,我一直在思考这个类别,但我想让这篇文章简短,所以我不会在这里多说。

该论文将此称为“战略知识”。

5、获得经验

最后一个类别是“经验”。这篇论文对此有一个非常有趣的评论:

他们的研究结果并没有显示出新手和专家所采用的策略有什么明显的区别。专家只是形成了更多正确的假设,并且在寻找故障方面更有效率。作者怀疑这个结果是由于新手和专家之间的编程经验不同造成的。

这真的引起了我的共鸣 —— 我遇到过很多第一次遇到时非常令人沮丧和困难的 bug,而在第五次、第十次或第二十次时就非常简单了。

对我来说,这也是最直接的知识类别之一 —— 你需要做的就是调查一百万个 bug,反正这就是我们作为程序员的全部生活 : ) 。这需要很长的时间,但我觉得它发生得很自然。

本文将此称为“经验知识”。

就这样吧!

我打算把这篇文章写得很短,我只是非常喜欢这个分类,想把它分享出来。


via: https://jvns.ca/blog/2022/08/30/a-way-to-categorize-debugging-skills/

作者:Julia Evans 选题:lkxed 译者:aftermath0703 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

相关内容

今天国际取得AI生成网页前...
金融界2025年6月18日消息,国家知识产权局信息显示,深圳市今天...
2025-06-18 10:43:16
python 基础系列篇:...
python 基础系列篇:三、认识函数、方法...
2025-06-01 09:29:50
从应用层到MCU,看Win...
文本编辑器/文本编辑框是应用层常见的键盘处理程序。微软泄露的Win...
2025-06-01 00:14:54
【UNIX 环境编程】GC...
💭 写在前面:本文将介绍如何使用 G...
2025-05-31 02:18:08
QT桌面客户端在Linux...
QT桌面客户端在Linux下的开发流程可以概括为以下几个主要步骤。...
2025-05-30 11:41:09
Jetson Orin平台...
前言 有个问题关于pcie vnet nvdia/drivers/...
2025-05-29 22:50:24

热门资讯

Helix:高级 Linux ... 说到 基于终端的文本编辑器,通常 Vim、Emacs 和 Nano 受到了关注。这并不意味着没有其他...
使用 KRAWL 扫描 Kub... 用 KRAWL 脚本来识别 Kubernetes Pod 和容器中的错误。当你使用 Kubernet...
JStock:Linux 上不... 如果你在股票市场做投资,那么你可能非常清楚投资组合管理计划有多重要。管理投资组合的目标是依据你能承受...
Epic 游戏商店现在可在 S... 现在可以在 Steam Deck 上运行 Epic 游戏商店了,几乎无懈可击! 但是,它是非官方的。...
《Apex 英雄》正式可在 S... 《Apex 英雄》现已通过 Steam Deck 验证,这使其成为支持 Linux 的顶级多人游戏之...
从 Yum 更新中排除特定/某... 作为系统更新的一部分,你也许需要在基于 Red Hat 系统中由于应用依赖排除一些软件包。如果是,如...
通过 SaltStack 管理... 我在搜索Puppet的替代品时,偶然间碰到了Salt。我喜欢puppet,但是我又爱上Salt了:)...
如何在 Github 上创建一... 学习如何复刻一个仓库,进行更改,并要求维护人员审查并合并它。你知道如何使用 git 了,你有一个 G...
Opera 浏览器内置的 VP... 昨天我们报道过 Opera 浏览器内置了 VPN 服务,用户打开它可以防止他们的在线活动被窥视。不过...
如何检查你的 Linux 系统... 不知道在使用哪个初始化系统?以下是方法。每个主流 Linux 发行版(包括 Ubuntu、Fedor...