Visual Studiohttps://visualstudio.microsoft.com/zh-hans/vs/
目录
1、什么是调试?
2、debug和release
3、调试
3.1、环境
3.2、 快捷键
3.2.1、F10和F11
3.2.2、ctrl+F5
3.2.3、F5与F9
3.2.3.1、条件断点
3.3、监视和内存观察
3.3.1、监视
3.3.2、内存
1、什么是调试?
当我们发现程序中存在的问题的时候,那下⼀步就是找到问题,并修复问题。 这个找问题的过程叫称为调试,英⽂叫debug(消灭bug)的意思。
调试⼀个程序,⾸先是承认出现了问题,然后通过各种⼿段去定位问题的位置,可能是逐过程的调 试,也可能是隔离和屏蔽代码的⽅式,找到问题所的位置,然后确定错误产⽣的原因,再修复代码, 重新测试。
2、debug和release
- Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序; 程序员在写代码的时候,需要经常性的调试代码,就将这⾥设置为debug,这样编译产⽣的是debug 版本的可执⾏程序,其中包含调试信息,是可以直接调试的。
- Release 称为发布版本,它往往是进⾏了各种优化,使得程序在代码⼤⼩和运⾏速度上都是最优的, 以便⽤⼾很好地使⽤。当程序员写完代码,测试再对程序进⾏测试,直到程序员的质量符合交付给⽤ ⼾使⽤的标准,这个时候就会设置为release,编译产⽣的就是release版本的可执⾏程序,这个版本是 ⽤⼾使⽤的,⽆需包含调试信息等。
简单来说,Debug版本是程序员使用的版本,进行调试和修复,而Release版本是当程序员写完代码,并且代码符合质量标准后,进行上交的版本,也就是最后用户使用的版本,同时Release版本是无法进行调试和修改的。
且二者的最大不同之处就在于存储在电脑磁盘中的内存空间并不一致,Release存储的更小,而Debug存储的更大。
3、调试
3.1、环境
调试的环境,在调试代码之前,必须先进行环境的改变,也就是先将编译器的变为debug的版本环境,而X86和X64环境并无大碍。
3.2、 快捷键
VS中常用的快捷键:http://t.csdn.cn/Gjfmi
3.2.1、F10和F11
介绍:
- F10:逐过程,通常⽤来处理⼀个过程,⼀个过程可以是⼀次函数调⽤,或者是⼀条语句。
- F11:逐语句,就是每次都执⾏⼀条语句,但是这个快捷键可以使我们的执⾏逻辑进⼊函数内部。
区别:
如以上代码:
- 若使用F10进行调试,根据F10的调试原理,在调试到调用函数test()时,F10会直接越过,并得出结果,随后立即跳往下一个语句,for()
- 而,若使用F11进行调试,根据F11的调试原理,在调试到调用函数test()时,F11会进入test中,通过调用函数,抵达void test()并开始调试里面的每一个语句,待调试完里面的所有语句后,在跳回原来的test()之后的语句。
结论:在函数调⽤的地⽅,想进⼊函数观察细节,必须使⽤F11,如果使⽤F10,直接完成函数调⽤。
3.2.2、ctrl+F5
ctrl+F5 开始执⾏不调试,如果你想让程序直接运⾏起来⽽不调试就可以直接使⽤。
3.2.3、F5与F9
介绍:
- F5:启动调试,经常⽤来直接跳到下⼀个断点处,⼀般是 和F9配合使⽤。
- F9:创建断点和取消断点 断点的作⽤是可以在程序的任意位置设置断点,打上断点就可以使得程序执行到想要的位置暂定执 ⾏,接下来我们就可以使⽤F10,F11这些快捷键,观察代码的执行细节。
注意:
F5在没有配合F9的使用时,就和Ctrl+F5毫无区别(最新的VS2020版本),甚至是一闪而过。
作用:
F9的是用于在有可能出现问题的地方使用,配合F5,可以使调试变得更加的简便和轻松。
譬如:
如以上代码:
在得知错误点在for语句时
- 若在for循环开始的那一行中摁下F9,设置断点,而后在摁下F5,那么在for之前的代码语句将会快速进行调试,随后抵达F9的所在位置。
- 而若没有使用该功能,我们想要查询for语句中的错误,只能使用F10或者F11进行逐行的代码调试,效率极其低下。
3.2.3.1、条件断点
条件断点:满⾜这个条件,才触发断点
在进行条件断点之前,我们先了解一下断点。
如以上代码,有两个断点,分别是第18行和第23行。
那么在18行的断点结束后,摁下F5,跳往的是第23行的断点,还是?
答案并不是第23行的断点,而是下一处循环的断点。
for语句,是一个循环语句,在循环未结束之前,是不会停下,而设在for语句循环体内的断点也是如此,当一次循环的断点结束后,摁下F5飞往的是下一次循环的断点,直到循环结束!
这也是断点的一个特点,断点是逻辑断点,并非物理表面上的物理断点!
条件断点:
如以上代码,有这样一个疑问,如果我知道了某一次循环会出错,但是我要知道那一次循环具体出错的原因,那么我该怎么办?应该是在循环语句中不断的使用F11进行内部循环的调试,调试到那一次循环位置,还是说?
于是乎,当我们遇到这类问题时,我们就可以将断点设置为条件断点进行调试。
条件断点的原理是只有满足改条件时,循环便会中断,且之前进行的循环过程会被快速调试。
如何设置:
摁F9设置断点——>右击断点——>选择“条件”——>设置条件——>回车
3.3、监视和内存观察
在调试的过程中我们,如果要观察代码执⾏过程中,上下⽂环境中的变量的值,有哪些⽅法呢?
3.3.1、监视
开始调试后,在菜单栏中【调试】->【窗⼝】->【监视】,打开任意⼀个监视窗⼝,输⼊想要观察的对 象就行。
打开监视窗口:
注意:只有在进行调试后(摁下F10),才能点击窗口右侧选项栏内的监视,否则会没有任何东西出现。
且,在监视栏中,输入的对象必须是合法对象,也就是在代码中合理的表达式或者变量,否则会没有任何东西出现。
3.3.2、内存
如果监视窗⼝看的不够仔细,也是可以观察变量在内存中的存储情况,还是在【调试】——>【窗⼝】——> 【内存】
打开内存窗口:
在内存窗⼝中观察数据:
第一行表示内存地址,第二行表示内存中的十六进制展示,第三行表示内存数据的解析。
在打开内存窗⼝后,要在地址栏输⼊:arr,&num,&c,这类地址,就能观察到该地址处的数据。