建设项目咨询公司网站/免费入驻的卖货平台
🦄个人主页:小米里的大麦-CSDN博客
🎏所属专栏:https://blog.csdn.net/huangcancan666/category_12718530.html
⚙️操作环境:Visual Studio 2022
目录
一、前言
二、什么是BUG?
三、调试是什么?有多重要?
一名优秀的程序员是一名出色的侦探。
我们是如何写代码的?
又是如何排查出现的问题的呢?
1. 调试是什么?
2. 调试的基本步骤
3. Debug和Release的介绍。
四、Windows环境调试介绍
1. 调试环境的准备
2. 学会快捷键
五、调试的时候查看程序当前信息
1. 查看临时变量的值
2. 查看内存信息
3. 查看调用堆栈
4. 查看汇编信息
5. 查看寄存器信息
六、多多动手,尝试调试,才能有进步
七、一些调试的实例
1. 实例
why?
八、如何写出好(易于调试)的代码
1. 优秀的代码:
2. 常见的coding技巧
3. const的作用
4. 结论
const修饰指针变量的时候:
九、编程常见的错误
1. 编译型错误
2. 链接型错误
3.运行时错误
4. 温馨提示
十、总结
1. 提高代码质量
2. 加速开发进程
3. 增强代码可读性和可维护性
4. 促进团队协作
5. 个人技能提升
十一、共勉
一、前言
本章讲解:
- 什么是bug?
- 调试是什么?有多重要?
- debug和release的介绍。
- windows环境调试介绍。
- 一些调试的实例。
- 如何写出好(易于调试)的代码。
- 编程常见的错误。
二、什么是BUG?
第一次被发现的导致计算机错误的飞蛾,也是第一个计算机程序错误。
三、调试是什么?有多重要?
所有发生的事情都一定有迹可循,如果问心无愧,就不需要掩盖,也就没有迹象了,如果问心有愧,就必然需要掩盖,那就一定会有迹象,迹象越多就越容易顺藤而上,这就是推理的途径。
顺着这条途径顺流而下就是犯罪,逆流而上,就是真相。
-
一名优秀的程序员是一名出色的侦探。
每一次调试都是尝试破案的过程。
-
我们是如何写代码的?
-
又是如何排查出现的问题的呢?
拒绝-迷信式调试!!!!
1. 调试是什么?
调试 (英语:Debugging /Debug),又称除错,是发现和减少计算机程序或电子仪器设备中程序错误的一个过程。
2. 调试的基本步骤
- 发现程序错误的存在
- 以隔离、消除等方式对错误进行定位
- 确定错误产生的原因
- 提出纠正错误的解决办法
- 对程序错误予以改正,重新测试
3. Debug和Release的介绍。
- Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。
- Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。
所以我们说调试就是在Debug版本的环境中,找代码中潜伏的问题的一个过程。
四、Windows环境调试介绍
1. 调试环境的准备
在环境中选择 debug 选项,才能使代码正常调试。
2. 学会快捷键
最常使用的几个快捷键:
F5
- 启动调试,经常用来直接跳到下一个断点处。
F9
- 创建断点和取消断点
- 断点的重要作用,可以在程序的任意位置设置断点。
- 这样就可以使得程序在想要的位置随意停止执行,继而一步步执行下去。
F10
- 逐过程,通常用来处理一个过程,一个过程可以是一次函数调用,或者是一条语句。
F11
- 逐语句,就是每次都执行一条语句,但是这个快捷键可以使我们的执行逻辑进入函数内部(这是最常用的)。
CTRL + F5
- 开始执行不调试,如果你想让程序直接运行起来而不调试就可以直接使用。
更多快捷键:VS中常用的快捷键_vs快捷键-CSDN博客
五、调试的时候查看程序当前信息
1. 查看临时变量的值
在调试开始之后,用于观察变量的值。监视和内存各有四个窗口,任意一个即可,观察的时候需要手动输入需要观察的函数 / 变量 / 地址等。
2. 查看内存信息
3. 查看调用堆栈
通过调用堆栈,可以清晰的反应函数的调用关系以及当前调用所处位置。调用堆栈面板鼠标右键可以进行观察设置!!!
4. 查看汇编信息
在调试开始之后,有两种方式转到汇编:
- 第一种方式:右击鼠标,选择【转到反汇编】
- 第二种方式:调试 -> 窗口 -> 反汇编
可以切换到汇编代码,这就比较偏底层,简单待过。
5. 查看寄存器信息
可以查看当前运行环境的寄存器的使用信息。这就更偏物理硬件底层了。
六、多多动手,尝试调试,才能有进步
- 一定要熟练掌握调试技巧。
- 初学者可能80%的时间在写代码,20%的时间在调试。但是一个程序员可能20%的时间在写
- 程序,但是80%的时间在调试。
- 我们所讲的都是一些简单的调试。
- 以后可能会出现很复杂调试场景:多线程程序的调试等。
- 多多使用快捷键,提升效率。
七、一些调试的实例
1. 实例
实现代码:求 1!+2!+3! ...+ n! ;不考虑溢出。
int main()
{int i = 0;int sum = 0;//保存最终结果int n = 0;int ret = 1;//保存n的阶乘scanf("%d", &n);for(i=1; i<=n; i++){int j = 0;for(j=1; j<=i; j++){ret *= j;}sum += ret;}printf("%d\n", sum);return 0;
}
这时候我们如果3,期待输出9,但实际输出的是15。
why?
这里我们就得找我们问题。
- 首先推测问题出现的原因。初步确定问题可能的原因最好。
- 实际上手调试很有必要。
- 调试的时候我们心里有数。
八、如何写出好(易于调试)的代码
1. 优秀的代码:
- 代码运行正常
- bug很少
- 效率高
- 可读性高
- 可维护性高
- 注释清晰
- 文档齐全
2. 常见的coding技巧
- 使用assert(【C语言】assert(断言)使用详解-CSDN博客)
- 尽量使用const
- 养成良好的编码风格
- 添加必要的注释
- 避免编码的陷阱。
3. const的作用
#include <stdio.h>
//代码1
void test1()
{int n = 10;int m = 20;int *p = &n;*p = 20;//ok?p = &m; //ok?
}
void test2()
{//代码2int n = 10;int m = 20;const int* p = &n;*p = 20;//ok?p = &m; //ok?
}
void test3()
{int n = 10;int m = 20;int *const p = &n;*p = 20; //ok?p = &m; //ok?
}
int main()
{//测试无cosnt的test1();//测试const放在*的左边test2();//测试const放在*的右边test3();return 0;
}
4. 结论
const修饰指针变量的时候:
- const如果放在*的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变。但是指针变量本身的内容可变。
- const如果放在*的右边,修饰的是指针变量本身,保证了指针变量的内容不能修改,但是指针指向的内容,可以通过指针改变。
九、编程常见的错误
1. 编译型错误
直接看错误提示信息(双击一般可跳转错误代码附近),解决问题。或者凭借经验就可以搞定。相对来说简单。
2. 链接型错误
看错误提示信息,主要在代码中找到错误信息中的标识符,然后定位问题所在。一般是标识符名不存在、拼写错误、头文件没包含、引用的库不存在。
3.运行时错误
借助调试,逐步定位问题(最难搞)。运行时错误,是千变万化的,需要借助调试,逐步定位问题,调试解决的是运行时问题。通常因为逻辑原因或者数据调用不合理造成。
4. 温馨提示
做一个有心人,积累排错经验。
十、总结
学会调试对于程序员来说至关重要,它不仅能够帮助程序员找出并修复程序中的错误,还能提升代码的质量和可维护性。下面是一些关于学会调试的重要性的总结:
1. 提高代码质量
- 及时发现错误:通过有效的调试技术,可以在开发早期阶段就发现并修正错误,避免问题积累导致更大的麻烦。
- 减少bug数量:熟练掌握调试技巧可以更快速地定位问题所在,减少遗留的bug数量。
2. 加速开发进程
- 缩短修复时间:高效的调试可以显著减少在查找和解决问题上所花费的时间,从而加快项目的整体进度。
- 避免重复工作:如果能够有效地调试和理解代码行为,就可以避免因同样的问题反复出现而不得不进行重复修改的情况。
3. 增强代码可读性和可维护性
- 清晰的逻辑结构:良好的调试习惯有助于保持代码的逻辑清晰,便于他人阅读和理解。
- 文档和注释:在调试过程中添加必要的文档和注释可以帮助其他开发者更快地理解代码的功能和目的。
4. 促进团队协作
- 共享知识:调试过程中可能会发现一些设计上的不足或潜在的问题,这些信息可以通过团队分享,共同改进。
- 一致的编码标准:通过调试,团队成员可以学习到如何遵循一致的编码标准和最佳实践,这有利于整个项目的统一性和稳定性。
5. 个人技能提升
- 增强问题解决能力:调试是一个不断分析、推理的过程,这种经历会逐渐提高程序员解决问题的能力。
- 深入理解系统:通过调试,开发者可以更深入地了解系统的内部机制,这对于未来的开发工作是非常有益的。
总之,学会调试是成为一名优秀程序员不可或缺的一部分。它不仅对项目本身有直接的好处,也对个人职业发展有着深远的影响。
十一、共勉
相关文章:

【vs】实用调试技巧——学会写优秀的代码!
🦄个人主页:小米里的大麦-CSDN博客 🎏所属专栏:https://blog.csdn.net/huangcancan666/category_12718530.html ⚙️操作环境:Visual Studio 2022 目录 一、前言 二、什么是BUG? 三、调试是什么?有多重要? 一名优秀…...

数组声明方式
数组声明方式 一、 一维数组 元素数据类型[] 数组名; // 推荐元素数据类型 数组名[]; 二、 二维数组 元素数据类型[][] 数组名称; // 推荐元素数据类型 数组名称[][];元素数据类型[] 数组名称[]; 注: 对于第三种方式元素数据类型[] 数组名称[];,可…...

Docker中Docker网络-理解Docker0与自定义网络的使用示例
场景 CentOS7中Docker的安装与配置: CentOS7中Docker的安装与配置_centos docker sock-CSDN博客 在上面安装好Docker之后。 关于对Docker中默认docker0以及自定义网络的使用进行学习。 注: 博客:霸道流氓气质-CSDN博客 实现 理解dock…...

领域驱动大型结构之SYSTEM METAPHOR(系统隐喻)
在领域驱动设计(Domain-Driven Design, DDD)中,"System Metaphor" 是一种用于帮助开发团队和业务人员在理解和沟通系统时使用的概念模型。虽然 "System Metaphor" 并不是 DDD 的核心概念,但它在敏捷开发方法&…...

web前端开发一、VScode环境搭建
1、VScode安装live server插件,写完代码后,保存就会在浏览器自动更新,不需要再去浏览器点击刷新了 2、创建html文件 3、在文件中输入感叹号 ! 4、选择第一个,然后回车,就会自动输入html的标准程序 5、…...

DiAD代码use_checkpoint
目录 1、梯度检查点理解2、 torch.utils.checkpoint.checkpoint函数 1、梯度检查点理解 梯度检查点(Gradient Checkpointing)是一种深度学习优化技术,它的目的是减少在神经网络训练过程中的内存占用。在训练深度学习模型时,我们需…...

nginx出现Refused to apply inline style because it violates
Content Security Policy的错误。根据错误提示,nginx拒绝应用内联样式,因为它违反了内容安全策略(Content Security Policy)。内容安全策略是一种浏览器机制,用于防止潜在的安全漏洞,通过限制从外部来源加载…...

【中项第三版】系统集成项目管理工程师 | 第 11 章 规划过程组⑥ | 11.15 - 11.17
前言 第11章对应的内容选择题和案例分析都会进行考查,这一章节属于10大管理的内容,学习要以教材为准。本章上午题分值预计在15分。 目录 11.15 规划资源管理 11.15.1 主要输入 11.15.2 主要工具与技术 11.15.3 主要输出 11.16 估算活动资源 11.1…...

基础警务互联网app
智慧公安以大数据、云计算、人工智能、物联网和移动互联网技术为支撑,以“打、防、管、控”为目的,综合研判为核心,共享信息数据资源,融合业务功能,构建公安智慧大数据平台,实现公安信息数字化、网络化和智…...

为了方便写CURD代码,我在UTools写了个插件SqlConvert来生成代码!
-1. 前言 为了方便摸鱼,我之前写过一个通过sql生成代码的工具,但是服务器到期了,也就懒得重新部署了。 技术框架是 SpringBoot MybatisPlus Velocity Vue ElementUI Sql-ParseeSql-Parser-ui 0. Utools应用安装 官网地址: https://u.too…...

在国产芯片上实现YOLOv5/v8图像AI识别-【2.2】RK3588上C++开发环境准备及测试更多内容见视频
本专栏主要是提供一种国产化图像识别的解决方案,专栏中实现了YOLOv5/v8在国产化芯片上的使用部署,并可以实现网页端实时查看。根据自己的具体需求可以直接产品化部署使用。 B站配套视频:https://www.bilibili.com/video/BV1or421T74f 板子…...

2024数据资产入表财务实操手册
关注公众号《方案驿站》,并私信:2024数据资产入表财务实操手册,可获取本文pdf文件。...

react.16+
1、函数式组件 在vite脚手架中执行: app.jsx: import { useState } from react import reactLogo from ./assets/react.svg import viteLogo from /vite.svg import ./App.cssfunction App() {console.log(this)return <h2>我是函数式组件</h2> }exp…...

如何实现MySQL对某一张表的binlog日志进行记录
在 MySQL 中,使用触发器(Triggers)来记录表的变更是一种常见的方法。下面是具体的配置和步骤: 1. 创建日志表 首先,需要创建一个日志表,用于存储变更记录。 CREATE TABLE my_table_log (id INT AUTO_INC…...

使用requests库进行网络爬虫:入门指南
在数据收集与分析的广阔领域中,网络爬虫是一项基础而强大的技能。requests库是Python中用于发送HTTP请求的第三方库,它简洁易用,非常适合初学者学习网络爬虫。本文将带你一步步了解如何使用requests库进行基本的网络爬虫操作。 一、安装requ…...

实验5-1 使用函数计算两点间的距离
本题要求实现一个函数,对给定平面任意两点坐标(x1,y1)和(x2,y2),求这两点之间的距离。 函数接口定义: double dist( double x1, double y1, double x2, double y2 );其中用户传入的参数为平面上两个点的坐标(x1, y1)和(x2, y2),函…...

免费!OpenAI发布最新模型GPT-4o mini,取代GPT-3.5,GPT-3.5退出历史舞台?
有个小伙伴问我,GPT-4O mini是什么,当时我还一脸懵逼,便做了一波猜测: 我猜测哈,这个可能是ChatGPT4o的前提下,只支持文本功能的版本,速度更快 结果,大错特错。 让我们一起看看Open…...

目标检测损失计算部分(YOLO)
ComputeLoss 标准化坐标的增益张量 标准化坐标的增益张量(gain tensor)用于将归一化的目标转换为特定特征层的网格尺度,以便进行匹配和计算。 在目标检测模型中,输入图像被划分为多个网格,每个网格负责预测多个锚框…...

Swift 方法
Swift 方法 Swift 是一种强大的编程语言,用于开发 iOS 和 macOS 应用程序。在 Swift 中,方法是一段代码,它定义了执行特定任务的步骤。方法可以提高代码的可重用性和可维护性。本文将介绍 Swift 方法的基本概念、语法和用法。 1. 基本概念 1.1 方法定义 方法是一段代码,…...

哪些牌子充电宝性价比比较高?目前公认比较好用充电宝都在这儿!
在这个科技飞速发展的时代,充电宝已经成为我们生活中不可或缺的一部分。然而,在享受充电宝带来的便利时,我们不能忽视一个至关重要的问题——安全性。随着无线充电宝的普及,大家对于“无线充电宝哪个牌子更好?”的疑问…...

计算机网络必会面经
1.键入网址到网页显示,期间发生了什么 2.在TCP/IP网络模型中。TCP将数据进行分段后,为什么还需要IP层继续分片 3.详细说明tcp三次握手,为什么是三次,若每次握手丢了,解决办法是什么 4.详细说明tcp四次挥手ÿ…...

深入理解 Go 数组、切片、字符串
打个广告:欢迎关注我的微信公众号,在这里您将获取更全面、更新颖的文章! 原文链接:深入理解 Go 数组、切片、字符串 欢迎点赞关注 前言 为什么在一篇文章里同时介绍数组、切片、字符串,了解这三个数据类型底层数据结构…...

STM32下的HAL库U盘数据读写
最近在使用FreeRTOS操作U盘数据读取,与裸机开发区别不大,只要注意默认分配的栈大小就行 FATFS简介 FATFS 是一个完全免费开源的 FAT 文件系统模块,专门为小型的嵌入式系统而设计。它完全用标准 C 语言编写,所以具有良好的硬件平…...

JavaScript(20)——事件委托
事件委托是利用事件流的特征解决一些开发需求的知识技巧 优点:减少注册次数,提高程序性能 原理:利用事件冒泡的特点。 给父元素注册事件,当我们触发子元素的时候,会冒泡到父元素上,从而触发父元素事件。…...

Linux系统安装opencv
在Linux系统上安装OpenCV时,使用pip install opencv-python-headless是一个常见的选择。以下是安装OpenCV的步骤总结: 安装步骤: 更新系统软件包(可选): sudo apt update sudo apt upgrade安装pip…...

nginx反向代理+nginx黑白名单+nginx负载均衡+平滑升级+配置jdk环境-7.30
一、反向代理 1.前端服务器配置 前端服务器:用于接收和响应客户端,代理另一台主机 Nginx 安装 (1).下载安装nginx [rootweb ~]# wget https://nginx.org/download/nginx-1.26.1.tar.gz (2).解压 [rootweb ~ ]# tar -zxvf nginx-1.26.1.tar.gz (3…...

C# Unity 面向对象补全计划 之 访问修饰符
本文仅作学习笔记与交流,不作任何商业用途,作者能力有限,如有不足还请斧正 本系列旨在通过补全学习之后,给出任意类图都能实现并做到逻辑上严丝合缝...

JAVA多线程设计模式 (多线程程序的衡量标准)
前言 如果你对一个程序的评价方式还停留在“这个程序写得不错”、“这个程序写得太差”的程度,这样很难看出你是否确实分析了程序的构造。不要只是“好不好”应该要有一个“好在哪里,不好在哪里”的评量标准。 一、下载地址 下载地址:JAVA…...

消息队列使用
消息队列在分布式系统中扮演着非常重要的角色,其主要用途包括但不限于以下几点: 解耦: 消息队列可以减少应用程序之间的直接依赖,使系统各部分更加独立。例如,在一个电子商务网站中,订单系统可以将订单信息发送到消息队列中,而不必直接调用库存系统。库存系统可以从队列…...

Windows 10+Visual Studio2019 Opencv-C++安装配置
前往官网下载需要的版本Releases - OpenCVhttps://opencv.org/releases/ 1.下载并解压OpenCV 我选择4.6.0,点击windows版本,进行下载 2.配置项目属性 打开你的Visual Studio 2019项目 -> 右击项目名,选择“属性” 注:整个配…...