学C的第十九天【实用调试技巧:1. 调试;2. Windows环境调试介绍;3. 一些调试的实例;4. 一些调试的实例】

news2025/1/10 20:05:52

=========================================================================

 相关代码gitee自取:C语言学习日记: 加油努力 (gitee.com)

========================================================================= 

 接上期:学C的第十八天【指针初阶:5. 指针和数组、6. 二级指针、7. 指针数组;初识结构体:1. 结构体的声明、2. 结构体成员的访问、3. 结构体传参;练习:3道和整数二进制数相关的练习】_高高的胖子的博客-CSDN博客

========================================================================= 

                             

1. 调试

                    

(1). 调试是什么?

                      

调试Debugging / Debug),又称出错,是发现减少计算机程序电子仪器设备程序错误一个过程一系列动作

                        

                    

(2). 调试的基本步骤

                       

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

                          

                          

(3). Debug 和 Release 的介绍

                           

Debug:通常称为调试版本

                     

包含调试信息,并且不作任何优化便于程序员调试程序

             

(代码演示:)

#include <stdio.h>

int main()
{
	int arr[10] = { 0 };
	int i = 0;

	//循环赋值
	for (i = 0; i < 10; i++)
	{
		arr[i] = 10 - i;
	}

	//循环打印
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}

	return 0;
}

               

                      

Release:通常称为发布版本

                   

它往往是进行了各种优化,使得程序在代码大小运行速度上都是最优的,以便用户更好地使用。

                 

#include <stdio.h>

int main()
{
	int arr[10] = { 0 };
	int i = 0;

	//循环赋值
	for (i = 0; i < 10; i++)
	{
		arr[i] = 10 - i;
	}

	//循环打印
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}

	return 0;
}

                    

                   

Debug版本文件 和 Release版本文件 的大小对比

                 

                       


                              

2. Windows环境调试介绍

                   

(注:linux开发环境调试工具gdb

                     

(1). 调试环境的准备

              

在环境中选择 Debug选项 ,才能使代码正常调试

                

             

            

(2). 学会快捷键

                

                    

F5

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

                    

F9

创建断点取消断点

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

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

                   

条件断点:)

                       

                    

F10

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

                    

F11

逐语句,就是每次都执行一条语句,但是这个快捷键可以使我们的执行逻辑进入函数内部最常用,比F10更加细致,会进入函数观察函数执行的过程)。

                  

CRRl + F5

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

                            


                  

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

                

查看临时变量的值(监视)

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

                  

查看内存信息(内存)

在调试开始之后,用于观察内存信息

         

查看调用堆栈(调用堆栈)

通过调用堆栈,可以清晰地反应函数的调用关系以及当前调用所处的位置

              

                   

查看汇编信息

 在调试开始之后,有两种方式转到汇编。

                 

1. 第一种方式:右击鼠标,选择【转到反汇编】;

                     

2. 第二种方式

            

                 

查看寄存器信息

可以查看当前运行环境的寄存器的使用信息。

                       


                              

3. 一些调试的实例

           

  • 熟练掌握调试技巧

       

  • 初学者80%时间写代码20%时间在调试

            

  • 程序员20%时间写代码80%时间在调试

           

  • 现在学的都是一些简单的调试,以后可能会有很复杂的调试场景多线程程序的调试等;

             

  • 多多使用快捷键提升效率

                       


                              

4. 一些调试的实例

                   

(1). 实例一:实现代码:求 1!+2!+3! ...+ n! ;不考虑溢出

                   

(需调试的问题代码:) 

#include <stdio.h>
//求 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;
}

              

调试思路:

1. 首先推测问题出现的原因,初步确定问题可能的原因

           

2. 实际上手调试很有必要

            

3. 根据第1点,调试时心里有数(下一步应该是什么样的)

              

            

(2). 实例二:死循环

             

#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("hehe\n");
	}

	return 0;
}

               

死循环原因i arr[12] 地址相同

地址会相同的原因:

                

( 数组越界 可能就会出现这种问题)

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

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

相关文章

java中的栈、堆、方法区

栈&#xff08;stack&#xff09; Java栈与堆不同每一个线程都有一个stack&#xff0c;栈的区域非常小&#xff0c;大概只有1M左右&#xff0c;但是存储速度非常快&#xff0c;所以我们把快速执行的任务存储在stack。 特点&#xff1a;自动分配&#xff0c;连续空间&#xff0…

如何从文档中提取结构化数据?parsio.io

parsio.io 产品名&#xff1a;Parsio电子邮件解析器 技术&#xff1a;采用人工智能技术的电子邮件解析器。 支持多种格式&#xff1a; 可以解析电子邮件和附件中的数据&#xff0c;包括PDF、HTML、XLSX&#xff08;Excel&#xff09;、CSV、DOCX、XML、TXT等格式。 提取模版&am…

FANUC机器人作为EtherCAT通信从站的相关配置方法

FANUC机器人作为EtherCAT通信从站的相关配置方法 基本介绍: 前提条件: 硬件部分: 机器人需要使用EtherCAT从站板卡 A20B-8101-0821。使用带屏蔽层的网线连接板卡和PLC的网口。 本例中使用的网络接口为EC-IN(CD38Y) 软件部分: 机器人需要安装软件:1A05B-2600-J743! Et…

NLog使用

Nlog 日志组件的使用 这个博文关注 .net framework下的NLog日志组件的使用. 在项目中需要将日志写到日志文件中, 另外一些重要信息要显示在界面上. 使用 NLog 可以轻松做到这点.NLog wiki 页面 nuget 安装两个主要组件 NLogNLog.Windows.Forms 使用总结 日志文件 layout 按照 j…

程序员的 Windows 工具箱「GitHub 热点速览」

作者&#xff1a;HelloGitHub-小鱼干 如何精简 Windows 并快速配置开发环境呢&#xff1f;本周特推的 winutil 是一个程序员的 Windows 工具箱&#xff0c;它提供了开发工具的一键安装以及减少系统垃圾的功能&#xff0c;一切为了简洁、高效。同样高效的还有 C 日志库 spdlog&a…

对讲机亚音是什么?有什么作用?

一、对讲机亚音是什么&#xff1f; 对讲机亚音又被称为亚音频。是比音频信号频率更低的一种特殊信号&#xff0c;目的在于检查信号是否合法&#xff0c;是否对信号进行响应。 亚音是一种特殊的振幅信号&#xff0c;人耳无法感觉也无法听闻到这些信号&#xff0c;所以对于无线…

mac mongodb 安装及配置

1.官网下载地址&#xff1a;MongoDB: The Developer Data Platform | MongoDB 2.下载好压缩包&#xff0c;解压后放在想放的地方&#xff0c;例如&#xff1a; /Users/xiaokeai/environment/mongodb-macos-x86_64-5.0.18 3.打开终端后&#xff0c;在家目录中打开.bash_profil…

Linux系统编程学习 NO.4 ——基础指令学习、操作系统时间的概念、文件压缩包的概念

1.时间相关的概念以及指令 1.1.时间相关的指令 1.1.1.date指令 date可以指定时间显示的格式&#xff1a;date 指定格式 选项 %H&#xff1a;小时 %M&#xff1a;分钟 %S&#xff1a;秒数 %Y&#xff1a;年份 %m&#xff1a;月份 %d&#xff1a;日 %F:相当于%Y-%m-%d %X:相当…

java网络编程从0到1快速上手

目录 网络编程概述 网络基础 网络编程的目的 网络通信要素概述 通信要素1&#xff1a;ip地址及端口号 IP 地址&#xff1a;InetAddress 端口号 InetAddress类 通信要素2&#xff1a;网络协议 网络协议概述 TCP/IP协议簇 TCP 和 UDP ​Socket Socket类的常用构造…

都什么年代了你还不学习postgreSQL(入门篇)

postgreSQL学习 一&#xff0c;简介 1.什么是postgresql https://www.postgresql.org/#官网​ PostgreSQL 是一个功能强大的开源对象关系数据库系统&#xff0c;它使用和扩展了 SQL 语言&#xff0c;并结合了许多安全存储和扩展最复杂数据工作负载的功能。PostgreSQL的起源可…

消息队列对比

目录 什么是消息队列 常用的消息队列工具对比 1 、ActiveMQ 2 、RabbitMQ 3、Kafka 4、 RocketMQ 什么是消息队列 消息队列是分布式应用间交换信息的重要组件&#xff0c;消息队列可驻留在内存或磁盘上, 队列可以存储消息直到它们被应用程序读走。通过消息队列&#xff0…

docker 镜像和容器

一、简述 win系统常用Ghost技术来做镜像&#xff0c;把系统和系统上安装的应用程序一起打包做备份&#xff0c;在别的电脑上安装这个GHO镜像则会有和源系统一摸一样的系统和应用。 docker功能类似&#xff0c;而且是分层的&#xff0c;在拉取镜像时候可见。 docker镜像拉取下…

4、js - 闭包

1、闭包的概念 闭包&#xff1a;函数嵌套函数&#xff0c;内层函数访问了外层函数的局部变量。 // 闭包 function func1() {let a 9;let b 8;function func2() {console.log("a", a); // a 9}func2(); } func1(); 分析&#xff1a; 需要访问的变量会被放到闭包…

用YOLOv5和MobileViTs骨干网络革新目标检测:高效准确AI视觉的未来

目录 一、YOLOv51、YOLOv5介绍2、YOLOV5的整体架构图3、MobileViT介绍 二、YOLOv5与MobileViT的结合1、YOLOv5网络结构回顾2、MobileViT网络结构介绍3、YOLOv5替换骨干网络为MobileViT的优势 三、MobileViT的细节与实现1、ViT与MobileNetV3的结合2、MobileViT网络结构细节3、Mo…

最高奖金100万!第二届广州·琶洲算法大赛火热报名中

第二届广州琶洲算法大赛以“优选AI算法 让世界更智能”为主题&#xff0c;聚焦前沿 AI 技术&#xff0c;推进算法领域的学术交流、人才培养、技术发展及应用&#xff0c;面向算法领域的开发者、创业机构、企事业单位&#xff0c;招募具有原创性、独创性、引领性的算法模型和应用…

c++ 11标准模板(STL) std::map(二)

定义于头文件<map> template< class Key, class T, class Compare std::less<Key>, class Allocator std::allocator<std::pair<const Key, T> > > class map;(1)namespace pmr { template <class Key, class T, clas…

【JavaScript】ES6新特性(3)

10. Symbol 使用 Symbol&#xff0c;表示独一无二的值 每个 Symbol 是不一样的 不能进行运算 可以显式调用 toString() 可以隐式转换 boolean <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-eq…

华为OD机试真题 Java 实现【寻找相似单词】【2023Q2 200分】

一、题目描述 给定一个可存储若干单词的字典&#xff0c;找出指定单词的所有相似单词&#xff0c;并且按照单词名称从小到大排序输出。 单词仅包括字母&#xff0c;但可能大小写并存&#xff08;大写不一定只出现在首字母&#xff09;。 相似单词说明&#xff1a; 给定一个…

TCP是面向字节流的协议

TCP字节流 之所以会说 TCP 是面向字节流的协议&#xff0c;UDP 是面向报文的协议&#xff0c;是因为操作系统对 TCP 和 UDP 协议的发送方的机制不同&#xff0c;也就是问题原因在发送方。 为什么 UDP 是面向报文的协议&#xff1f; 当用户消息通过 UDP 协议传输时&#xff0c;…

从C语言到C++_12(string相关OJ题)

上一篇已经讲了string类的接口函数&#xff0c;然后根据查文档刷了一道力扣415字符串相加&#xff0c; 这篇继续跟着查文档来刷力扣题&#xff0c;体会C刷题的方便。 目录 917. 仅仅反转字母 - 力扣&#xff08;LeetCode&#xff09; 代码解析&#xff1a; 387. 字符串中的…