相信用过 Visual Studio 来编程的人都有过调试程序的经历, F5, F10, F11, F9 ,调的云里雾里最后发现是一个地方的判断条件写错了。如果想快速得进入一段程序并看看这段程序是如何执行,我相信在程序里打一个断点然后把程序阻挡在断点处然后逐步执行代码是比
相信用过Visual Studio来编程的人都有过调试程序的经历,F5, F10, F11, F9,调的云里雾里最后发现是一个地方的判断条件写错了。如果想快速得进入一段程序并看看这段程序是如何执行,我相信在程序里打一个断点然后把程序阻挡在断点处然后逐步执行代码是比较好的方法。但是有时候单纯的断点可能不能满足你的调试要求,这个时候就可以使用Visual Studio提供的“高级断点”。我下面将对Visual Studio中的几种断点进行简单的介绍,将我对着几种断点的认识与大家分享一下。
如图中所示,Visual Studio 中的断点有位置、条件、命中次数、筛选器、命中条件这五个选项可供用户进行设置,通过这几种的设置基本上能够晚上用户比较复杂的调试要求。
我将使用一段很简单的代码来对这几种选项进行说明,代码如下(请不要笑):
for (int i = 0; i < 100; i++ )
{
;
}
1. 位置设置
这个其实就是设置断点打在哪一个文件的第几行的第几个字符,基本上可以通过直接在编辑器中使用F9来实现这个功能。
2. 条件断点
在条件中输入你需要判断的条件,如i == 50,这样子每次程序执行到这个断点时就会进行判断这个条件,然后根据你下面的选项来中断程序。“为true”表示当这个表达式判断为“true“时则中断;“已更改”则当这个表达式判断结果改变时中断,如原来这个条件判断结果为true现在变成了false那么它就会中断。
在这个程序中将条件设为 i == 50,下面选择“为true”,那么当i等于50时会中断。如果选择“已更改”,那么当i等于50和51时会中断。
3. 命中次数断点
选择命中次数的条件,并在右边的空格里填入对应的参数。比方说我上面的那段SB程序需要循环100次,我需要在第五十次的时候中断,那么就可以通过这个来设置了。
4. 筛选器
当你只需要在某一个指定的进程或者线程或者计算机上才中断的话就可以用这个筛选器的选项,大家看看上面的说明应该就明白了。
5. 命中条件
这个中文名字比较抽象,不能够看出来这个是干嘛用的。从它的英文名字(When Hit)中就能够很直观的看出来,这个的功能是当这个断点被中断时做的一些事情。有时候可能只是想看一下这里的变量的值的变化,但是不想中断程序的运行,那么这个时候就可以用这个来将需要监视的变量记录下来查看。监视断点的使用方法如下:
1. 首先设置一个普通的断点;
2. 根据自己的条件设置断点的中断条件;
3. 右击断点,选择命中条件;
4. 出现如下窗口
将打印消息选上,在文本框中输入需要输出的消息,你要输出的变量需要用“{ }”包含起来,其余你输入的文本都会被原封不动的被输出。不过有两个特例,一个就是以$开头的几个关键字将会被替换,如$ADDRESS, $CALLER, $CALLSTACK, $FUNCITON等;另一个是”\{” 和 “\\”将会被转义成”{”和”\”。
上面那个监视断点的效果如下,你可以在Visual Studio中的输出窗口中看到你输出的结果。
除了输出一些信息帮助开发人员了解变量的情况以外,命中条件还允许在断点的时候运行宏。系统本来就提供了一些宏可以给用户来进行选择,用户还可以自定义一个宏来进行一些需要的操作。这样就可以在不改变代码的情况下实现一些逻辑上的变化,来看看是不是正确,如果正确再写到代码中去。
比方说,上面的循环会循环100次,但是我需要跳过51~90,直接需要从91开始执行。这个时候就可以先设置一个条件断点,写上“i == 50”,然后编写一个宏利用命中条件来对变量自动的进行改变。
宏如:
Imports System
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports System.Diagnostics
Public Module Module1
Sub ChangeValue()
DTE.Debugger.ExecuteStatement("i = 91;") '执行这行代码
End Sub
End Module
执行的结果如图所示,已经成功的跳过51~90这个阶段,跳到了91继续执行。
(这段需要感谢donjuan的博文)
使用好断点能够更好更有效率的调试程序。