C语言——实用调试技巧——第1篇——(第22篇)

坚持就是胜利

文章目录

  • 一、什么是bug?
  • 二、调试是什么?有多重要?
  • 三、debug 和 release 的介绍?
    • 1、
    • 2、
    • 3、
  • 四、windows环境调试介绍
    • 1、调试环境的准备
    • 2、学会快捷键
      • F5 或者 Fn + F5
        • 条件断点
      • Ctrl + F5
      • F9 或者 Fn + F9
      • F10 或者 Fn + F10
      • F11 或者 Fn + F11
    • 3、调试的时候查看程序当前信息
      • (1)查看临时变量的值
      • (2)查看内存信息
      • (3)查看调用堆栈
      • (4)查看汇编信息
      • (5)查看寄存器信息
    • 4、多多动手,尝试调试,才能有进步


一、什么是bug?

第一次被发现的导致计算机错误的飞蛾,也是第一个计算机程序错误。

二、调试是什么?有多重要?

调试的基本步骤:
1、发现程序错误的存在
2、以隔离、消除等方式对错误进行定位
3、确定错误产生的原因
4、提出纠正错误的解决办法
5、对程序错误予以改正,重新测试

三、debug 和 release 的介绍?

1、

Debug 称为 调试版本。它包含调试信息,并且不作任何优化,便于程序员调试程序。
Release 称为 发布版本。它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的, 以便用户很好地使用。
在这里插入图片描述
Debug 版本 可以 逐语句调试
在这里插入图片描述
Release 版本 不可以调试,因为Release版本就是用户版本,用户不会调试,自然也不用会调试!
在这里插入图片描述

2、

Debug 版本的内存 大于 Release 版本的内存
在这里插入图片描述

#include <stdio.h>int main()
{char* p = "hello new world";printf("%s\n", p);return 0;
}

上述代码在 Debug 环境的结果显示:39 KB 内存大
在这里插入图片描述
上述代码在 Release 环境的结果显示:9 KB 内存小
在这里插入图片描述

3、

#include <stdio.h>int main()
{int i = 0;int arr[10] = { 0 };for (i = 0; i <= 12; i++){arr[i] = 0;printf("hehe\n");}return 0;
}
//在上面的代码中,for 循环的终止条件是 i<=12,而数组 arr 的大小是 10。
//因此,当 i 的值增加到10时,循环条件 i <= 12 仍然为真,导致循环继续执行。

Debug 模式 去编译,程序的结果是死循环。
在这里插入图片描述

Release 模式 去编译,程序没有死循环。
在这里插入图片描述

那它们之间有什么区别呢?

就是因为 优化 导致的。

四、windows环境调试介绍

注:linux 开发环境的调试工具是 gdb,后期再好好学习

1、调试环境的准备

在环境中选择 debug 选项,才能使代码正常调试。
在这里插入图片描述

2、学会快捷键

在这里插入图片描述

所有功能都要好好掌握!

F5 或者 Fn + F5

启动调试,经常用来直接跳转到下一个 断点处。
在这里插入图片描述
这个断点:是逻辑上的执行断点,而不是物理上的断点。
在这里插入图片描述

条件断点

在这里插入图片描述
在这里插入图片描述
当 i==5 时,才触发断点。
在这里插入图片描述

Ctrl + F5

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

F9 或者 Fn + F9

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

F10 或者 Fn + F10

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

F11 或者 Fn + F11

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

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

(1)查看临时变量的值

监视
在这里插入图片描述

局部变量
在这里插入图片描述

自动窗口
在这里插入图片描述

(2)查看内存信息

在这里插入图片描述

在这里插入图片描述

(3)查看调用堆栈

#include <stdio.h>void test2()
{printf("test2\n");
}void test1()
{test2();
}void test()
{test1();
}int main()
{test();return 0;
}

F11 逐语句

以下图片,反映了程序在函数调用时的逻辑。

通过调用堆栈,可以清晰的反应函数的调用关系以及当前调用所处的位置。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
以上过程,就类型于 栈
在这里插入图片描述

(4)查看汇编信息

在这里插入图片描述

在这里插入图片描述
或者
在这里插入图片描述

(5)查看寄存器信息

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

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

1、一定要熟练掌握调试技巧
2、初学者可能80%的时间在写代码,20%的时间在调试。但是一个程序员可能20%的时间在写程序,但是80%的时间在调试。
3、我们所讲的都是一些简单的调试。以后可能会出现很复杂的调试场景:多线程程序的调试等。
4、多多使用快捷键,提升效率。

微软雅黑字体
黑体
3号字
4号字
红色
绿色
蓝色

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

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

相关文章

RAG中如何解决上下文知识连贯性问题 || 如何更好的切分和组织非结构化的文档数据

当信息蕴含在较长的上下文时&#xff0c;基于片段的搜索召回&#xff0c;一定会丢失数据&#xff0c;导致最终无法正确的回答问题。 实际上复杂的问题&#xff0c;这里只是说问题本身倾向于从全文获取答案&#xff0c;而不仅仅是基于片段。 斯坦福论文提出的核心问题和解决思路…

小程序--本地存储API

1、存储数据 wx.setStorageSync()&#xff1a;无需转换数据类型&#xff0c;存什么类型的就是什么类型的&#xff0c;data中的数据&#xff0c;使用时是this.data.名称。 saveData() {wx.setStorageSync(list, this.data.list)wx.showToast({title: 存储成功,})}, 2、读取数据…

【Mocreak】傻瓜式一键安装部署OFFICE教程

微软 Office 办公软件安装除了官方的安装包外&#xff0c;还可以通过部署工具来安装各种版本的 Office&#xff0c;其中目前比较流行的是 Office Tool Plus 和 Office 2013-2021 C2R Install 这两个软件。 今天再分享一个类似的 Office 部署工具「Mocreak」同样傻瓜式可以一键…

边缘计算网关如何实现高效数据处理与传输?-天拓四方

随着物联网&#xff08;IoT&#xff09;技术的迅猛发展&#xff0c;海量的设备接入和数据交换对传统的中心化数据处理模式提出了巨大的挑战。在这一背景下&#xff0c;边缘计算作为一种将计算任务从云端推向网络边缘的新型计算模式&#xff0c;正逐渐成为解决这一问题的有效手段…

nginx 配置文件详细介绍

一&#xff0c; nginx 配置文件架构 上一篇 已对 main 全局配置做了详细介绍 本章对剩下的配置文件部分做介绍 二&#xff0c;event 设置 &#xff08;一&#xff09;event 相关的配置文件为 配置工作模式以及连接数 &#xff08;二&#xff09;具体表现 1&#xff…

过年放鞭炮

解法&#xff1a; 取巧 #include <iostream> #include <vector> #include <algorithm> using namespace std; #define endl \nint main() {ios::sync_with_stdio(false);cin.tie(0); cout.tie(0);int t, n;cin >> t;while (t--) {cin >> n;vec…

素数筛法详解:埃氏筛和欧拉筛

主要讲解怎么判断一个数字是否是素数&#xff1a; 埃式筛 学习埃氏筛之前&#xff0c;我们先看一下暴力筛法&#xff0c;即对每个数都用试除法判断其是不是质数&#xff1a; 暴力筛法&#xff1a; # include <stdio.h>int main() {int st[N]; // 初始化为0&#xff0…

GitLab代码库提交量统计工具

1.说明 统计公司所有项目的提交情况&#xff0c;可指定分支和时间段&#xff0c;返回每个人的提交新增数、删除数和总数。 2.API 文档地址&#xff1a;http://公司gitlab域名/help/api/README.md 项目列表查询 返回示例&#xff1a; [{"id": 1, //项目ID"http…

Microsoft 365自定义安装软件

如图&#xff0c;在安装类型的步骤的时候&#xff0c;可以勾选自己想要的软件&#xff08;而非一股脑儿的安装一大堆自己不需要的&#xff09;。

搜索引擎是如何工作的?

搜索引擎是如何工作的&#xff1f; 本文转自 公众号 ByteByteGo&#xff0c;如有侵权&#xff0c;请联系&#xff0c;立即删除 搜索引擎是如何工作的&#xff1f; 搜索引擎在互联网时代扮演着至关重要的角色&#xff0c;它们不仅极大地影响了人们获取信息的方式&#xff0c;还…

RSA加密原理

2024.2.23 密钥对的生成过程 1、随机找两个质数 P 和 Q &#xff0c;P 与 Q 越大&#xff0c;越安全 本例取 P 67 &#xff0c;Q 71 计算他们的乘积 N P * Q 4757 转化为二进为 1001010010101&#xff0c;该加密算法即为 13 位&#xff0c;实际使用中的算法是往往是 …

基于RK3399 Android11适配OV13850 MIPI摄像头

目录 1、原理图分析2、编写和配置设备树3、调试方法4、遇到的问题与解决5、补丁 1、原理图分析 从上图可看出&#xff0c;我们需要关心的&#xff0c;①MIPI数据和时钟接口使用的是MIPI_TX1/RX1 ②I2C使用的是I2C4总线 ③RST复位引脚使用的是GPIO2_D2 ④PWDN使用的是GPIO1_C7 ⑤…

kali xrdp

Kali Linux 使用远程桌面连接——xrdp&xfce_kali xfce桌面-CSDN博客 Ubuntu/Debian/Kali xrdp远程桌面黑屏/空屏/无画面解决办法 - 知乎 (zhihu.com) sudo apt-get install xrdp -y sudo apt-get install xfce4 -ysudo systemctl enable xrdp --now systemctl status xrd…

RabbitMQ监控方法以及核心指标

RabbitMQ监控方法以及核心指标 1. 监控指标采集2. 使用rabbimq插件采集指标2.1 3.8.0之前版本&#xff0c;使用外部插件暴露2.2 3.8.0之后版本&#xff0c;使用内置插件暴露 3. 使用rabbitmq_exporter采集指标3.1 部署rabbitmq_exporter3.2 prometheus采集rabbitmq_exporter的暴…

【知识分享】自动化测试首选接口自动化?

在分层测试的“金字塔”模型中&#xff0c;接口测试属于第二层服务集成测试范畴。 相比UI自动化测试而言&#xff0c;接口自动化测试收益更大&#xff0c;且容易实现&#xff0c;维护成本低&#xff0c;有着更高的投入产出比。因此&#xff0c;项目开展自动化测试的首选一般为接…

OpenHarmony—UIAbility组件间交互(设备内)

UIAbility是系统调度的最小单元。在设备内的功能模块之间跳转时&#xff0c;会涉及到启动特定的UIAbility&#xff0c;该UIAbility可以是应用内的其他UIAbility&#xff0c;也可以是其他应用的UIAbility&#xff08;例如启动三方支付UIAbility&#xff09;。 本章节将从如下场…

MFC 多文档程序的基本编程

下载了一个openGL mfc的多文档程序,以此来学习mfc多文档模式的编程; 1 基本编程 它每次新建一个文档,会在窗口绘制一个三角形、一个矩形;如果没有了图形刷新一下; 先看一下为什么每次打开新文档会绘制图形; 生成工程之后主要有5个类,比单文档程序多了一个子框架类; 可…

主流开发语言和开发环境:探索编程世界的基础

在当今这个快速发展的技术时代&#xff0c;软件开发已经成为推动创新的重要力量。无论是构建下一代应用、开发先进的算法还是创建复杂的系统&#xff0c;选择合适的编程语言和开发环境都是至关重要的。在本文中&#xff0c;我们将探讨当前流行的几种主流开发语言以及它们常用的…

从零学习Linux操作系统第二十六部分 shell的基础知识

一、脚本存在的意义及幻数的作用 什么是shell &#xff1a;保护内核 脚本中命令的解释器 shell脚本的意义 1.记录命令执行的过程和执行逻辑&#xff0c;以便以后重复执行 2.脚本可以批量处理主机 3.脚本可以定时处理主机 如何创建shell脚本 #!/bin/bash ##幻数 幻数是最优…

C# CAD2016 cass10宗地Xdata数据写入

一、 查看cass10写入信息 C# Cad2016二次开发获取XData信息&#xff08;二&#xff09; 一共有81条数据 XData value: QHDM XData value: 121321 XData value: SOUTH XData value: 300000 XData value: 141121JC10720 XData value: 权利人 XData value: 0702 XData value: YB…