代码报错 | 出bug-->该如何调试?

news2024/12/24 2:28:31

代码报错 | 出bug-->该如何调试?

  • 什么叫做bug
  • 调试是什么?有多重要?
  • Debug和Release的介绍
  • 调试
    • 常用的快捷键
    • 调试时查看程序当前的信息
  • 如何写出好(易于调试)的代码
    • 对const的通俗生活中举例
    • assert的理解
  • 编译常见的错误

在这里插入图片描述

什么叫做bug

世界上第一个bug
计算机刚出现时,是个庞然大物。突然有一天工作人员发现计算机无法正常工作了,结果是在晶体管上发现了一只昆虫的尸体
在这里插入图片描述

调试是什么?有多重要?

所有发生的事情都一定有迹可循,如果问心无愧,就不需要掩饰,也就没有迹象了,如果问心有愧,就必然需要掩饰,那就一定会有迹象,迹象越多就越容易顺藤摸瓜,这就是推理的途径。

一名优秀的程序员是一位出色的侦探。

每一次调试都是尝试破案的过程

我们是如何写代码的呢?
在这里插入图片描述
如何修改bug的呢?

迷信式修bug

在这里插入图片描述
调试
又称为除错,是发现和减少计算机程序或者电子仪器设备中程序错误的一个过程

步骤:

  • 发现程序错误的存在
  • 以隔离,消除等方式对错误进行定位
  • 确定错误产生的原因
  • 提出纠正错误的解决方法
  • 对程序错误给予改正,重新测试

Debug和Release的介绍

Debug:
通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序
Release:
称为发布版本(给用户使用),它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户可以很好的使用
在这里插入图片描述

调试

  • 把版本改为Debug

常用的快捷键

F5

启动调试,经常用来直接跳到下一个断点处

F9

创建和取消断点
断点的重要作用,可以在程序任何位置设置断点
这样就可以使程序在想要的位置随意停止执行,继而一步步的操作下去

F10

逐过程,通常用来处理一个过程,一个过程可以是一次函数的调用,或者是一条语句

F11

逐语句,就是每次执行一条语句,但是这个快捷键可以使我们的执行逻辑进入函数内部(这是最常用的)

CTRL+F5

开始执行不调试,如果你想让程序直接运行起来而不调试就可以直接使用

链接: 更多快捷键点这里

调试时查看程序当前的信息

  • 查看临时变量的值
    -----------------(监视用的最多)

在这里插入图片描述
可以查找出很多信息,比如堆栈,寄存器等

多多动手,尝试调试,才能有进步

  • 一定要熟练掌握调试技巧
  • 初学者80%的时间在写代码,20%的时间在调试,但是一个程序员可能20%的时间在写代码,80%的时间在调试
  • 博主所讲解的只是简单的调试技巧
    以后可能会出现复杂的调试场景,多线程程序的调试等等
  • 多多使用快捷键,提高效率

举一个经典例子

#include <stdio.h>
int main()
{
	int i = 0;
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	for (i = 0; i <= 12; i++)
	{
		arr[i] = 0;
		printf("死循环了\n");
	}
	return 0;
}

在这里插入图片描述

如何写出好(易于调试)的代码

优秀的代码

  • 代码运行正常
  • bug很少
  • 效率高
  • 可读性高
  • 可维护性高
  • 注释清晰
  • 文档齐全

常见的coding(编码)技巧:

  • 1.使用assert
  • 2.尽量使用const
  • 3.养成良好的编码风格
  • 4.添加必要的注释
  • 5.避免编码的陷阱

那const是个什么玩意儿呢?
被const修饰的变量称为常变量—>不能被修改(除了通过地址修改)
举例:

  • 直接修改
#include <stdio.h>
int main()
{
	const int i = 11;
	i = 20;
	printf("%d ", i);
	return 0;
}

直接报错

  • 通过地址修改
#include <stdio.h>
int main()
{
	const int i = 11;
	int* p = &i;
	*p = 20;
	printf("%d ", i);
	return 0;
}

那const修饰指针呢?
const放在*左边

  • 1
const int* p = &i;
  • 2
int const* p = &i;

含义: p指向的对象不能通过p来改变,但是p变量本身的值是可以改变的
举例:

#include <stdio.h>
int main()
{
	const int i = 11;
	int n = 100;
	const int* p = &i;
	
	*p = 20;  // err
	
	p = &n;  //ok
	
	printf("%d ", i);
	return 0;
}

const放在*右边

int* const p = &i;

含义: p指向的对象可以通过p来改变,但是不能修改p本身的值
举例:

#include <stdio.h>
int main()
{
	const int i = 11;
	int n = 100;
	int* const p = &i;
	
	*p = 0;  //ok
	
	p = &n;  // err
	
	printf("%d ", i);
	return 0;
}

*的左右都放上const,则铁定无法更改了

对const的通俗生活中举例

例子:

在这里插入图片描述m是女孩子的男朋友----------------------------------- n是另一位喜欢女孩子的蓝孩子
她男朋友只有10块钱了,但是 n却有100块钱
女孩想吃牛肉面(10块钱),男朋友如果买的话,兜兜里就比脸还干净了

  • 女孩子(const在*前面):男朋友不给买,就去找那一位蓝孩子,让他买
  • 女孩子(const在*后面):男朋友说,😤我给你买,但是你不能去找那一个蓝孩子
  • 如果两边都加上const,那就什么都吃不到咯

assert的理解

assert()的使用需要引用头文件

#include <assert.h>
int main()
{
	assert(a);
	return 0;
}

其中,当a=0,即NULL,则为假,就会直接导致程序报错。
他的使用可以帮助我们来避免一些用户输入问题或者其他数据输入输出问题

编译常见的错误

  • 编译型问题
    双击打开错误信息(语法错误),进行分析判断–>改正
  • 链接型问题
    查看错误信息,找到报错位置,分析其中标识符,一般是标识符名不存在或者拼写错误
    比如:未定义的函数被调用,函数名错误
  • 运行时错误
    可以运行,但并不是想要的结果
    方法:借助调试(难搞咯)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java程序员面试经验总结

目录 一、企业是如何筛选简历的1.简历筛选流程2.HR如何筛选简历3.部门负责人筛选简历4.总结-简历筛选规则 二、简历注意事项1.简历整体结构2.职业技能3.项目经历4.总结 三、应届毕业生改如何找到合适的练手项目1.项目来源2.如何深入学习项目3.应该学习哪些模块4.模块该如何吃透…

【owt】WebrtcNode, subscribe-sdp offer 流程(1)

sdp offer 流程 1. AmqpClient - New message received sdp offer 的消息 2023-04-26T21:54:19.790 - DEBUG: AmqpClient - RpcServer New message received {method: onTransportSignaling,args: [b149e44bb10d4e91bd162a8c6806ae7b,{sdp: v0\r\n o- 7177131362423164715 …

K8S常见应用场景(六)

Kubernetes 是一个可移植的、可扩展的开源平台&#xff0c;用于管理容器化的工作负载和服务&#xff0c;可促进声明式配置和自动化。 Kubernetes 拥有一个庞大且快速增长的生态系统。Kubernetes 的服务、支持和工具广泛可用。 Kubernetes 这个名字源于希腊语&#xff0c;意为“…

【Java系列】Mybatis-Plus 使用介绍二

序言 你只管努力&#xff0c;其他交给时间&#xff0c;时间会证明一切。 MyBatis-Plus 是 MyBatis 的增强工具&#xff0c;它简化了 MyBatis 的开发&#xff0c;并提供了许多实用的功能和工具类。下面是 MyBatis-Plus 的使用方法&#xff1a; 1 使用方法 1. 引入依赖 在 Maven…

MySQL数据库 9.DQL操作

目录 ​编辑 &#x1f914;前言&#xff1a; &#x1f914;DQL介绍&#xff1a; &#x1f914;查询种类&#xff1a; 1.基本查询&#xff1a; &#x1f50d;1.查询多个字段&#xff1a; &#x1f50d;2.查询所有字段&#xff1a; &#x1f50d;3.去除重复记录&#xff…

【数据结构】常见排序算法——常见排序介绍、插入排序、直接插入排序、希尔排序

文章目录 1.排序的概念和应用1.1排序的概念1.2排序的运用1.3常见的排序算法 2.常见的排序算法2.1插入排序2.1.1直接插入排序2.1.2希尔排序 1.排序的概念和应用 1.1排序的概念 在计算机科学中&#xff0c;排序是将一组数据按照指定的顺序排列的过程。排序算法由于执行效率的不同…

01_爬虫基础知识和requests模块简介

爬虫基础知识 1、爬虫简介: 爬虫的作用:帮助我们把网站信息快速提取并保存爬虫的分类: 通用爬虫聚集爬虫爬虫的安全知识:目前来说,无明确法律规定,但每个官网都有自己的爬虫协议(网址后面加/robots.txt)爬虫的爬取流程: 1、获取网页2、提取信息3、保存数据2、爬虫必须…

分布式软件架构——远程服务调用

序言 “架构师”可以是做企业战略设计的架构师&#xff0c;也可以说做业务流程分析的架构师。 架构师视角特指软件系统中技术模型的系统设计者。 在做架构设计的时候&#xff0c;架构师应该思考哪些问题、可以选择哪些主流的解决方案和行业标准做法&#xff0c;以及这些主流方…

【自制C++深度学习框架】前言

KuiperCourse 介绍 此GitHub项目是一个初学者的深度学习框架&#xff0c;使用C编写&#xff0c;旨在为用户提供一种简单、易于理解的深度学习实现方式。以下是本项目的主要特点和功能&#xff1a; 计算图&#xff1a;使用计算图来描述深度学习模型的计算过程&#xff0c;利用计…

气球飘飘:用Java Swing创造令人心旷神怡的视觉奇观

✨博主&#xff1a;命运之光 ✨专栏&#xff1a;Java经典程序设计 前言&#xff1a;这篇博客在手机上打开可能会自动播放视频&#xff0c;视频有音乐&#xff0c;请及时关闭手机音乐哈&#x1f642; 目录 ✨导语 ✨引言 ✨简单介绍一下Javaswing这项技术简单介绍一下Javaswi…

简单的UDP网络程序·续写

该文承接文章 简单的UDP网络程序 对于客户端和服务端的基本源码参考上文&#xff0c;该文对服务器润色一下&#xff0c;并且实现几个基本的业务服务逻辑 目录 demo1 第一个功能&#xff1a;字典翻译 初始化字典 测试代码&#xff1a;打印 字符串分割 客户端修改 成品效果…

idea如何一个项目启动两个tomcat服务(不同端口)

目录 第一步&#xff1a;创建一个普通的springboot项目 第二步&#xff1a;编写一个controller代码&#xff0c;用来接收请求 第三步&#xff1a;复制服务&#xff0c;端口设置为8081 第四步&#xff1a;依次访问8080、8081两个服务进行测试 第一步&#xff1a;创建一个普通…

基于JavaWeb的保护动物管理系统设计与实现

摘要&#xff1a;随着全球一些稀有物种、野生动物日益稀少&#xff0c;保护动物已经成为全球多个国家开始重视并投入大量物力着手解决的重要课题。动物是大自然的产物&#xff0c;自然界是由许多复杂的生态系统构成的。有一种植物消失了&#xff0c;以这种植物为食的昆虫就会消…

easyExcel导入失败提示用户第几行有误并回滚数据

思路&#xff1a; 在controller定义一个map&#xff0c;将map传入excel监听器&#xff0c;在监听器中处理excel的数据&#xff0c;读取到某一行出现错误就将错误提示信息存入map并抛出一个异常给service。在service方法上开启事务&#xff0c;并将异常出实现数据回滚&#xff0…

vite使用vue3 v-for渲染图片时的写法

写法一 <template><divclass"demo-img"v-for"item in demoOption":key"item.code":style"background-image: url(${getImageUrl(../assets/imge/${item.img}.jpeg)})"></div> </template><script lang&qu…

2023网安最流行的10大工具(附安装包)

从事网络安全工作&#xff0c;手上自然离不开一些重要的网络安全工具。今天&#xff0c;分享10大网络安全工具。 一、Kali Linux Kali 是一个基于 Debian 的 Linux 发行版。它的目标就是为了简单&#xff1a;在一个实用的工具包里尽可能多的包含渗透和审计工具。Kali 实现了这…

Linux 之Python 定制篇-APT 软件管理和远程登录

Linux 之Python 定制篇-APT 软件管理和远程登录 apt 介绍 apt 是Advanced Packaging Tool 的简称&#xff0c;是一款安装包管理工具。在Ubuntu 下&#xff0c;我们可以使用apt 命令进行软件包的安装、删除、清理等&#xff0c;类似于Windows 中的软件管理工具。 unbuntu 软件…

【C++】深拷贝浅拷贝

前言&#xff1a;在 C 中&#xff0c;当一个对象通过赋值或拷贝即将成为另一个对象的副本时&#xff0c;会发生“浅拷贝”或“深拷贝”。 什么是浅拷贝&#xff1f; 浅拷贝是指两个对象共享同一个内存地址&#xff0c;即将源对象的数据成员的地址赋给了目标对象&#xff0c;当…

vue diff算法与虚拟dom知识整理(15) 终结篇,收尾新前到旧前全部不匹配情况

我们现在就只需要处理最后一种情况了 我们在 updateChildren.js 在while中 的if最后加个 else 当他们都没哟匹配到的情况 我们现在在updateChildren.js最上面 定义一个空对象 叫 keyMap 参考代码如下 let keyMap null;然后 在我们刚写的else中编写代码如下 //判断 如果…

Stable-Diffusion|入门怎么下载与使用civitai网站的模型(二)

C站&#xff1a;https://civitai.com/ 文章目录 1 样图2 实现2.1 下载主模型并放到正确文件夹中2.2 找到prompt2.3 生成2.4 Lora使用 3 一些有趣的项目3.1 胶片风格Lora3.2 [最近很火] 现实感很强的Majicmix-realistic 先贴几张笔者自己实验的图&#xff0c;模型来自&#xff1…