调试技巧——C语言

简介: 调试技巧——C语言

今天给大家推出一期特别节目:==使用调试技巧==,想要成为一名优秀的程序员,必须掌握一定的调试技巧,不然只会写代码,不能去发现代码的问题,并且去纠正,那么这个程序员的水平可想而之,让我们一同领悟==相关的调试方法和技巧==:sunrise::sunrise::sunrise:
在这里插入图片描述

一、BUG是什么?

简单地说,BUG就是你程序中的问题,因为有这个bug的存在导致你的程序无法达到你预期的效果
在这里插入图片描述

这是计算机史上第一次正视程序的问题,当时是因为一个 ==小虫子(bug)== 导致的问题,所以就出现了我们后来的bug

二、什么是调试?

1.调试

调试是我们程序员自己去发现寻找程序问题的过程。:warning::warning::warning:

2.调试的过程

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

3.Debug和Release

在这里插入图片描述

我们打开vs可以看到程序分为:==debug==和==release==版本,那他两到底有什么区别尼???:snowflake::snowflake::snowflake:

在这里插入图片描述

==Debug 通常称为调试版本==,它包含调试信息,并且不作任何优化,便于程序员调试程序。
==Release 称为发布版本==,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优
的,以便用户很好地使用。

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

我们顺着文件目录可以找到这段程序,大家可以分别保存下==debug==和==release==版本,分别看看有什么区别。
:snowflake: :snowflake: :snowflake:release为发布版本,当你保存后不能进行直接的修改。

三、如何调试?

1.环境准备

在这里插入图片描述
上一章节讲到,我们要想进行调试,必须选择debug版本。

2.VS相关快捷键

在这里插入图片描述

==F5==开始调试,经常用来直接跳到下一个断点处。
==Ctrl+F5==开始执行(不调试)
==F9==创建断点和取消断点
断点的重要作用,可以在程序的任意位置设置断点。
这样就可以使得程序在想要的位置随意停止执行,继而一步步执行下去。
==F10==逐过程,通常用来处理一个过程,一个过程可以是一次函数调用,或者是一条语句。
==F11==逐语句,通常是用来进入函数进行调试。

3.常查看相关信息

在这里插入图片描述

:triangular_flag_on_post::triangular_flag_on_post::triangular_flag_on_post: ==查看临时变量的值==

在这里插入图片描述

:triangular_flag_on_post::triangular_flag_on_post::triangular_flag_on_post:==查看内存信息==

在这里插入图片描述
:triangular_flag_on_post::triangular_flag_on_post::triangular_flag_on_post:==查看堆栈信息==

在这里插入图片描述
:triangular_flag_on_post::triangular_flag_on_post::triangular_flag_on_post:==查看汇编信息==

在这里插入图片描述

:triangular_flag_on_post::triangular_flag_on_post::triangular_flag_on_post: ==查看寄存器信息==

在这里插入图片描述

四、常见编程的错误?

1.编译型错误

:rose::rose::rose: 通常都是一些语法错误,凭借经验就可以解决。

在这里插入图片描述
在这里插入图片描述
我们可以根据提示,很容易就修改成功了,这里是在定义数组时未加分号,我们添加上即可。

2.链接型错误

:rose::rose::rose: 看错误提示信息,主要在代码中找到错误信息中的标识符,然后定位问题所在。一般是标识符名不存在或者拼写错误

在这里插入图片描述
在这里插入图片描述
我们可以根据下面的提示发现,我们未定义add函数直接使用导致程序的错误。

3.运行时错误

:rose::rose::rose: 这种问题一般是程序无报错,可以正常运行但达不到预期效果,这是大家就可以借助刚刚所讲到的调试技巧进行逐步调试去发现问题的所在,并纠正。

五、调试案例分析

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;
}
:pencil2::pencil2::pencil2: 大家思考下这段程序如果输入3的话,会输出多少尼?

在这里插入图片描述
进行运行之后发现,结果并不是9,而是15,为什么尼?那我们进行一步一步调试去发现问题所在。
在这里插入图片描述
当我们就进行第一轮循环时,阶乘ret为1,sum为1.
在这里插入图片描述
当进行第二轮循环,ret为2,sum为3也没有问题。
在这里插入图片描述
当进行第三轮循环时,阶乘为12,sum为15时,我们可以发现第三轮循环时ret为12,不是6,可以发现问题在这。
在这里插入图片描述
:pencil2::pencil2::pencil2:我们可以发现,每轮进行阶乘计算时,为进行初始化,而是沿用上一轮计算的结果,导致结果出现了问题。

在这里插入图片描述

当我们调试之后,很容易就发现了问题的所在,并进行了纠正,==这就是调试的重要性==。

:apple::apple::apple: 这一期的调试技巧就到这里了,希望大家能够重视调试技巧,多多练习,向一名优秀的程序员靠近,预祝大家520快乐哈。
目录
相关文章
|
8月前
|
C语言
C语言使用宏定义实现等级调试输出PRINT_LEVEL
C语言使用宏定义实现等级调试输出PRINT_LEVEL
161 0
|
2月前
|
NoSQL 编译器 C语言
C语言调试是开发中的重要技能,涵盖基本技巧如打印输出、断点调试和单步执行,以及使用GCC、GDB、Visual Studio和Eclipse CDT等工具。
C语言调试是开发中的重要技能,涵盖基本技巧如打印输出、断点调试和单步执行,以及使用GCC、GDB、Visual Studio和Eclipse CDT等工具。高级技巧包括内存检查、性能分析和符号调试。通过实践案例学习如何有效定位和解决问题,同时注意保持耐心、合理利用工具、记录过程并避免过度调试,以提高编程能力和开发效率。
62 1
|
2月前
|
存储 算法 C语言
用C语言开发游戏的实践过程,包括选择游戏类型、设计游戏框架、实现图形界面、游戏逻辑、调整游戏难度、添加音效音乐、性能优化、测试调试等内容
本文探讨了用C语言开发游戏的实践过程,包括选择游戏类型、设计游戏框架、实现图形界面、游戏逻辑、调整游戏难度、添加音效音乐、性能优化、测试调试等内容,旨在为开发者提供全面的指导和灵感。
67 2
|
3月前
|
C语言
C语言调试
C语言调试
26 0
|
5月前
|
C语言 索引
C语言编译环境中的 调试功能及常见错误提示
这篇文章介绍了C语言编译环境中的调试功能,包括快捷键操作、块操作、查找替换等,并详细分析了编译中常见的错误类型及其解决方法,同时提供了常见错误信息的索引供参考。
|
8月前
|
NoSQL Linux Redis
redis源码调试---vscode使用技巧-----C语言跳转到函数定义
redis源码调试---vscode使用技巧-----C语言跳转到函数定义
135 0
|
7月前
|
存储 编译器 C语言
C语言学习记录——调试技巧(VS2019环境下)
C语言学习记录——调试技巧(VS2019环境下)
72 2
|
8月前
|
程序员 C语言 C++
C语言实用的调试技巧
C语言实用的调试技巧
60 3
|
7月前
|
程序员 编译器 C语言
C语言中的assert.h:调试助手与断言详解
C语言中的assert.h:调试助手与断言详解
|
8月前
|
程序员 编译器 测试技术
C语言初阶⑨(调试)(如何写出好的代码)(模拟实现strcpy和strlen)
C语言初阶⑨(调试)(如何写出好的代码)(模拟实现strcpy和strlen)
68 1

热门文章

最新文章