C语言调试技巧(debug)及程序运行时出现的问题

目录

一、什么是调试

1.介绍调试

2.Debug与Release

3.Debug与Release的对比

二、怎么调试

1.介绍几个调试快捷键

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

三、常见编程错误

1.编译型错误(最简单)

2.链接型错误

3.运行时错误(最难)


下面的内容均在VS2022上进行

一、什么是调试

1.介绍调试

(1)调试可以干什么

调试(Debugging / Debug),又称排错。我们的代码出现错误或者bug,就可以用调试的方法去查找

(2)调试的大致步骤

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

2.Debug与Release

(1)Debug

  • 在VS2022中的位置 

  • Debug的意义:在代码运行起来之后,不会对程序进行任何的优化,也就是可以方便程序调试代码,检查错误。调试代码的过程就是在Debug环境下进行的。

(2)Release

  • 在VS2022的位置

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

3.Debug与Release的对比

  • 看一段代码:很明显的数组越界访问
#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;
}
  • Debug版本下运行

  • Release版本下运行

二、怎么调试

必须在Debug的版本下才能调试

1.介绍几个调试快捷键

(1)F5

【作用】:启动调试,经常用来直接跳到下一个断点处。常配合F9使用

(2)F9

【作用】:创建断点和取消断点

断点:鼠标对着某一行按下F9,就可以创建作业的一个断点,再按一下就可以取消(或者对着灰色区域使用鼠标左键也可以)

(3)F10

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

【使用】当代码可以通过编译之后,点击F10,代码就会进入调试面板,也可以用来控制语句一条一条的执行。我们可以看一下当按下F10调式起来之后的页面

  • 当按下F10,黄色箭头就会往下走。按一次走一行,当遇到函数调用时会直接走完整个函数的过程,如下:

(4)F11

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

【使用】当代码调试起来之后,使用F11可以控制代码一条一条的往下走;也可以使其进入函数内部。

(5)ctrl+F5

【作用】:开始执行不调试,就是让你的代码运行起来,下面整个页面就是ctrl+F5代码运行起来的结果。

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

(1)查看临时变量的值(用的最多)

  • 打开窗口的步骤

  • 点开一个窗口后

我们使用下面的代码演示:

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
int add(int x,int y) {
	return x + y;
}
int main() {
	int a = 10;
	int b = 20;
	int c = add(a,b);
	printf("%d\n",c);
	return 0;
}
  • 下面我们查看变量a、b、c

 

  • 执行之后 ,后面的代码同理

  • 查看数组调用后的值(重要)

先看下面一段代码:需要将数组的地址作为参数传入函数内部。下面对其调试

#include<stdio.h>
void test(int arr[],int len) {
	int i = 0;
	for (i = 0; i < len;i++) {
	
		printf("%d ",arr[i]);
	}
}
int main() {
	int arr[] = {1,2,3,4,5,6,7,8,9,10};
	int len = sizeof(arr) / sizeof(arr[0]);
	test(arr,len);
	return 0;
}
  • 代码为进入函数前

  • 代码进入函数后,先看错误观察的做法

  • 正确做法(重点)  

(2)查看内存信息

  • 在这一步可以查看变量的地址,尤其是指针的时候这个很重要
  • 打开内存窗口的步骤

我们使用下面的代码演示:

#include<stdio.h>
int main() {
	int a = 10;
	int* p = NULL;
	p = &a;
	printf("%d\n",*p);
	return 0;
}
  • 查看变量a与指针变量p

 

(3)查看调用堆栈(用的较少)

  • 打开调用堆栈窗口

  • 使用该窗口:清晰的反应函数的调用关系以及当前调用所处的位置。

(4)查看汇编信息(当查看函数栈帧空间的建立时有大用)

【第一种方式】调试开始之后,点击鼠标右键,选择选项

  • 打开窗口

  • 进入窗口后

【第二种方式】

  • 打开窗口

  • 进入窗口后(一样的内容)

(5)查看寄存器信息(用的较少)

  • 窗口路径

  • 打开窗口后:可以查看当前运行环境的寄存器的使用信息

三、常见编程错误

我们知道,源码变成程序需要经历:编译(预处理、编译、汇编)、链接、运行,在每一个阶段发生的错误就对应每一种错误。

1.编译型错误(最简单)

  • 在编译阶段发生的错误,也称语法错误;如变量名字打错,漏掉分号等
  • 做法:直接看错误提示信息(双击),解决问题。或者凭借经验就可以搞定
  • 举例:

2.链接型错误

  • 在链接阶段,如忘记写头文件,会显示无法解析的外部符号;或者标识符写错或者不存在
  • 举例1

  • 举例2 

3.运行时错误(最难)

  • 在代码运行起来后的错误:如运行的结果跟预期结果不一样,发生死循环等
  • 做法:只能借助调试,一步一步查找


想要减少bug就要细心,想要及时找出bug,就要多调试,多练

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据库-引擎

存储引擎&#xff1a; mysql当中数据用各中不同的技术存储在文件中&#xff0c;每一种技术都使用的是不同的存储机制&#xff0c;索引技巧 索引水平&#xff0c;以及最终提供的不同功能和能力&#xff0c;这些就是我们说的引擎。 功能&#xff1a; mysql将数据存储在文件系统…

使用pytorch处理自己的数据集

目录 1 返回本地文件中的数据集 2 根据当前已有的数据集创建每一个样本数据对应的标签 3 tensorboard的使用 4 transforms处理数据 tranfroms.Totensor的使用 transforms.Normalize的使用 transforms.Resize的使用 transforms.Compose使用 5 dataset_transforms使用 1 返回本地…

五年制专转本的备考是多方面的较量

转本复习已进入下半场&#xff0c;同学们不能再慢悠悠地看书了&#xff01;接下来就是很多人备考的发力期&#xff0c;能否弯道超车就要看个人的把握。 1、自控与时间管理 转本考的知识就是那么多&#xff0c;只需要你高效地投入一定的时间和精力就能够掌握。问题是一些同学做…

【3D 图像分割】基于 Pytorch 的 VNet 3D 图像分割7(数据预处理)

在上一节&#xff1a;【3D 图像分割】基于 Pytorch 的 VNet 3D 图像分割6&#xff08;数据预处理&#xff09; 中&#xff0c;我们已经得到了与mhd图像同seriesUID名称的mask nrrd数据文件了&#xff0c;可以说是一一对应了。 并且&#xff0c;mask的文件&#xff0c;还根据结…

【算法|滑动窗口No.3】leetcode3. 无重复字符的最长子串

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

课题学习(十)----阅读《基于数据融合的近钻头井眼轨迹参数动态测量方法》论文笔记

一、 引言 该论文针对三轴加速度计、磁通门和速率陀螺随钻测量系统&#xff0c;建立了基于四元数井眼轨迹参数测量模型&#xff0c;并依据状态方程和量测方程&#xff0c;应用2个扩卡尔曼滤波器、1个无迹卡尔曼滤波器和磁干扰校正系统对加速度计、磁通门信号进行滤波、校正&…

【从瀑布模式到水母模式:ChatGPT如何赋能软件研发全流程】

你是否曾读过一本让你欲罢不能的计算机书籍&#xff1f;它可能为你打开了新的技术世界大门&#xff0c;或者是帮助你解决了棘手的编程难题。 前言&#xff1a; 计算机技术的发展和互联网的普及&#xff0c;使信息处理和传输变得更加高效&#xff0c;极大地改变了金融、商业、…

超低价:阿里云双11服务器优惠价格表_87元一年起

2023阿里云双十一优惠活动已经开启了&#xff0c;轻量2核2G服务器3M带宽优惠价87元一年、2核4G4M带宽优惠价165元一年&#xff0c;云服务器ECS经济型e实例2核2G3M固定带宽优惠价格99元一年&#xff0c;还有2核4G、2核8G、4核8G、4核16G、8核32G等配置报价&#xff0c;云服务器e…

解决爬虫在重定向(Redirect)情况下,URL没有变化的方法

重定向是一种网络服务&#xff0c;它可以实现从一个网页跳转到另一个网页的功能。它把用户请求的网页重定向到一个新的位置&#xff0c;而这个位置可以是更新的网页&#xff0c;或最初请求的网页的不同版本。另外&#xff0c;它还可以用来改变用户流量&#xff0c;当用户请求某…

React基础源码解析

前言&#xff1a; 前端魔术师卡颂的react学习视频&#xff08;1 搭建项目架构_哔哩哔哩_bilibili&#xff09;中提到了Rodrigo Pombo的一篇react源码教程&#xff1a;Build your own React 本文档分组旨在翻译和记录这篇文章的学习心得&#xff0c;作为react源码学习入门。 …

闭循环低温恒温器的使用注意事项

与液氮恒温器相比&#xff0c;闭循环低温恒温器显得稍微复杂一些&#xff01;这主要表现在组成部分、体积重量、使用操作、升降温时间等方面。闭循环低温恒温器主要由冷头、氦压缩机、两根氦气连管组成&#xff0c;配套设备还有控温仪、真空泵&#xff0c;可能还有循环水冷机。…

【Proteus仿真】【Arduino单片机】简易电子琴

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使用无源蜂鸣器、按键等。 主要功能&#xff1a; 系统运行后&#xff0c;按下K1-K7键发出不同音调。 二、软件设计 /* 作者&#xff1a;嗨小易&a…

动作捕捉系统处理单点多点丢点问题

在动作捕捉数据采集过程中&#xff0c;丢点是经常容易遇到的问题。NOKOV度量动作捕捉软件可以方便地解决丢点问题。 一、单点丢点的处理 如下图&#xff0c;已经采集了动捕数据。 查看是否有丢点&#xff0c;在形影软件左上角选择“窗口分割”&#xff0c;在下方分割出一个空…

Python接口自动化测试实战,一篇足矣

接口自动化测试是指通过编写程序来模拟用户的行为&#xff0c;对接口进行自动化测试。Python是一种流行的编程语言&#xff0c;它在接口自动化测试中得到了广泛应用。下面详细介绍Python接口自动化测试实战。 1、接口自动化测试框架 在Python接口自动化测试中&#xff0c;我们…

ROS学习笔记(4):ROS架构和通讯机制

前提 前4篇文章以及帮助大家快速入门ROS了&#xff0c;而从第5篇开始我们会更加注重知识积累。同时我强烈建议配合B站大学的视频一起服用。 1.ROS架构三层次&#xff1a; 1.基于Linux系统的OS层&#xff1b; 2.实现ROS核心通信机制以及众多机器人开发库的中间层&#xff1b…

HarmonyOS开发:基于http开源一个网络请求库

前言 网络封装的目的&#xff0c;在于简洁&#xff0c;使用起来更加的方便&#xff0c;也易于我们进行相关动作的设置&#xff0c;如果&#xff0c;我们不封装&#xff0c;那么每次请求&#xff0c;就会重复大量的代码逻辑&#xff0c;如下代码&#xff0c;是官方给出的案例&am…

CSS3背景样式

在CSS 2.1中&#xff0c;background属性的功能还无法满足设计的需求&#xff0c;为了方便设计师更灵活地设计需要的网页效果&#xff0c;CSS3在原有background基础上新增了一些功能属性&#xff0c;可以在同一个对象内叠加多个背景图像&#xff0c;可以改变背景图像的大小尺寸&…

nodelist 与 HTMLCollection 的区别

原地址 https://cloud.tencent.com/developer/article/2013289 节点与元素 根据 W3C 的 HTML DOM 标准&#xff0c;HTML 文档中的所有内容都是节点&#xff1a; 整个文档是一个文档节点每个 HTML 元素是元素节点HTML 元素内的文本是文本节点每个 HTML 属性是属性节点注释是注…

基于C语言实现扫雷小游戏

扫雷游戏 1. 扫雷游戏分析和设计1.1 扫雷游戏的功能说明1.2 游戏的分析和设计1.2.1 数据结构的分析 2. 扫雷游戏的代码实现3. 扫雷游戏的扩展 1. 扫雷游戏分析和设计 1.1 扫雷游戏的功能说明 使用控制台实现经典的扫雷游戏 游戏可以通过菜单实现继续玩或者退出游戏 扫雷的棋…

【考研数学】概率论与数理统计 —— 第七章 | 参数估计(2,参数估计量的评价、正态总体的区间估计)

文章目录 一、参数估计量的评价标准1.1 无偏性1.2 有效性1.3 一致性 二、一个正态总体参数的双侧区间估计2.1 对参数 μ \mu μ 的双侧区间估计 三、一个正态总体的单侧置信区间四、两个正态总体的双侧置信区间写在最后 一、参数估计量的评价标准 1.1 无偏性 设 X X X 为总…