编程终极技能-调试(上)

简介: 编程终极技能-调试

1.调试是什么?


调试(英语:Debugging / Debug),又称除错,是发现和减少计算机程序或电子仪器设备中程序错误的一个过程。当我程序出现了逻辑错误时就需要调试了。


2.调试的步骤


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


3. Release 和 Debug的介绍


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


例如:在VS2022中:


723d81be58eac55ea9930e0be8bd670a_ded2a484644c41bd92617eb2e95289a7.png


实例一:

#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】下:


通过调试操作,发现数据访问的第12个元素刚好就是 i变量所在的空间,通过修改 arr[12]将 i改成了0。就这样 i 变量一旦增加到了12就会被改成0,程序发生了死循环。


原因:程序在栈上开辟空间时,优先会利用高地址的空间,因为此处i变量先创建,所以变量i的地址高于数组的地址。随后创建数组,数组的起始内存空间肯定是在i变量的下面,当数组越界访问时,访问的地址越来越高,由于i与arr数组的最后一个元素的地址空间只差了8个字节,刚好数组向上多访问两个元素,就访问到了i变量,并且数组还做了将i变量置为0的操作,此时, arr[i]就又开始访问数组的第一个元素了,等到访问到arr[i](i==12)时,又将i置为0,一直循环往复,形成了死循环。


1f6f15a49cbb178e098eb5c1d82a4012_63f9e3247d9d4117aeb383e14414a324.png


【release】下:


release版本之下,程序不会出现死循环。因为编译器做了一些优化处理。我们可以适当观察一下:


189ff178e3c6d19b43479a66f4d9b3f2_2f158de9dabd445b9d6ad7871ab3344a.png


可以发现:变量在内存中开辟的顺序发生了变化,影响到了程序的执行结果。


4. Visual studio的调试


4.1环境准备


首先要在编译环境中选择 Debug 选项,代码才能正常调试。


4.2快捷键的使用


1bce68f0733055e39da8d5d0f410c287_e332f5396ae14004b5080d7e473947f7.png


常用的快捷键需要记住,后期会帮我们节省很多时间。例如:shift+F11用于跳出该函数。


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


F9;创建断点和取消断点。断点可以在程序的任意位置设置。


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


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


CTRL + F5:开始执行但是不调试。


4.3 调试的时候查看程序信息


调试启动之后。


70a9f22c556504619fc4043e45f51545_c40fd5438ae4400cb03404eb3121a73a.png


查看内存信息:


bd23f35382d7e1c77e3ca6fcd3a7e70a_94293e828c984fd2a1b8485d3e500c08.png


总之,调试的功能应有尽有,要根据不同的实例恰当的选取。


相关文章
|
28天前
|
存储 API 数据库
探索后端开发的奥秘:从基础到高级
【5月更文挑战第31天】本文将带领读者深入理解后端开发的世界,从基础的服务器和数据库知识,到复杂的API设计和微服务架构。我们将通过实例和案例分析,揭示后端开发的关键概念和技术,帮助读者提升他们的技能和知识。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和技巧。
|
1天前
|
传感器 监控 机器人
技术经验解读:【雕爷学编程】Arduino动手做(83)
技术经验解读:【雕爷学编程】Arduino动手做(83)
|
1月前
|
存储 缓存 IDE
嵌入式开发中的几个有用的经验!
嵌入式开发中的几个有用的经验!
29 0
|
10月前
|
程序员
编程终极技能-调试(下)
编程终极技能-调试
|
1月前
|
程序员 Windows
程序员必备技能——调试技巧
程序员必备技能——调试技巧
46 0
|
1月前
|
存储 程序员 编译器
程序员必备技能——调试技巧(二)
程序员必备技能——调试技巧(二)
32 0
|
10月前
|
人工智能 自然语言处理 程序员
《游戏测试》编写 Prompt 将成为程序员的必修课
《游戏测试》编写 Prompt 将成为程序员的必修课
|
IDE NoSQL 程序员
必备技能:程序的调试
本节内容相对来说比较笼统一些,但是也是非常非常非常重要的一节内容,毕竟一个程序猿不能只会写bug,你写一堆bug谁来修呢?所以通过调试去排查错误的能力是一个优秀的程序猿必须要掌握的技能,而且不能仅仅是掌握,更要精通,本节内容总体来说只有两大部分,一是学习调试的方法,会有举例实际去感受一下,二是在写代码就要考虑的一些问题,养成良好的写代码习惯,防患于未然。
必备技能:程序的调试
|
网络协议 Java
编程技能强化代码知识点整理
编程技能强化代码知识点整理
138 0
|
NoSQL 算法 MongoDB
使用项目驱动学习编程的诀窍
使用项目驱动学习编程的诀窍
138 0