目录
前言:什么是IDE?
对程序开发来说,不管哪门语言开发都有很多可以选择的集成开发环境IDE(Integrated Development Environment),IDE是提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面等工具。集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套。开发者可以通过IDE提供的代码高亮,代码补全和提示,语法错误提示,函数追踪,断点调试等功能提高开发效率。
本文阐述的VS是windows环境下的IDE调试工具,Linux开发环境的调试工具是GDB,将在后续进行学习总结,毕竟我的现阶段工作就是嵌入式Linux应用开发,是一定要掌握Linux开发环境下的调试技能的。VS是一个很好用的工具,我经常用它除了挑战一些C编程题目外,也会用来模拟工作中遇见的一些小bug然后调试找处原因,或是写一个简单的程序实现某种算法然后用VS验证是否正确。
一、Debug和Release版本的.exe可执行文件
1.1 Debug和Release介绍

如上图所示在VS工具栏标记处可选择Debug或Release,它决定了开始执行程序(不调试即Ctrl +F5)生成的.exe可执行文件的性质。
Debug:调试版本,它包含调试信息,并且不做任何优化便于程序员调试程序。
Release:发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好的使用。
所谓调试就是在Debug版本的环境中找出代码的潜在问题,注意Release版本没有调试信息,那些单步调试、断点调试等操作一定是在Debug版本中进行的。
1.2 VS生成app修改图标方法
Release发布版本的.exe可执行文件就是一个app,我们可以在VS上写一个小游戏,然后编译生成Release版本的.exe文件,这就是一个app了,而且VS是有默认图标的。我曾经就写过一个恶搞程序,然后将默认图标修改成网上下载的一个图片,成功的整蛊了我的同事和同学,哈哈哈。具体方法如下:
首先如果在VS中新建了一个工程,那么工程目录下就会有个icon1.ico文件,这就是生成.exe文件的图标。在VS解决方案管理器目录中的资源文件也可以看到,如下图所示:

更改图标的方法就是将想要修改的图标替换掉默认的icon1.ico文件,注意名称不能变。当然我们在网上下载的.jpg或者.png格式的图片是不能直接拿来用的,要先将其转换为.ico格式再替换。下面网址亲测有效可以实现免费在线转换。
icon1.ico文件替换完成后就可以ctrl + F5生成期望图标的.exe文件了,文件在工程目录下的Release文件夹中。
二、VS调试环境介绍
无论是VS还是其他IDE调试环境,调试的过程和操作都是大同小异的。调试的前提都必须是在调试环境下编译生成可执行文件,例如windows下的VS需要在工具栏选择Debug模式才能生成带调试信息的可执行文件,而Linux下的GDB工具则必须在编译时加上“-g”选项,这样编译出来的可执行文件才带有调试信息。
2.1 VS快捷键
要学会高效率调试,必须能够熟练使用相关快捷键。下面是常用的调试快捷键:
F5:启动调试,经常用来直接跳到下一个断点处(如果没有断点则运行至程序结束)。
F9:创建断点和取消断点,可以在程序中任意位置设置断点,与F5配合使用。
F10:逐过程,通常用来处理一个过程,一个过程可以是一次函数调用,或者是一条语句。
F11:逐语句,即每次都执行一条语句,与F10在普通语句上没有区别,但是在函数调用时可以进入函数内部(不包括库函数),这是最常用的。
Ctrl + F5:开始执行不调试,直接运行不调试。
注意:在循环语句中设置断点F5不会跳过循环,而是进入下一次循环,如下图所示:

关于断点: 断点右键可选择禁用断点,还可设置条件,即只有当满足条件时调试器才中断程序的执行。条件断点一般适用于程序错误在循环中,当循环体执行了若干次后才出现;或是变量为某一个特定的值才出现错误;或是多个线程都要调用一个同一个函数而程序员只想在某几个线程执行这个函数时中断程序执行。例如下图设置在循环体中的断点条件为i==5:

F5程序运行至断点处,通过监测窗口监测i的值,可以发现程序中断处i的值就是5,如下图所示断点:

VS还有很多其他常用快捷键,例如注释选定内容和取消注释选定内容是Ctrl + Shift + /,VSCode是Ctrl + /,还有Tab缩进,Shift + Tab反向缩进等,此处不作赘述,需要时可网上查询。
2.2 调试时查看程序当前信息
注意调试时在窗口中查看程序当前信息的前提一定是程序开始运行起来,否则无从谈起,下图上边是程序没有运行起来的调试->窗口界面,下边是程序运行起来的调试->窗口界面,可以看出一定是调试开始后才能看到自动窗口、自动变量、监视、调用堆栈、内存等信息。

2.2.1 查看临时变量的值
调试->窗口->自动窗口/局部变量进入之后可以自动的帮我们监视变量的值,但会自动根据程序当前执行过程添加和删除变量,这就导致它会监测一些不需要的变量,还有随着程序运行监测的变量不断变化不利于固定监测某些变量,所以这两个窗口监测用的较少。用的最多的是调试->监视窗口,可输入任何想要监测的变量名,会一直持续存在直至程序结束。
tips:监视窗口输入数组名时下拉可以监测数组各个元素值,但当形参为数组形式时,输入形参数组名会发现监视的只有一个值,这是因为数组传参传的是首元素地址,形参虽为数组形式但本质上是数组首元素地址,这个时候如果想要监视形参数组多元素值,只需在数组名后添加逗号和想要监视的数组元素个数即可,示例如下图。

2.2.2 查看内存信息
调试->内存窗口可查看内存中的数据信息,需要手动输入变量地址(用取址符&),不是变量名。具体细节如下图:

一行显示列数可设置,这表示一行显示多少个字节,可以看到设置为4时内存地址行差为4;内存中的值显示的是单字节16进制格式。
2.2.3 查看调用堆栈
通过调试->调用堆栈,可以清晰的反应函数的调用关系以及当前调用所处的位置,如下图所示。右键勾选显示外部代码还可以查看main函数是如何被调用的。

2.2.4 查看汇编信息
调试->反汇编可查看代码反汇编信息,阅读反汇编信息可以追踪程序运行过程,需要了解汇编指令。反汇编信息如下图所示:

2.2.5 查看寄存器信息
在反汇编中可以看到寄存器临时存放变量的值,调试->寄存器窗口可查看寄存器值,还可以根据寄存器名在监视窗口中观察寄存器值,寄存器查看窗口如下图:

总结
发现bug不能靠胡乱猜测迷信式调试程序,一定要善于利用好调试工具精准分析bug产生原因并妥善解决,一个好的程序员就是一个推理大师。对快捷键的使用一定要熟练掌握,键盘上的F5、F9、F10、F11键不说磨损,也要油光锃亮,纸上得来终觉浅,多多调试才能做到“但手熟尔”!对待bug要做一个有心人,对bug产生的原因和现象要积极分析,日积月累形成经验。