断点,是Debug过程中最常用的功能。
关于断点VS还有很多高级功能,本文使用的是VS2017,介绍函数断点与数据断点的使用场景以及使用方法。
1.普通断点
普通断点是最常接触的断点,VS中,在代码行左边栏灰色区域点击,或者把光标放在某代码行按下F9即可设置断点。
这种断点,其实更多可能是设置在某个语句上,可以执行这句语句前所有代码,运行到改行停止且未执行该行代码。进入调试后,还可以选择逐语句(快捷键F10),逐过程(快捷键F11)调试。
停滞在语句上,意味着要对某行语句有特殊的观察目的或是明确此语句可能是bug出现的地方,才能够明确的把断点设置在此断点上,但这种调试的方法效率十分低下,对于每个语句都需要有把握才行。
以下断点只有进入调试后才能进行设置:调试->新建断点->函数断点或数据断点
2.函数断点
使用方法
顾名思义,函数断点,按下快捷键Ctrl+B可以进入窗口,输入想要调试的函数名,当点击确定后调试,则每次调试遇到进入函数时,都会击中断点。
要注意的是,断点仍然只能得到在该函数运行前的全局变量以及参数值。
另外,可以看到函数名下有条件断点,有三种类型的条件断点。其中
条件表达式断点
,此条件断点可以设置运行函数前存在的所有变量条件作为约束,当满足此条件时停止。
除此外,还有满足命中次数断点以及筛选器断点(多线程使用)。
命中次数
:比如你怀疑程序出错点发生在 N 次循环之后或者某些次循环,那么可以设置循环语句内的命中次数,让它在某些次或者某次循环停下来,而不是每次都停下来。
筛选器
:
筛选器是用来限制断点命中时所在的设备、进程和线程。比如,在一个多线程的程序中,你不必手动 GetThreadId,可以通过筛选器,设置让它只在某线程中执行到此处时停下来。
应用场景
我们在断点的窗口可以看到所设置的断点,另外还可以看到当前函数的数值。
- 当函数传入参数错误,可以设置函数断点,以参数正确的否命题作为条件,则可以进入参数状态错误的时候进行调试,打印所需要数据信息,追溯错误发生的源头。
- 查看某函数的作用以及测试某函数的正确性时,可以设置函数断点查看数据变化情况。
3.数据断点
使用方法
数据断点的意义,是让程序在某处地址指定字节发生改变的时候中断下来。数据断点同样有条件断点选项。
使用的话,可以用
&参数名
的方式,也可以调试时,监视所需参数,加&查看当前变量的地址,然后在该栏下输入地址。
应用场景
用于检测任意变量,包括类中或者结构体中某个成员变量的值发生了变化,如果此时设置了数据断点,只要该变量的值发生了变化就会触发数据断点,导致程序中断。用于Debug时,查找莫名其妙改变值的变量,用于锁定隐藏bug,以及通过堆栈信息梳理逻辑漏洞。
本文参考:
VS教程之断点
文章里面还有用调用堆栈以及反汇编的方法设置代码。