程序调试的独孤九剑

2024-04-25 08:18
文章标签 独孤九剑 程序调试

本文主要是介绍程序调试的独孤九剑,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文是调试九法的读书笔记,方便解不出 Bug时参考。

一、调试九大规则

理解它们并贴在你的电脑旁边

  1. 理解系统
  2. 制造失败
  3. 不要想,而要看
  4. 分而治之
  5. 一次只改一个地方
  6. 保持审计跟踪
  7. 检查插头
  8. 获得全新观点
  9. 如果你不修复 bug ,它将依然存在

二、九大规则的具体解释

理解系统

简单来说,就是要熟悉业务。这条规则最重要。

更具体点,你必须知道系统的工作原理以及它是如何设计的,某些情况下,还要知道为什么这样设计。

你需要做到以下:

  • 阅读手册。阅读相关文档
  • 仔细阅读每个细节
  • 掌握基础知识
  • 了解工作流程。知道所有的模块和接口都是做什么
  • 了解工具。花时间学习与工具的一切,同时要了解工具的局限性
  • 查阅细节。不应盲目相信自己的记忆,养成良好的查阅习惯

制造失败

简单来说,就是复现 bug 。

试着让 bug 重现有一下3个原因:

  • 可以观察它
  • 可以专心查找原因。准确地知道在什么条件发生,有助于集中精力查找原因
  • 可以验证是否已修复问题

怎么制造失败(重现):
- 从头开始。试着从一个已知的状态出发
- 引发失败。尽量自动化
- 但不要模拟失败。要模拟导致失败的条件,而不是模拟识别机制本身
- 处理间歇性失败(偶现 bug )。改变能控制的条件,直到失败发生
- 记录每件事。让系统尽可能多的输出信息,并记录到日志
- 如果得到足够多的信息,需要确定哪些与 bug 有关
- 用好调试工具

不要想,而要看

凭空想象,问题可能有几千条原因,而实际的原因只有去看了才能发现。

  • 观察失败。仅靠猜测某个地方出了问题就修复它,不仅没修复问题还可能把真正问题隐藏起来,还误以为修复了问题
  • 查看细节。一直观察,直到把问题原因锁定在几种可能之内
  • 植入插装工具。其实就是用工具调试,并记录日志
  • 不要害怕深入研究
  • 注意海森堡效应。测试工具可能影响被测系统
  • 猜测只是为了确定搜索的重点。但不要过分依赖猜测以免被引入歧途

分而治之

其实就是排除法,逐步逼近,这是调试的核心

  • 确定问题范围
  • 逐步逼近缩小搜索范围
  • 从有问题的一边开始搜索。不要把精力花费在没问题的地方
  • 修复探索过程中的已知bug
  • 消除干扰因素

一次只改一个地方

不要乱改,为验证问题,一次只改一个地方

  • 隔离关键因素,别改出了其它问题
  • 一次只改一个测试
  • 与正常情况进行比较。这样才能发现问题所在
  • 确定自从上一次正常工作以来你改变了什么

保持审计跟踪

  • 记下你所做的事、做事的顺序,以及发生的结果,写下来
  • 任何细节都可能是重要的
  • 把时间关联到一起
  • 检查代码关联工具看是否是那一次修改引入了 bug
  • 把 bug 修复过程记录下来,形成自己的 bug 修复集

检查插头

一些显而易见的假设往往是错误的。

  • 质疑你的假设
  • 从问题开始观察
  • 对工具进行测试,工具本身也可能有 bug

获得全新观点

要想重新理清一个案子的头绪,最好的方法就是把它讲给别人听。 - 福尔摩斯

如果问题没有头绪,不妨休息下,听听别人的看法

  • 寻求帮助。人们通常很愿意帮忙,因为这给了他们一个证明自己很聪明的机会
  • 向别人解释问题会让你对问题有全新的认识。小黄鸭调试法
  • 咨询专家,获取专业知识
  • 借鉴别人的经验。如果有人出现过类似问题,不妨找他们了解下
  • 放下面子。bug 发生了,以除掉 bug 为自豪,而不要非得已自己除掉 bug 才为自豪
  • 寻求帮助时,报告问题发生现象,而不是自己的猜测,以免误导他人

如果你不修复 bug,它将依然存在

  • 验证问题确实已被修复。不要假设它已被修复,要测试它
  • 验证确实是你的修复措施解决了问题。而不是自己在修复过程中误操作
  • bug 从来不会自动消失。也许当时复现不了,当它终会出现
  • 从根本上解决问题
  • 对过程进行修复

三、当你的用户发现了 bug

实际上很多时候 bug 是通过用户发现的,他不一定了解这些专业知识

  • 不能全信用户的观点
  • 多依赖日志
  • 要让发生问题的用户告诉你他们做了什么
  • 不要假设用户如何使用你的产品。对所有的事情都要进行确认
  • 如果问题再次复现了,让用户联系你

这篇关于程序调试的独孤九剑的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/934149

相关文章

第五章 多重循环及程序调试 练习

1.使用双重循环输出九九乘法表 //九九乘法表public static void main(String[] args) {for (int i = 1;i <= 9;i++){for (int j = 1;j <= i;j++) {System.out.print(i + "*" + j + "=" + (i * j)+"\t");}System.out.println();}} 2.

MapReducer程序调试技巧(搭建伪分布式集群)

写过程序分布式代码的人都知道,分布式的程序是比较难以调试的,但是也不是不可以调试,对于Hadoop分布式集群来说,在其上面运行的是mapreduce程序,因此,有时候写好了mapreduce程序之后,执行结果发现跟自己想要的结果不一样,但是有没有报错,此时就很难发现问题,查找问题的方法之一就是对程序进行调试,跟踪代码的执行,找出问题的所在。那么对于Hadoop的Mapreduce是如何进行调试的

Linux上程序调试的基石(2)--GDB

3. GDB的实现  GDB是GNU发布的一个强大的程序调试工具,用以调试C/C++程序。可以使程序员在程序运行的时候观察程序在内存/寄存器中的使用情况。它的实现也是基于ptrace系统调用来完成的。  其原理是利用ptrace系统调用,在被调试程序和gdb之间建立跟踪关系。然后所有发送给被调试程序的信号(除SIGKILL)都会被gdb截 获,gdb根据截获的信号,查看被调试程序相应的内存地址,并

小程序调试技术详解(基于小猴小程序)

本篇文章主要围绕小猴小程序调试技术第三版进行展开。 在上一篇导读文章中提到,小猴小程序的调试部分从无到有一共经历了3个版本。本篇文章会详细描述面向开发者的调试功能是如何实现的。 文章将会描述以下部分: 调试实现的基本通信关系结构。如何实现完整的DOM审查能力。如何实现Console。如何实现Source以及断点调试。如何实现对网络记录的审查。如何实现基于页面的数据审查。 基本通信关系

小程序调试技术导读

近期团队内在自研小程序,我负责开发者工具中的调试部分。调试作为面向开发者的基础能力,扮演了极为重要的角色。 本篇文章是导读文章。 调试能力从0到1一共经历了4个版本,接下来的文章将会以这4个版本为主线分别进行介绍。 初始版 上图为调试还不存在时的一个通信关系图。 在彼时已经实现了逻辑代码与渲染代码的运行隔离,其中逻辑代码是运行在一个vm中的。 渲染层通过Electron提供的I

一个C++小程序调试过程记录

Top 20 C++ Projects With Source Code [2024 Update]https://www.interviewbit.com/blog/cpp-projects/ 这个网页有一些简单的C++程序的源码,闲来无事,把第一个程序(Bookshop Management System Using C++)的源码下载了下来。 源文件就只有一个.cpp文件,确实是简单,但

搭建Android系统C程序调试环境

在学习Android安全知识的过程需要在Android系统上验证一些C程序来验证安全漏洞或者学习操作系统知识,在这个过程有一个好的调试环境可以帮助我们更好的理解程序和Android系统的运行原理。本文描述了在Android系统上搭建调试环境的过程。 环境 ndk-build:编译软件。ubuntu 14.04:调试和编译平台。AOSP Prebuilt:AOSP仓库包含预编译好的工具链,用里面

Visual C++下的一些程序调试和开发技巧

自己平时收集的一些技巧与心得,这里分享出来,普及一下知识。        1.如何在Release状态下进行调试   Project->Setting=>ProjectSetting对话框,选择Release状态。C/C++标签中的Category选General,Optimizations选Disable(Debug),Debut info选Program Database。在Link标

Windows程序调试----第一部分 调试策略----第1章 调试的过程

第一部分调试策略 第1章调试的过程     虽然可能存在无数种错误,与此对应,潜在的也存在无数种调试策略,但是大多数的错误还是可以通过普通的调试过程来消除的。本章就来介绍这些过程。 1.1错误的调试五步曲     首先让我们来看一下一个不太有效的调试过程。像Elisabeth Kuble-Ross在她的书《On Death and Dying》中提到的悲哀五步曲那样,低效率调试过程的五步曲