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

news2024/11/27 8:27:51

目录

一、什么是调试

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,就要多调试,多练

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

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

相关文章

stm32F407系列控制板用户手册

stm32F407系列控制板用户手册 文章目录 stm32F407系列控制板用户手册1.外观和接口标注2.功能3.参数4.应用场景 1.外观和接口标注 2.功能 智能配网远程控制多路舵机接口多路电机接口姿态实时采集ps 接口oled屏OTA固件一键升级语音控制-需借助app语音识别功能预留can接口预留多个…

IPMI接口配置

1.IPMI接口和RJ45的网口外观上一样&#xff0c;一般主板上带有的IPMI接口会和网卡分开放置&#xff0c;具体区分还要看主板的Specification&#xff0c;下面红色部分的即为IPMI接口 2.找到IPMI接口后&#xff0c;我们要接上一根网线。然后开机进入BIOS&#xff0c;具体按那个…

请一个折腾了5个月AI绘画的人来讲讲GPU选择的经验,没入坑的看他这一篇就足够了

一个折腾了5个月AI绘画的人来讲讲经验&#xff0c;基本上入坑只需要看这一篇就可以了。 不说废话&#xff0c;首先&#xff0c;将显卡分成专业级和家用级。然后两个级别里面再各分高中低一共6档&#xff0c;我一档一档说&#xff0c;包括大家关心的移动版显卡以及显存升级问题…

备忘录在电脑里叫什么?Win10系统自带的备忘录在哪打开?

对于每天都需要使用电脑来办公的职场人士来说&#xff0c;能够随手在电脑桌面上记录工作笔记、常用工作资料、工作注意事项等内容是非常有必要的。但是如果想要实现在电脑上随手记录事情&#xff0c;就需要先找到一款类似于备忘录或便签软件那样的记事软件。 那么备忘录在电脑…

datagrip出现 java.net.ConnectException: Connection refused: connect.

出现这样的情况要看一下hadoop有没有启动 start-all.sh nohup /export/server/apache-hive-3.1.2-bin/bin/hive --service hiveserver2 & scp -r /export/server/apache-hive-3.1.2-bin/ node3:/export/server/ /export/server/apache-hive-3.1.2-bin/bin/hive show databa…

Linux - 安装Ubuntu虚拟机

1&#xff0c;安装VMware Workstation 16 Player&#xff0c;然后运行。 2&#xff0c;选择安装一个新的虚拟机和之后安装操作系统。 3&#xff0c;选择Linux Ubuntu 64-bit 4&#xff0c;填写虚拟机名字和存放的路径。 5&#xff0c;选择硬盘大小。 6&#xff0c;可以定制硬…

Appium 结合 TestNG 并行执行测试

Appium 测试框架可以让我们使用不同的编程语言&#xff08;Java、Python、Ruby、JavaScript&#xff09;测试不同移动端平台的应用&#xff08;Android、iOS&#xff09;&#xff0c;目前也是最火的移动端测试框架。这篇文章会带着大家学习到如何在不同设备中并行执行测试。 并…

Oracle数据库两表关联更新

先放结论 UPDATE 需要更新的表名 BSET B.更新字段1 更新内容1, B.更新字段2 更新内容2WHERE EXISTS (SELECT 1FROM 关联表名 AWHERE A.关联字段 B.关联字段AND A.筛选字段1 筛选字段1 AND A.筛选字段2 筛选字段2 AND B.筛选字段3 筛选字段3 );问题分析 需要写一个更新语…

凝聚伙伴力量,共赢产业未来—— 麒麟信安云展信创重庆站活动圆满召开

志合越山海&#xff0c;聚力共前行&#xff01;11月1日下午&#xff0c;麒麟信安云展信创重庆站圆满召开。 本次活动邀请业内专家、权威机构、行业客户、合作伙伴齐聚一堂&#xff0c;围绕产业新机遇、新挑战&#xff0c;产业政策及趋势等内容展开研讨交流&#xff0c;同时分享…

【SFM】《Structure-from-Motion Revisited》

论文 论文代码 资料 cvpr2017 COLMAP 文章目录 2. 本文贡献2.1 Scene Graph Augmentation 场景图增强2.2 Next Best View Selection下一个最佳视图选择2.3 鲁棒高效的三角化 2.4 BA&#xff08;Bundle Adjustment&#xff09;2.4.1 参数化求解方法2.4.2 过滤2.4.3 再三角化&…

企业大数据挖掘平台推荐

大数据挖掘平台适合哪些应用场景呢&#xff1f; 1、适合大型企业 分布式云计算&#xff0c;线性扩展&#xff0c;保证性能&#xff0c;与BI平台无缝整合&#xff0c;一键发布挖掘模型&#xff0c;模型库提高知识复用&#xff0c;减少重复投入&#xff0c;支持跨库…

当科技遇上神器:用Streamlit定制AI可视化问答界面

Streamlit是一个开源的Python库&#xff0c;利用Streamlit可以快速构建机器学习应用的用户界面。 本文主要探讨如何使用Streamlit构建大模型外部知识检索的AI问答可视化界面。 我们先构建了外部知识检索接口&#xff0c;然后让大模型根据检索返回的结果作为上下文来回答问题。…

UPS设备还只知道人工巡检?这个神器你一定要试试!

随着电子设备在我们的生活和工作中扮演越来越重要的角色&#xff0c;电力的可靠性变得至关重要。不间断电源系统作为一种关键设备&#xff0c;可以提供电力备份&#xff0c;以保障设备在电力中断或波动的情况下能够正常运行。然而&#xff0c;UPS设备的有效监控和管理对于确保其…

unity 使用TriLib插件动态读取外部模型

最近在做动态加载读取外部模型的功能使用了triLib插件&#xff0c;废话不多说直接干货。 第一步下载导入插件&#xff0c;直接分享主打白嫖共享&#xff0c;不搞花里胡哨的。 链接&#xff1a;https://pan.baidu.com/s/1DK474wSrIZ0R6i0EBh5V8A 提取码&#xff1a;tado 导入后第…

录屏软件免费版,精选3款,助你轻松录制!

录屏软件在今天的数字时代中扮演着重要的角色&#xff0c;无论是为了创建教育教程、分享游戏成就&#xff0c;还是记录计算机上的操作步骤。然而&#xff0c;许多用户面临付费和高级功能的限制&#xff0c;很难找到合适的免费录屏软件。那录屏软件免费版都有哪些呢&#xff1f;…

SpringBoot整合Activiti7——全局监听器(八)

文章目录 一、全局监听器事件类型配置方式(选)日志监听器代码实现xml文件创建全局监听器全局配置类测试流程部署流程启动流程 一、全局监听器 它是引擎范围的事件监听器&#xff0c;可以捕获所有的Activiti事件。 事件类型 ActivitiEventType 枚举类中包含全部事件类型 配置方…

【接口测试】Postman登录接口鉴权实战案例,跟着大牛通关...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 在做接口测试的时…

双十一快递“当天达”?宏电助力物流分拣系统高效运行

​众所周知&#xff0c;每年双11都是快递业务的高峰期&#xff0c;是对各大物流企业运输能力的一次大考。为了持续提升快递配送的速度&#xff0c;自动化物流仓储建设的速度也在不断的加快&#xff0c;而在一个完整的自动化物流仓储系统中&#xff0c;输送分拣设备是物流自动化…

掌握视频剪辑技巧:高手教您如何批量减少片头时长并调整播放倍速

随着社交媒体的普及&#xff0c;视频已经成为人们传递信息、表达观点的重要方式。而视频剪辑则是在这个过程中不可或缺的一环。在视频剪辑过程中&#xff0c;时长是一个重要的因素。有时候&#xff0c;我们需要对视频进行裁剪&#xff0c;以减少其时长。今天&#xff0c;我们讲…

分享一下在微信小程序里怎么做一个投票链接

在当今信息化社会&#xff0c;投票已成为各行各业收集意见、汇聚智慧的重要手段。传统的投票方式往往需要投入大量人力物力&#xff0c;而如今&#xff0c;借助微信小程序&#xff0c;我们可以在几分钟内创建一个高效、便捷的投票平台。本文将详细介绍如何在微信小程序中添加投…