Visual Studio2022编译器实用调试技巧

news/2025/2/22 1:56:07/

目录

1.什么是bug

2.调试是什么?

3.debug和release的介绍

4.windows环境调试介绍

4.1 调试环境的准备

4.2 学会快捷键

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

4.4 查看内存信息

5.如果写出好(易于调试)的代码

7.编程常见的错误


1.什么是bug

这是Grace Hopper在1947年在Markll机器运行程序时发现的第一个程序"bug",被贴在她的本子上了。它真的是个虫子。这只夹扁的小飞蛾在MarkⅡ计算机的继电器触点里,它"卡"住了机器的运行,导致运行出错,是第一个计算机程序错误。后来人们习惯性的把程序出的问题称为Bug,把排除程序故障叫做Debug(除虫)。
 

2.调试是什么?

我们再写代码时,不要只会复制,粘贴。对于程序出现的问题,我们要通过调试来解决,不能如下图:

 拒绝-迷信式调试! ! ! !
调试(英语:Debugging / Debug),又称除错,是发现和减少计算机程序或电子仪器设备中程序错误的一个过程。

调试的基本步骤·发现程序错误的存在:

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

3.debug和release的介绍

Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。

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

#include<stdio.h>
int main()
{char *p = "hello xilanhua";printf("%s\n",p);return 0;
}

上述代码在Debug环境的结果展示

 上述代码在Release环境的结果展示 

 可以发现Release版本下可执行文件比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模式下,x86{32位)环境下,会出现死循环。是因为:

i和数组arr都是局部变量,是在栈区创建的,栈区内存使用特点是先使用高地址空间,而数组又是从低地址往高地址排列,vs编译器变量之间空两个字节,所以当循环执行到arr[12]时会把i的值的值改为0,造成死循环。

 如果是debug模式去编译,程序的结果是死循环。如果是release模式去编译,程序没有死循环。那他们之间有什么区别呢?就是因为优化导致的。
 

4.windows环境调试介绍

注:Linux开发环境调试工具式gdb,后期课程会讲

4.1 调试环境的准备

 在环境中选择Debug选项,才能使代码正常调试

4.2 学会快捷键

最常使用的几个快捷键︰
F5

启动调试,经常用来直接调到下一个断点处。没有断点会让程序运行完。

F9

创建断点和取消断点断点的重要作用,可以在程序的任意位置设置断点。这样就可以使得程序在想要的位置随意停止执行,继而一步步执行下去。

F10

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

F11

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

CTRL+ F5

开始执行不调试,如果你想让程序直接运行起来而不调试就可以直接使用。

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

查看临时变量的值:

调试开始后,用于观察变量的值

 

4.4 查看内存信息

在调试开始之后开始观察内存信息

 

多多动手,尝试调试,才能有进步

—定要熟练掌握调试技巧。
初学者可能80%的时间在写代码,20%的时间在调试。但是一个程序员可能20%的时间在写程序,但是80%的时间在调试。
我们所讲的都是一些简单的调试。以后可能会出现很复杂调试场景∶多线程程序的调试等。·多多使用快捷键,提升效率。

5.如果写出好(易于调试)的代码

优秀的代码∶

  • 1.代码运行正常
  • 2.bug很少
  • 3.效率高
  • 4.可读性高
  • 5.可维护性高
  • 6.注释清晰
  • 7.文档齐全

常见的coding技巧∶

  • 1.使用assert 断言,下面会使用
  • 2.尽量使用const 
  • 3.养成良好的编码风格
  • 4.添加必要的注释
  • 5.避免编码的陷阱。示范:

const的用法

const修饰指针的时候
当const 放在*的左边,限制的指针指向的内容,不能通过指针变量改变指针指向的内容,但是指针变量的本身是可以改变的
当const 放在*的右边,限制的指针变量本身,指针变量的本身是不能改变的,但是指针指向的内容是可以通过指针来改变的

#include<stdio.h>
int main()
{int m = 10;//const 可以修饰指针int n = 100;const int*  p = &m;//*p的值不可改变//int* const p = &m;  //p的指向不能改变//*p = 0;//p = &n;return 0;
}


模拟实现库函数: strcpy。示例:

#include<stdio.h>
#include<string.h>
#include<assert.h>//assert 断言void my_strcpy(char* dest, const char* src)//const 使为了防止*src被修改
{//断言assert(dest != NULL);//条件为假报错,会直接提示是这里出错assert(src != NULL);char* ret = dest;while (*src != '\0'){*dest = *src;dest++;src++;}*dest = *src;//拷贝 \0//while (*dest++ = *src++);//等同于上面代码return ret;
}int main()
{char arr1[] = "hello world";char arr2[20] = "*************";//会把原字符串的'\0'拷贝过来my_strcpy(arr2, arr1);//返回的是目的地的地址printf("%s\n", arr2);printf("%s\n", strcpy(arr2, arr1));//链式访问return 0;
}

7.编程常见的错误

常见的错误分类:

编译型错误

直接看错误提示信息,双击可以定位,解决问题。或者凭借经验就可以搞定。相对来说简单。

链接型错误

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

运行时错误

借助调试,逐步定位问题。最难搞。

最后,今天是第一次恋爱和平分手的日子,为期78天,祝自己以后每天都快乐。

本篇结束

 


http://www.ppmy.cn/news/96412.html

相关文章

Day2:Windows网络编程-TCP

今天开始进入Windows网络编程的学习&#xff0c;在学习的时候总是陷入Windows复杂的参数&#xff0c;纠结于这些。从老师的讲解中&#xff0c;这些内容属于是定式&#xff0c;主要学习写的逻辑。给自己提个醒&#xff0c;要把精力放在正确的位置&#xff0c;不要无端耗费精力。…

指针数组和数组指针

//void test(int arr[]) //{ // int sz sizeof(arr) / sizeof(arr[0]); // printf("%d\n", sz);//计算的是 // //地址除元素的大小的值 32位 ֵ值为1 64位 值为2 //} //int main() //{ // int arr[10] { 0 }; // test(arr); // char ch w; // …

String类的学习笔记(下):字符串拼接以及StringBuilder和StringBuffer的学习

本文介绍了String类对字符串进行拼接的方法 和拼接字符串的效率分析 以及能对字符串内容进行修改的StringBuilder和StringBuffer类其常用方法和区别 , 最后介绍了两个字符串经典面试题 StringBuilder和StringBuffer的学习 一.String类概括二.StringBuilder和StringBuffer1.字符…

第一节 Python 顺序结构

1 . Python 介绍 1.1 Python是什么 Python是一种高级编程语言,具有简单易学、功能强大、可扩展性好等特点,是目前广泛应用于Web开发、数据分析、人工智能等领域的编程语言之一。 Python的历史可以追溯到1989年,当时在荷兰的Guido van Rossum开发了这种语言,Guido最初设计P…

Arduino学习

物联网学习资料 《arduino程序设计基础》陈吕洲 北京航空航天大学出版社 半颗心脏博客导航一站式搜索(所有博客的汇总帖) Ai-Thinker 安信可科技 github 半颗心脏 | 徐宏 蓝牙技术 蓝牙网关【【智能家居】入门攻略二&#xff01;啥是网关&#xff1f;蓝牙、zigbee协议详…

【Java零基础入门篇】第 ③ 期 - 面向对象编程(一)

【Java零基础入门篇】第 ③ 期 - 面向对象编程&#xff08;一&#xff09; 博主&#xff1a;命运之光 专栏&#xff1a;Java零基础入门 理解面向对象三大主要特征&#xff1b; 掌握类与对象的区别与使用&#xff1b; 掌握类中构造方法以及构造方法重载的概念及使用&#xff1b;…

YUM安装LNMP架构配置命令与搭建论坛

LNMP架构配置命令与搭建论坛 LNMP简介安装须知安装 Nginx配置yum源yum安装nginx并查看版本号开启服务并且设为开机自启 安装 MySQL 5.7 (mariadb)移除软件包下载安装mysql安装MySQL报错问题解决方案&#xff1a; 开启服务并设为开机自启在日志文件中找出root用户的初始密码登录…

【趣味题目】不用加减乘除做加减乘除运算

不用加减乘除做加减乘除运算 预备知识做加法做减法做乘法做除法|取模 预备知识 这类题目我选择使用位运算&#xff0c;需要了解到&#xff1a;两个数异或&#xff08;a^b&#xff09;结果是忽略进位的结果&#xff1b;两个数相与&#xff08;a&b&#xff09;<<1结果…