本章内容:

1.VS2026调试技巧

1)什么是bug?

        bug就是指在电脑系统或程序中,隐藏着的一些未被发现的缺陷或者问题,简称程序漏洞

        经常玩游戏的道友肯定知道这个词,比如我们在打王者荣耀的时候,偶尔就会遇到bug,比如说英雄的技能释放特效不显示或者显示不明显等,这就是游戏程序员在设计的时候,程序是有着隐藏的问题的,程序员去进行代码测试的时候没有检查出来,而玩家在玩游戏的过程中遇到了相对应的问题,这时候程序员就要去维护代码,找出这个bug,然后快速进行修复,那么我们也可以让opencode来进行回答:

        发现它举例也是比较详细的,列出了bug的一些常见类型及报错原因

2)什么是调试?

        当我们发现了程序中是存在问题的,那么程序员第一反应就是去找到问题,并修复问题,这个找问题的过程就被称为调试,英文叫debug,消灭bug的意思。

        调试一个程序,首先我们要承认程序确实出现了问题,不要自认为自己代码写的没问题,觉得是编译软件或者其它方面有问题,不可能是自己的程序的问题,各位道友千万不要有这个想法,这个想法是很危险的,承认程序出了问题之后,就要通过各种手段去定位问题的位置,然后一步一步去对代码进行检查,逐步缩小范围,最终找到问题所在,然后把它进行先修复,再对代码进行重新测试。

        打个比方,调试的过程就好比医生给我们做B超的过程,我们身体不舒服了,去医院检查,这时候你就要告诉医生你哪里不舒服,比如说肚子不舒服,然后医生就会给你腹部做一个B超,就好比我们在调试代码的时候,大概心里有个数,是哪一块的代码有问题,就去对那个代码块进行调试,不要对所有的代码去调试,那样的话效率是非常低的,那我们调试代码也就相当于在给程序做一个B超对吧。

3)debug和release

        在VS上编写代码的时候,就能看到有debug和release两个选项:

        debug通常被称为调试版本,它包含调试信息,并且不做任何优化,便于程序员调试程序,也就是说程序员在写代码的时候,需要经常性的调试代码,就将这里设置为debug,这样编译产生的是debug版本的可执行程序,因为它是包含调试信息的,所以是可以直接调试的。

        release称为发布版本,它往往进行了各种优化,使得程序在大小和运行速度上都是最优的,以便用户更好的去使用,当程序员写完代码,对程序要进行测试,直到程序的质量符合交付给用户的使用标准,这个时候就会设置为release版本,编译产生的就是release版本的可执行程序,这个版本是用户使用的,所以它是不包含调试信息的,是无法对其进行调试的。

        这是我写的一段程序,分别在debug环境和release环境下进行编译产生的两个版本,发现release版本明显小于debug版本,这样就导致它在这个大小和运行速度上是明显优与debug版本的,主要原因就是release版本是不包含调试信息的。

4)VS常用调试快捷键

  • F9:创建断点和取消断点

        断点的作用是可以在程序的任意位置设置断点,打上断点就可以使得程序执行到想要的位置之后然后暂停执行,接下来就可以使用F10,F11这些快捷键,观察代码的执行细节

  • F5:启动调试,经常用来直接跳到下一个断点处,一般和F9配合使用
  • F10:逐过程,通常用来处理一个过程,一个过程可以是一次函数调用,或者是一条语句
  • F11:逐语句,就是每次都执行一条语句,但是它可以是我们的执行逻辑进入到函数内部,在函数调用的地方想要进入函数观察细节,必须使用F11,如果使用F10,就直接完成这个函数调用了,不会进入到函数内部去
  • CTRL+F5:开始执行不调试,如果你想让程序直接运行起来而不调试就可以直接使用

        上面这些是我们调试过程中经常使用的一些快捷键,当然还有很多快捷键,不是很常用,那么我们可以让opencode来列举一些:

5)监视和内存观察

  • 监视

        在调试的过程中,如果要观察代码中的变量的值,就需要监视(这些观察的前提是代码开始调试之后,不然是找不到监视窗口的)

        就可以通过监视窗口观察一些变量的值,按F10一步一步观察变量值的改变,如果需要进入到函数内部观察,就需要按F11

  • 内存

        如果监视窗口看的不够仔细,就可以在内存窗口观察变量在内存中的存储情况:

        在打开内存窗口之后,在地址栏输入arr,&i等想要观察的内容的地址,就可以观察到该地址中存储的数据信息了。

        当然在调试的窗口除了监视和内存,还有自动窗口,局部变量,反汇编,寄存器等等,我们可以让opencode来简单介绍一下它们的功能:

6)调试举例

  • 举例1:在VS2026、x86、Debug 的环境下,编译器不做优化的情况下,这段代码的打印结果是什么?

        发现它死循环打印hehhe了,我第一次看到这个代码肯定会认为这里数组越界访问了,代码肯定会报错,在X64环境下确实如此,那么为什么在X86环境下非但没有报错反而还使得程序陷入了死循环,但通过调试,我也找到了问题的所在,通过画图来带大家分析一下:

        下面我们再来看一下调试结果:

        这样通过调试,我们也就可以发现程序中潜在的问题,这个代码其实就是简单带大家体验一下调试的,正常写代码,是不会写出数组越界访问的情况,把for循环中的 i<=12 改为 i<10 就可以了,这段代码就是简单用来调试举例的一个案例,希望各位道友也看懂了哈

7)编程常见的错误归类

  • 编译型错误

        编译型错误一般都是语法错误,这类错误一般看到错误信息就大概已经知道问题在哪了,编译错误,随着语言的熟练掌握,会越来越少,很容易解决,比如:

  • 链接型错误

        看到该错误信息,主要在代码报错里找到错误信息中的标识符,然后定位问题所在,一般是因为拼写错误、头文件没有包含、引用的库不存在、标识符名不存在等等,比如:

  • 运行时错误

        这个错误其实是最头疼的,程序编译不会报错,它是在运行的时候才会出错,这种错误是千变万化的,就需要借助调试,逐步定位问题,调试其实就是用来解决程序在运行时出现的问题。

        当然肯定不止这几种错误类型,还有很多,但是后面的内容我还没有讲到,之后讲到了就再说哈。

2.总结

        关于调试的内容我就介绍到这里了哈,主要的还是各位道友要去自己体验调试的过程,然后来掌握调试这个技能,这样在程序出错的时候,也不会慌乱,其实在学习一门语言的时候,我认为还是要多去练习,才能更好的掌握,就好比我们学习普通话,很多人方言味比较重,普通话不标准,那你就得多去说普通话,不断地说,才能说好普通话对吧,然后更好的和他人交流,不然你说方言我听不懂,就是无效交流,那么编程也是,一定要去多练习代码,规范化编程,不要你写的代码连计算机都看不懂,那就没有意义了,同时不断地积累自己的代码量,这样才能更快的提高自己的编程能力,当然不要盲目练习,可以让AI来辅助我们进行练习,一定要学会用好身边的资源。那么我们就下篇文章再见了哈!!!

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐