程序员修炼之道 07:调试

不记录,等于没读。

这里是我阅读《程序员修炼之道》这本书的记录。


软件缺陷以各种方式表现出来,从对需求的误解到编码错误。现在的计算机系统仍有局限性,能干你让它干的事情,但不一定能干你想让它干的事情。本章介绍调试中涉及的问题,以及一些通用策略。

调试心理学

接受这样一个事实:调试只是在解决问题,并为此全力以赴。不要费时费力地把责任推到罪魁祸首身上,在技术领域,我们把精力集中在解决问题上,而不是归咎于他人

去解决问题,而不是责备

调试心态

调试的首要法则是不要恐慌。开始调试之前,正确的心态非常重要。要冷静,不要受到最后期限、上级的关注等影响,仔细的观察,认真的思考。

如果你看到 BUG 的第一反应是“这不可能”,那你就大错特错了。因为很明显它会发生,而且已经发生了。此时,你必须重新评估你一直笃信的真理:你有什么东西不知道,或者理解错了。

要注意不要浮于表面,永远去发掘问题的根本原因。

从哪里开始

当你试图解决任何问题时,需要收集所有相关的数据。首先需要观察上更准确。

调试策略

手动修改 BUG 前,首先要能重现 BUG。如果你不能重现它,就不能确定究竟是否修复了 BUG。

首先,看一眼问题。很多开发者一看见红色的异常弹出框,就立马切去看代码,不要这样。在此之前,读一下出错信息

把纸笔放在旁边会很有帮助,这样可以随时做笔记。特别是无意中发现一个线索,一番验证后发现不是这个问题时,如果之前没有记下从哪里开始的,可能会在找回源头上浪费很多时间。

使用 二分法 缩小问题的范围。比如一开始要是能确定是软件问题还是硬件问题,那么问题的可能性就能排除一半。

利用调试器观察程序当前的状态。

在程序设计的最开始,就考虑程序的 显见性 。优先编写能监视和显示内部状态的代码,用这些代码来充当我们的耳朵和眼睛,帮助我们回答那里有什么?发生了什么?

比如输出日志或跟踪信息。当时间本身就是一个影响因子时,比如并发进程、实时系统和基于事件的应用程序,跟踪都是不可或缺的。跟踪消息应该采用规范一致的格式,因为有可能需要自动对其解析。

排除法:如果你只改变了一个东西,然后系统就不工作了,那么这个东西就最可能直接或间接的负有责任,不管看起来多么牵强。

如果你面对一个“让人吃惊”的错误时,必须接受之前的一个或多个假设是错误的。同时要牢记:不要假设,要证明


在《程序员修炼之道 06:基础工具》这篇文章中,我提到过自2018年开始,我会在一个专门的笔记本上记录我遇到的 BUG,包括 BUG 的现象、调试的过程,问题的根源,从中得到的教训,如何避免等。到现在为止,已经记录了两大本的素材,因此我自己也有一些调试心得,总的来说,调试有 4 个步骤,分别是:

  1. 重现 BUG
  2. 观察现象
  3. 提出假设
  4. 验证假设

任何的 BUG ,都可以通过这些步骤来解决!它就像一个巨大的推土机。虽然可能行动缓慢、工作起来枯燥乏味,但一路上无论遇到什么障碍,它都能铲平。关于这 4 个步骤的具体内容可以参考我的博文《随想005:调试的思考》,这里不再赘述。






每一份打赏,都是对创作者劳动的肯定与回报。
千金难买知识,但可以买好多奶粉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/682265.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于STC12C5A60S2系列1T 8051单片机实现串口调试助手软件与单片机相互发送数据的RS485通信功能

基于STC12C5A60S2系列1T 8051单片机实现串口调试助手软件与单片机相互发送数据的RS485通信功能 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机串口通信介绍STC12C5A60S2系列1T 8051单片机串口通信的结构基于STC12C5A60S2系列1T 8051单片机串口通信的特殊功…

编译原理总结

编译器构成 1. 前端分析部分 1.1 词法分析 确定词性,输出为token序列 1.2 语法分析 识别短语 1.3 语义分析 分析短语在句子中的成分 IR中间代码生成 2. 机器无关代码优化 3. 后端综合部分 目标代码生成 机器相关代码优化 4. 其他 全局信息表 异常输出

SOCKS 代理 和 HTTP 代理, WebSocket

SOCKS 代理 和 HTTP 代理 的区别 SOCKS 代理 和 HTTP 代理 都是代理服务器,它们充当客户端和目标服务器之间的中介,但它们的工作方式和应用场景有所不同。 1. SOCKS 代理: 工作原理: SOCKS 代理是一种更底层的代理,…

列存在 OceanBase 数据库架构中的应用与演进

OceanBase 4.3 版本上线了列存功能,以满足实时分析的需求。 本文作为《特性解读:列存技术》的后续,将详细阐述列存技术在OceanBase数据库架构中的应用、发展历程,以及未来的趋势。 一、前言 1970 年,关系模型之父 Co…

Java物业管理系统+数据库应用程序开发[JavaSE+JDBC+idea控制台+MySQL]

背景: 使用JavaSEJDBCMySQL技术实现一个物业管理系统,具体要求如下 物业管理系统需求: 需求分析 1.1用户需求分析 在进入系统之前,要进行身份确认,只有用户名和用户密码都相符的用户方可进入本系统,为…

PCL 抛物线回归拟合(Quadratic,二维)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 这里仍然是最小二乘法的应用,其推导过程如下所述: 1.二次函数模型: 其中,a、b 和 c 是需要确定的参数。 2.最小二乘法 假设我们有一组数据点 ( x 1 ​ , y

负压实验室设计建设方案

随着全球公共卫生事件的频发,负压实验室的设计和建设在医疗机构中的重要性日益凸显。负压实验室,特别是负压隔离病房,主要用于控制传染性疾病的扩散,保护医护人员和周围环境的安全。广州实验室装修公司中壹联凭借丰富的实验室装修…

k8s 对外服务之 Ingress(七层代理)

一 Ingress 简介 理论方面 1, k8s service 作用 对集群内部: 它不断跟踪pod的变化,更新endpoint中对应pod的对象,提供了ip不断变化的pod的服务发现机制 对集群外部: 对集群外部,他类似负载均衡器&am…

剪画小程序:AI声音克隆,只需10秒完美复制真人音色

Hello,大家好呀!我是分享声音的克隆。 想象一下,如果你能够复制自己的声音,那么您可以给视频配上自己的声 音,那是多么的有趣啊。 ​编辑 工具:小程序剪画 功能简介:支持多种端口&#xff1…

Vuforia AR篇(七)— 二维码识别

目录 前言一、什么是Barcode ?二、使用步骤三、点击二维码显示信息四、效果 前言 在数字化时代,条形码和二维码已成为连接现实世界与数字信息的重要桥梁。Vuforia作为领先的AR开发平台,提供了Barcode Scanner功能,使得在Unity中实…

【Web API DOM10】日期(时间)对象

一:实例化 1 获取系统当前时间即创建日期对象 const date new Date() console.log(date) 2024年6月5日周三 2 获取指定的时间 以获取2025年6月29日为例 const date new Date(2025-6-29) console.log(date) 二:日期对象方法 1 使用场景&#xf…

QT安装与使用

QT安装与使用 Windows QT安装 1.下载windowsQT安装包 本教程使用的QT版本是:https://download.qt.io/archive/qt/5.12/5.12.9/ 本教程的安装包放在阿里云盘供大家获取。 2.QT安装 如果没有梯子,大家登录QT官网可能会失败,这里可以不需要Q…

Qt 的 d_ptr (d-pointer) 和 q_ptr (q-pointer)解析;Q_D和Q_Q指针

篇一: Qt之q指针(Q_Q)d指针(Q_D)源码剖析---源码面前了无秘密_qtq指针-CSDN博客 通常情况下,与一个类密切相关的数据会被作为数据成员直接定义在该类中。然而,在某些场合下,我们会…

文件编码概念

文件的读取 open()函数: 打开一个已存在的文件,或者创建一个新文件 open(name,mode,encoding) name:是要打开的目标文件名的字符串(可以包含文件所在的具体路径) mode:设置打开文件的模式(访问模式)&am…

关于信号翻转模块(sig_flag_mod)的实现

关于信号翻转模块(sig_flag_mod)的实现 语言 :Verilg HDL 、VHDL EDA工具:ISE、Vivado、Quartus II 关于信号翻转模块(sig_flag_mod)的实现一、引言二、实现信号翻转模块的方法(1)输入接口(2)输出接口&…

MySQL换路径(文件夹)

#MySQL作为免费数据库很受欢迎,即使公司没有使用,自己也可以用。它是一个服务,在点击CtrlAltDelete选择任务管理器后,它在服务那个归类里。 经常整理计算机磁盘分类的小伙伴,如果你们安装了MySQL,并且想移…

【相关概念】经济金融中的Momentum

张张张三丰de思考与总结: 最近做的期货价格泡沫中,一直在说,momentum,momentum,momentum,那么究竟什么是momentum呢? 目前,在有关期货价格泡沫的研究文献中,一般都是研究…

小熊家务帮day13-day14 门户管理(ES搜索,Canal+MQ同步,索引同步)

目录 1 服务搜索1.1 需求分析1.2 技术方案1.2.1 使用Elasticsearch进行全文检索(为什么数据没有那么多还要用ES?)1.2.2 索引同步方案1.2.2.1 Canal介绍1.2.2.1 Canal工作原理 1 服务搜索 1.1 需求分析 服务搜索的入口有两处: 在…

【iOS】UI学习——UITableView

UI学习(四) UITableView基础UITableView协议UITableView高级协议和单元格 UITableView基础 dateSource:数据代理对象 delegate:普通代理对象 numberOfSectionInTableView:获得组数协议 numberOfRowsInSection:获得行数协议 cellForRowAtIndexPath:创建单…

自然语言处理(NLP)—— C-value方法

自然语言处理(NLP)和文本挖掘是计算机科学与语言学的交叉领域,旨在通过计算机程序来理解、解析和生成人类语言,以及从大量文本数据中提取有用的信息和知识。这些技术在现代数据驱动的世界中扮演着关键角色,帮助我们从海…