Visual Studio2022编译器实用调试技巧

简介: Visual Studio2022编译器实用调试技巧

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天,祝自己以后每天都快乐。


本篇结束

相关文章
|
算法 安全 程序员
Visual Studio实用调试技巧---让你成为高端的程序员
Visual Studio实用调试技巧---让你成为高端的程序员
244 0
Visual Studio实用调试技巧---让你成为高端的程序员
|
存储 安全 NoSQL
Visual Studio 2022 你必须知道的实用调试技巧
大家好,前面我们讲了Visual Studio 2022的安装和使用以及scanf报错的解决方法 今天分享一些实用的 VS 技巧,而这些技巧很多人都不知道。当你以后在工作中遇到:我在同事电脑上解决问题,或在会议上演示代码示例时,使用了一些 VS “骚”操作,他们会好奇地问:你是怎么做到的?有时候你知道一些别人不知道的小技巧便可以让你显得更专业。 PS:本文所有示例演示均基于 Visual Studio 2022 版本。
279 0
|
安全 程序员 编译器
visual studio 2022调试技巧介绍(2)
1.什么是bug? bug是计算机领域专业术语,bug原意是“臭虫”,现在用来指代计算机上存在的漏洞,原因是系统安全策略上存在的缺陷,有攻击者能够在未授权的情况下访问的危害。 漏洞是在硬件、软件、协议的具体实现或系统安全策略上存在的缺陷,从而可以使攻击者能够在未授权的情况下访问或破坏系统。 2.调试是什么,如何调试? 2.1 调试的概念 调试简单来说就是调试是保证所提供的设备能够正常运行的必须程序。 通过一些工具对代码进行检测,修复bug。
144 0
visual studio 2022调试技巧介绍(2)
|
C语言 C++
【五一创作】Visual Studio常用调试技巧的温习
【五一创作】Visual Studio常用调试技巧的温习
98 0
|
安全 程序员 编译器
visual studio 2022调试技巧介绍(1)
1.什么是bug? bug是计算机领域专业术语,bug原意是“臭虫”,现在用来指代计算机上存在的漏洞,原因是系统安全策略上存在的缺陷,有攻击者能够在未授权的情况下访问的危害。 漏洞是在硬件、软件、协议的具体实现或系统安全策略上存在的缺陷,从而可以使攻击者能够在未授权的情况下访问或破坏系统。 2.调试是什么,如何调试? 2.1 调试的概念 调试简单来说就是调试是保证所提供的设备能够正常运行的必须程序。 通过一些工具对代码进行检测,修复bug。
350 0
|
编译器 程序员 C语言
你是真的“C”——Visual Studio 2022(VS2022)编译器 -—实用调试技巧(下)
4.多多动手,尝试调试,才能有进步。🙌 5. 一道经典面试题目,这里用调试进行演示分析:🙌 6. 如何写出好(易于调试)的代码。🙌 6.1 优秀的代码: 6.2 典型栗子示范: 6.3 const的作用 7. 编程常见的错误🙌 7.1 编译型错误 7.2 链接型错误 7.3 运行时错误 总结撒花💞
296 0
|
算法 程序员 编译器
你是真的“C”——Visual Studio 2022(VS2022)编译器 -—实用调试技巧(上)
前言🙌 1. 什么是bug?🙌 2. 调试是什么?有多重要?🙌 2.1 调试是什么? 2.2 调试的基本步骤 2.3 Debug和Release的介绍。 3. Windows环境调试介绍🙌 3.1 调试环境的准备 3.2 学会快捷键 3.3 调试的时候查看程序当前信息 3.3.1 查看临时变量的值 3.3.2 查看内存信息 3.3.3 查看调用堆栈 3.3.4 查看汇编信息 3.3.5 查看寄存器信息
503 0
|
IDE 安全 JavaScript
Visual Studio调试技巧 -- Attach to Process
一般写完代码时,我们通常会启动调试运行一下看看是否正确,启动运行的方式无非是F5-- Start Debugging 或 Ctrl+F5-- Start Withour Debugging(注:不同版本或系统环境不同时,快捷键或有所变化),如下图1。不用说大家都能感觉到,使用Ctrl+F5调试时程序从启动到运行通常比使用F5快得多。使用Ctrl+F5时通常是想快速运行一遍,以便检查程序运行的结果是否符合预期。使用F5时通常是想查看代码内部的运行情况,以便检查到底是哪一步出了问题,或者所有参数是否都正确。
Visual Studio调试技巧 -- Attach to Process
|
6月前
Visual Studio 2022 中VLD库如何安装
Visual Studio 2022 中VLD库如何安装
732 1