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

安装Docker安装插件,可以按照以下步骤进行操作: 1. 首先,安装Docker。可以按照官方文档提供的步骤进行安装,或者使用适合您操作系统的包管理器进行安装。 2. 安装Docker Compose插件。可以使用以下方法安装: 2.1 下载指定版本的docker-compose文件: curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose 2.2 赋予docker-compose文件执行权限: chmod +x /usr/local/bin/docker-compose 2.3 验证安装是否成功: docker-compose --version 3. 在安装插件之前,可以测试端口是否已被占用,以避免编排过程中出错。可以使用以下命令安装netstat并查看端口号是否被占用: yum -y install net-tools netstat -npl | grep 3306 现在,您已经安装Docker安装Docker Compose插件,可以继续进行其他操作,例如上传docker-compose.yml文件到服务器,并在服务器上安装MySQL容器。可以参考Docker的官方文档或其他资源来了解如何使用DockerDocker Compose进行容器的安装和配置。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Docker安装docker-compose插件](https://blog.csdn.net/qq_50661854/article/details/124453329)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [Docker安装MySQL docker安装mysql 完整详细教程](https://blog.csdn.net/qq_40739917/article/details/130891879)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码小娥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值