工欲善其事,必先厉其器,要想做好软件开发,掌握好的调试工具和技巧是很必要的!在看书的过程中发现了一些我以前不知道的VS.NET有用的调试功能(可能很多人都已经知道这些功能了,如果谁有相关的使用经验希望能够分享),这里做个很简单的介绍:
一、断点设置(Breakpoints)
我们平时使用断点的功能一般就是在某行代码的前面的灰色区域单击一下鼠标,或者按F9,从而给那行设置了断点,然后在调试程序的时候就等着在断点处中断。但是有没有遇到过这样的情况,就是:假如你在某个循环语句for(int i = 0; i < count; i++)里,你希望当循环计数器i达到某个值的时候你再中断,而不是从0开始每次都中断,因为很有可能这个循环的count很大,或者你希望中断的那个i值很大;还有就是有时你希望某个表达式达到某个条件的时候你再中断那个断点,这样可以很明确地捕获调试问题的所在。
那么其实上面的功能在VS.NET中已经提供了,而且相当灵活,我可以设置或修改断点的属性。在进行断点设置前,首先需要调出断点属性对话框,你可以选菜单"Debug->New Breakpoint...",或者按下Ctrl+B,就弹出了断点设置框:
如果是要对已经存在的breakpoint进行设置可以选菜单"Debug->Windows->Breakpoints"或Ctrl+Alt+B来打开Breakpoints窗体:
选中你要修改的breakpoint,然后单击右上的带有小手的按钮或者是从右键菜单中选择properties,就会弹出上面的断点设置对话框了。
断点设置框上面的几个标签分别允许你通过不同的方式设置断点,前面三个标签没有什么好说的分别是:
Function:允许你从函数的位置来定义断点;File:可以指定在源文件的某个地方定义断点,Address:可以通过内存中的代码地址来设置断点;
关于第四个标签Data我有点疑惑(还请高手指教一下):
据说它可以监视某个变量的值,甚至可以是数组或指针某个偏移处的值(通过Items设置内部偏移),一旦这个变量的值发生了改变就中断这个断点。这个功能看似十分强大,但是我自己试了一下,发现C#和CLR不支持这种功能的断点
![hitwall.gif](/Emoticons/hitwall.gif)
强行选择Language为C++,也会报错:
算了,对这个原本很有诱惑力的功能只能死心了:)
下面来看断点中断条件的设置,
点击断点设置框下面的Condition...按钮就会出现下面的对话框:
这里你指定当某个表达式或变量达到为真或值发生改变的时候才中断这个断点。(其实这里的变量值改变作为中断条件与上面的变量监测功能是不一样的)
点击断点设置框下面的HitCount...按钮就可以针对断点被触发的次数来设置中断条件:
有四种条件设置:
1,始终中断(也就是默认的断点设置);2,当触发次数等于某个数值的时候中断;3,当触发次数是某个数值的整数倍的时候中断;4,当触发次数大于或等于某个数值的时候中断。
利用这个特性对于大循环里某个语句的中断调试会很有用
![emsmile.gif](/Emoticons/emsmile.gif)
二、监视(Watches)
关于监视的功能主要是由几个窗体组成,这些功能大家都很熟悉了不用多讲,分别是:
Autos,程序最后访问的变量的内容;Locals,堆栈中当前函数作用域内的局部变量的内容;This,当前实例对象的内容;CallStack,当前程序调用堆栈的情况;Treads,可以提供当前应用程序的所有线程的情况。还有就是Watch和Memory窗体,VS.NET 2003同时支持4个Watches窗体和4个Memory窗体,允许你同时查看多个变量或多片内存区域的情况,尤其是Watches窗体对我们监视变量的内容很有作用,支持拖拉操作,可以在调试的时候直接把代码的变量字符串拖到watch窗体中显示。
上边所有的监视相关的窗体只有在调试的时候才可以出现,通过"Debug->Windows"菜单可以找到所有的窗体。
另外还有一些调试相关的窗体有:Modules,Disassembly,Register,Running Documents。其中Running Documents不知道是做什么用的?希望知道的高手请高知,多谢了!
三、异常捕获(Exceptions)
关于程序中抛出的异常,VS.NET也可以很灵活的捕获,以往我以为只有程序没有捕获(也就是没有写相关处理程序)的异常才可以最终被调试器捕获,其实VS.NET允许你灵活地捕获各种异常并进行调试。通过"Debug->Exceptions",或按Ctrl+Alt+E可以打开下面的异常捕获对话框:
在这里你可以看到VS.NET的调试器在运行时能够识别出所有的异常,不仅包括CLR的异常,还可以是C++异常,Native的异常和Win32的异常。展开这四个异常的根节点,你可以看到所有代表各种异常的子类:
上面默认列出的都是.net framework中的异常,当然你也可以添加自己代码中定义的异常,单击右边的Add按钮,
在文本框中输入异常类的全名称就可以了。
当你选种了某个异常之后,就可以指定调试器对这个异常采取的动作了:
有两种情况分别是:当异常抛出时,也就是throw语句的地方;还有就是当最终抛出的、应用程序没有做处理的异常。
针对这这两种情况的异常都可以采取三种动作:中断并进入调试器;忽略异常继续执行代码;使用父节点(基类异常)的设置。
按照默认设置,以前只要是程序中catch了的异常,调试器是不会捕获的,现在通过上面对话框中的设置,可以很方便地捕获并调试个中异常了
![emsmile.gif](/Emoticons/emsmile.gif)
另外在Debug菜单下还有好多关于调试的功能,本人没有看过,也就不多说了。
好了,关于VS.NET中调试功能我就简单的说这么多,其中说不定也有我理解错误的地方,请大家指正。并希望大家能够分享你们自己调试的经验技巧,大家互相学习,共同进步!:)