9 VS的调试小技巧

目录

一、什么是bug?

二、什么是调试?

三、Debug 和 Release

四、VS调试快捷键

(一)F9:创建断点和取消断点

(二)F5:启动调试

(三)F10:逐过程

(四)F11:逐语句

(五)CTRL + F5:开始执行

(六)一些注意点

五、监视和内存观察

(一)监视

(二)内存

(三)其他窗口

六、调试的实践

七、编程常见错误归类

(一)编译型错误

(二)链接型错误

(三)运行时错误


一、什么是bug?

        bug本意是“昆虫”或“虫子”,现在一般是指在电脑系统或程序中,隐藏着的一些未被发现的缺陷或问题,简称程序漏洞

二、什么是调试?

        调试是当程序已经存在问题的时候,去找问题的过程;调试是一个动作

三、Debug 和 Release

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

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

        对比可以看【到从同一段代码中编译生成的可执行文件的大小】,Release版本明显要小,而Debug版本明显大

四、VS调试快捷键

(一)F9:创建断点和取消断点

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

        注:

                条件断点:满足这个条件,才触发断点

                在循环中可以对断点【右键】→【条件设置循环条件】

(二)F5:启动调试

        经常用来直接跳到下一个断点处,一般是和F9配合使用

        注:

                F5是让程序执行到【运行逻辑】的下一个断点,并不是【物理逻辑】的下一个断点

(三)F10:逐过程

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

        注:

                F10调试会有一行行地跳过,如果一行是函数,不会进入看函数的细节,直接完成调用;

                需要按下F10才能进入单步执行模式,在单步执行模式下,调试器会逐行执行代码,并在监视窗口中显示变量的值、表达式的结果等信息;简单来说,【按下F10开始调试代码】


(四)F11:逐语句

        每次都执行一条语句,但是这个快捷键可以使我们的执行逻辑进入函数内部;

        注:

                F11调试是每一条代码都查看,在函数调用的地方,想进入函数观察细节,必须使用F11;

                如果使用F10,直接完成函数调用,调试下一条语句


(五)CTRL + F5:开始执行

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

        注:

                Ctrl + F5 是运行程序,和断点无关;
                直接 F5 是开始调试,跳到下一个断点处

(六)一些注意点

        【F9和F5组合】是快速到达想要查看的地方;

        【F10和F11组合】是细致的观察

五、监视和内存观察

(一)监视

        开始调试后,在菜单栏中【调试】->【窗口】->【监视】,打开任意一个监视窗口,输入想要观察的对象就行
 

        注:

                调试箭头指到的语句是没有执行的;

                函数传参传的是数组时,想要在监视中观察函数中的数组,要在监视窗口中输入【数组名,元素个数】才可以监视到;

                在调试窗口中,只要给一个合法的表达式,都可以得到运行结果:

(二)内存

        如果监视窗口看的不够仔细,也是可以观察变量在内存中的存储情况,还是在【调试】->【窗口】->【内存】

        在内存窗口中观察数据:

         内存中数据的16进制的展示的理解:

        ① 由于使用2进制展示数字会太长,故电脑用16进制展示;

        ② 1个16进制位对应4个2进制位,8个2进制位等于1个字节;所以展示4列时,两两16进制位等于1个字节,4列就4个字节,大小等于整型 int 的内存大小(1个2进制位等于1个比特位);

        ③ 每个字节都有自己的地址:

(三)其他窗口

        自动窗口:编译器自动给你观察变量,会随着程序的进行变量自动出现和消失,使用起来不方便;

        局部变量窗口也类似,此外还有反汇编窗口,寄存器窗口等

六、调试的实践

        在【vs2022;x86;Debug】的环境下调试以下代码:

#include <stdio.h>

int main()
{
    int i = 0;
    int arr[10] = {1,2,3,4,5,6,7,8,9,10};
    for(i=0; i<=12; i++)
    {
        arr[i] = 0;
        printf("hehe\n");
    }

    return 0;
}

        代码运行时发现时死循环,调试时使用内存窗口发现 i 的地址和 arr[12]的地址一样,内存布局如下:

        栈区上的内存使用习惯是:先使用高地址,再使用低地址 → 先 i ,后 arr

        另外,数组随着下标的增长,地址是由低到高变化的 → arr[0] 在下面,arr[9] 在上面

        疑问:为什么 i 和 arr 数组之间恰好空出来2个整型的空间

        答:纯属巧合,在 i 和 arr 中间空出大空间,完全取决于编译器的实现,比如在vc6.0中,这个代码的 i 和 arr 之间没有空隙;gcc中空一个 int 位

        注:

                栈区的默认的使用习惯是先使用高地址,再使用低地址的空间,但是这个具体还是要编译器的实现,比如:在VS上切换到X64,这个使用的顺序就是相反的,在Release版本的程序中,这个使用的顺序也是相反的
 

七、编程常见错误归类

(一)编译型错误

        写代码时的语法错误
 

(二)链接型错误

        错误提示:无法解析的xxx;

        原因是用了xxx,但是xxx不存在

(三)运行时错误

        能正常运行,但结果错误,需要靠调试处理


       

         以上博客仅供分享,若有错误,请多多指正,共同进步

  • 26
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值