调试意义、步骤及方式

调试

文章目录

  • 调试
    • 1.什么是bug?
    • 2.调试是什么?有多重要?
      • 2.1调试
      • 2.2调试的基本步骤
      • 2.3Debug和Release的介绍
        • 2.3.1常用的快捷键及功能
          • 1.F5
          • 2.F9
          • 条件断点
          • 3.F10
          • 4.F11
          • 5.CTRL+F5
    • 3.调试的时候查看程序当前信息
      • 3.1查看临时变量的值
        • 3.1.1自动窗口
        • 3.1.2监视
          • 3.1.2.1数据结构怎么监视多个数据
        • 3.1.3内存的查看及解析
        • 3.1.4调用堆栈
    • 4.一个调试的案例
    • 5.如何写出好的代码(易于调试)
      • 5.1优秀的代码
        • 技巧1:assert
        • 技巧2:const
          • 1.const 放在*号左边
          • 2.const放在*号右边
        • 使用assert和const优化求字符长度的函数
    • 6.编程常见的错误
      • 6.1编译型错误(语法错误)
      • 6.2链接型错误(出现在链接期间)
      • 6.3运行时错误

1.什么是bug?

在这里插入图片描述

一只死在继电器上的飞蛾,被戏称为计算机史上的一个“bug”。

调试便是找bug的过程。

2.调试是什么?有多重要?

2.1调试

调试(Debugging/Debug),又称除错,是发现和减少计算机程序或电子仪器设备中程序错误的一个过程。

2.2调试的基本步骤

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

发现bug的可能是:1.程序员自己 2.测试人员3.客户

2.3Debug和Release的介绍

Debug通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序

Release称为发布版本,它往往是进行各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好的使用

使用Debug和Release分别进行运行后,文件夹中会产生对应的两个文件

在这里插入图片描述

使用Debug版本可以进行调试等操作,Release版本则没有调试信息

在这里插入图片描述

2.3.1常用的快捷键及功能
1.F5

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

2.F9

创建断点和取消断点

断点的重要作用,可以在程序的任意位置设置断点。

这样就可以使得程序在想要的位置随意停止执行,继而一步步执行下去。

在这里插入图片描述

选中需要停止的行后,使用快捷按键F9即可设置断点。在使用F5调试程序时将会在第11行停止调试。

多个断点位置,F5后将会在下一个逻辑断点处停下。

在这里插入图片描述

如图第一个断点的位置在第13行(一个循环体结构中),我们在该断点继续执行语句,那么逻辑的下一个断点将会是它的第二次循环而不是第15行的断点。

断点也可以通过鼠标直接单击断点位置进行添加和取消断点。

条件断点

鼠标右击断点可对断点进行条件设置,
图中我们对断点进行了条件设置,条件为当i==5时,该断点生效。如图:

在这里插入图片描述生效后如图:

在这里插入图片描述

i==5时生效,停止输出后面的语句。

3.F10

逐过程,就是每次都执行一条语句,一个过程可以是一次函数调用或一条语句。

F10与F11在普通的语句中没有什么区别,有区别的是函数上。

F10会把函数当作普通的语句直接跳过,而F11可以进入函数内部查看函数运行的过程

4.F11

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

5.CTRL+F5

开始执行不调试,如果你想让程序不调试直接运行

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

3.1查看临时变量的值

在调试开始之后,用于观察变量的值。

调试起来后,才可以查看下面的选项。

在这里插入图片描述

3.1.1自动窗口

自动串口可以自动获取变量的值。

不过,在调试的过程(比如进入函数内部),那么当前的变量会自动消失,被函数内部的变量取代。(过于自作主张)观察数据不方便。

在这里插入图片描述

简言之,就是会自动获取变量的监视窗口。

3.1.2监视

在调试开始之后,用于观察变量的值。

在这里插入图片描述

3.1.2.1数据结构怎么监视多个数据

数组结构在函数中正常的查看只能查看第一个数据。

我们可以使用(a,个数)来获取对应个数的数组元素。

在这里插入图片描述

a,10就是获取10个元素的。

3.1.3内存的查看及解析

调试后可通过窗口——>内存,查看内存

在这里插入图片描述

内存中的数据解析:

在这里插入图片描述

3.1.4调用堆栈

在调试的情况下,在调试窗口——>调用堆栈

可以查看函数的调用情况(谁被谁调用),

在这里插入图片描述

上面的函数被下面的函数调用:

行9被行13调用,而行13被行17调用……

在这里插入图片描述

数据结构中的栈;

4.一个调试的案例

对数组进行越界访问。

# define _CRT_SECURE_NO_WARNINGS 1
#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("haha\n");}return 0;
}

上面的代码运行后可能会出现循环。

原因:

下图所示,未定义的第12个数组元素默认的值为12,且与i的大小相同

在这里插入图片描述

接着运行程序对arr[12]进行修改,发现i也等于0:

在这里插入图片描述

原因就是:

在这里插入图片描述

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

5.1优秀的代码

  1. 代码正常运行
  2. bug很少
  3. 效率高
  4. 可读性高
  5. 可维护性高
  6. 注释清晰
  7. 文档齐全

常见的coding技巧

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

断言,直接拦截错误

例子:编写函数完成strcpy库函数的功能,使用assert进行拦截空指针

# define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <assert.h>//2.实现库函数strcpy
void my_strcpy(char* dest, char* str) {//断言,判断,如果错误讲直接报错assert(str != NULL);//因为是赋值所以为真,但*str等于0时,*dest也等于0,ASCII码值为0,为假停止while (*dest++ = *str++) {;}
}int main() {char ch1[20] = "XXXXXXXXXXXXX";char ch2[] = "hello World!";int* p = NULL;//my_strcpy(ch1, ch2);my_strcpy(ch1, p);printf("%s", ch2);
}

assert返回错误的位置:

在这里插入图片描述

技巧2:const

const 修饰指针变量

1.const 放在*号左边(const int *p= &num;)

意思是:p指向的对象不能通过p来改变了,但是p本身的值可以改变

2.const放在*号右边(int* const p = &num;)

意思是:p指向的对象是可以通过p来改变的,但不能修改p变量本身的值

1.const 放在*号左边

普通的变量可以使用赋值进行修改:

int num = 10;
num = 20;

使用const修饰后就不能修改:

const int num = 10;
num = 20;//报错:表达式必须是可以修改的左值

但使用const修饰后也并非不可以改,可以获取指针进行修改:

const int num = 10;
int *p= &num;
*p = 20;
printf("%d", num);

使用const修饰指针变量后,就不能通过指针变量修改变量了:

const int num = 10;
const int *p= &num;
*p = 20;//报错:表达式必须是可以修改的左值

指针变量指向的对象不能改变,但指针可以改变

const int num = 10;
const int *p= &num;
int n = 10;
//*p = 20;//erro
p = &n;//ok
2.const放在*号右边

限制p变量本身

const int num = 10;
int* const p = &num;
int n = 20;
p = &n;
使用assert和const优化求字符长度的函数
# define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>//传入数据使用const修饰,防止出现bug时被修改
int my_strlen(const char* str) {//判断是否是空指针assert(str != NULL);int count = 0;while (*str != '\0'){count++;str++;}return count;
}int main() {char str[] = "hello World!";int len = my_strlen(str);printf("%d", len);
}

6.编程常见的错误

6.1编译型错误(语法错误)

直接看错误提示信息(双击),解决问题。或者凭借经验就可以搞定。相对简单。

6.2链接型错误(出现在链接期间)

链接型错误(出现在链接期间)- 找不到符号(1.不存在。2.写错了)

看错误提示信息,主要在代码中找到错误信息中的标识符,然后定位问题所在。一般是标识符名不存在或者拼写错误

例如:

int a = 0;
int b = 0;
int c = Add(a,b);//未定义
//无法解析外部符号Addprintf("%d",c);

无法通过点击跳转到对应位置

6.3运行时错误

借助调试,逐步定位问题。

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

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

相关文章

力扣59.螺旋矩阵||

题目链接&#xff1a;59. 螺旋矩阵 II - 力扣&#xff08;LeetCode&#xff09; 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff…

Github 2024-10-06 php开源项目日报 Top10

根据Github Trendings的统计,今日(2024-10-06统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量PHP项目10Blade项目2Laravel:表达力和优雅的 Web 应用程序框架 创建周期:4631 天开发语言:PHP, BladeStar数量:75969 个Fork数量:24281 次…

HarmonyOS第一课 04 应用程序框架基础-习题分析

判断题 1.在基于Stage模型开发的应用项目中都存在一个app.json5配置文件、以及一个或多个module.json5配置文件。T 正确(True) 错误(False) 这个答案是T - AppScope > app.json5&#xff1a;app.json5配置文件&#xff0c;用于声明应用的全局配置信息&#xff0c;比如应用…

【TypeScript】知识点梳理(三)

#void前面提到了代表空&#xff0c;但有个特殊情况&#xff0c;是空不是空&#xff0c;细谈是取舍&#xff0c;但我们不深究hhh# 代码示例&#xff1a; type func () > voidconst f1: func function() {return true; } 定义了空&#xff0c;返回非空值&#xff0c;理论…

关于软件开发的ChatGPT提示词

面向软件开发人员的 ChatGPT 提示词 不会用ChatGPT就如同上图~~ 所以先推荐一波好用的提示词 1. 代码生成&#xff1a; 为名为 [name] 的 [class/module/component] 生成具有以下功能的样板 [language] 代码&#xff1a;[functionality description]。 创建一个 [语言] 函数以…

二叉树基本概念讲解

一.树的概念 1.概念 树是⼀种非线性的数据结构&#xff0c;它是由 n&#xff08;n>0&#xff09;个有限结点组成⼀个具有层次关系的集合。把它叫 做树是因为它看起来像⼀棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 有⼀个特殊的结点&#xff0c…

计算机的错误计算(一百一十五)

摘要 用错数定量解释计算机的错误计算&#xff08;一百一十四&#xff09;中的错误计算原因。 例1. 已知 计算 在 的错数&#xff0c;并与计算机的错误计算&#xff08;一百一十四&#xff09;中的相应错误数字个数做比较。 由 知&#xff0c; 再由 可得&#xff0c…

Ubuntu 搭建 GitLab

1. 安装依赖&#xff1a; sudo apt update sudo apt install -y curl openssh-server ca-certificates2. 添加 GitLab 包仓库&#xff1a; curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash3. 安装 GitLab&#xff1a; s…

如何判断静态代理IP地址是否被污染?

在网络使用中&#xff0c;静态IP代理是一种常见的工具&#xff0c;用于维持稳定的连接和保护个人隐私。然而&#xff0c;有时这些IP地址可能会被污染&#xff0c;导致用户遭受各种问题&#xff0c;如连接延迟、数据泄露等。因此&#xff0c;了解如何判断址是否被污染至关重要。…

时序逻辑-延一拍/打一拍?

一、时序逻辑中的同步复位和异步复位 同步复位的D触发器 同步复位的D触发器中的“同步”是和工作时钟同步的意思&#xff0c;也就是说&#xff0c;当时钟的上升沿&#xff08;也可以是下降沿&#xff0c;一般习惯上为上升沿触发&#xff09;来到时检测到按键的复位操作才有效&a…

美国静态住宅IP代理怎么定期更换?

在互联网使用中&#xff0c;P代理被广泛应用于许多方面&#xff0c;如网络安全测试、数据采集、访问受限制内容等。然而&#xff0c;为了维护隐私安全和避免被封禁&#xff0c;定期更换IP地址是必要的。特别是对于每个用户&#xff0c;定期更换IP地址更是至关重要。本文将探讨美…

有趣幽默彩虹屁文案生成工具微信小程序源码

有趣幽默彩虹屁文案生成工具小程序源码 此文案小程序主要功能为分享各种有趣幽默的文案 免服务器免域名&#xff0c;源码只提供彩虹屁&#xff0c;朋友圈&#xff0c;毒鸡汤API接口&#xff0c;其他需自行查找替代 小程序拥有复制收藏功能&#xff0c;可自行体验&#xff0c;设…

Ubuntu 22.04.4 LTS更换下载源

方法1&#xff1a;使用图形界面更换下载源 1. 打开软件和更新应用 2. 在Ubuntu 软件标签中&#xff0c;点击“下载自”旁边的下拉菜单&#xff0c;选择“其他” 3. 点击“选择最佳服务器”来自动选择最快的服务器 4. 选择服务器 5. 确定并关闭窗口&#xff0c;系统会提示您重新…

Midjourney零基础学习

Midjourney学习笔记TOP01 什么是AI艺术 AI艺术指的是使用AI技术创作的艺术作品&#xff0c;包括AI诗歌、AI音乐、AI绘画等多种艺术表现形式&#xff1b;AI艺术可以被视为计算机程序与人类合作创作作品&#xff1b;除了Midjourney&#xff0c;比较流行的AI图像生成工具还有Stab…

如何利用免费音频剪辑软件制作出精彩音频

现在有许多免费的音频剪辑软件可供选择&#xff0c;它们为广大用户提供了丰富的功能和便捷的操作体验&#xff0c;让音频编辑变得更加轻松和有趣。接下来&#xff0c;让我们一起走进这些免费音频剪辑软件的世界&#xff0c;探索它们的独特魅力和强大功能。 1.福昕音频剪辑 链…

github学生认证(Github Copilot)

今天想配置一下Github Copilot&#xff0c;认证学生可以免费使用一年&#xff0c;认证过程中因为各种原因折腾了好久&#xff0c;记录一下解决方法供大家参考。 p.s.本文章只针对Github学生认证部分遇到的问题及解决方法&#xff0c;不包括配置copilot的全部流程~ 1、准备工作…

vmstat命令:系统性能监控

一、命令简介 ​vmstat​ 是一种在类 Unix 系统上常用的性能监控工具&#xff0c;它可以报告虚拟内存统计信息&#xff0c;包括进程、内存、分页、块 IO、陷阱&#xff08;中断&#xff09;和 CPU 活动等。 ‍ 二、命令参数 2.1 命令格式 vmstat [选项] [ 延迟 [次数] ]2…

8.9K Star,开源自托管离线翻译引擎

Hi&#xff0c;骚年&#xff0c;我是大 G&#xff0c;公众号「GitHub 指北」会推荐 GitHub 上有趣有用的项目&#xff0c;一分钟 get 一个优秀的开源项目&#xff0c;挖掘开源的价值&#xff0c;欢迎关注。 在全球化的今天&#xff0c;跨语言交流已成为日常需求&#xff0c;然…

使用树莓派搭建音乐服务器

目录 引言一、搭建Navidrome二、服务穿透三、音流配置 引言 本人手机存储空间128G&#xff0c;网易云音乐6个G&#xff0c;本就不富裕的空间更是雪上加霜&#xff0c;而且重点是&#xff0c;我根本没有听几首歌&#xff0c;清除缓存后&#xff0c;整个软件都还是占用了5个G左右…

python log函数怎么用

log() 返回 x 的自然对数。 语法 以下是 log() 方法的语法&#xff1a; import math math.log(x[, base]) 注意&#xff1a;log()是不能直接访问的&#xff0c;需要导入 math 模块&#xff0c;通过静态对象调用该方法。 参数 x -- 数值表达式。 base -- 可选&#xff0c;底…