资源描述:
《vs2005调试技巧1_516603029》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、VisualStudio调试基础篇下面有从浅入深的6个问题,您可以尝试回答一下.1.一个如下的语句for(inti=0;i<10;i++){if(i==5)j=5;},什么都写在一行,你怎么在j=5前面插入断点.2.在一个1000次的循环体内部设置断点,你希望当循环进行到900次后中断,怎么才能做到呢?3. 你有一个表达式在上面循环的某一次发生了变化,你想知道是哪一次,在哪个地方,怎么才能做到?4.你希望你的断点在被命中100次后,每命中三次中断一次,比如第103,第106,第109怎样做?5.你有在调试一个服
2、务程序,希望在其内部打上了断点,可是,由于这是一个公用的服务你不希望其他访问这个服务的程序被你的调试所干扰,你想怎么办?6.怎样知道2个断点中断的时间间隔问题1,2这两个问题最简单,我在一个例子里说明例如如下循环for(inti=0;i<1000;i++){doSomeThing......}在循环的大括号上单击右键,插入断点,用这个方法,可以对付那些喜欢把语句写在一行上的家伙,其实,随着.Net3.5中Linq的出现,我们肯定也会经常在在一行上写复杂的表达式,这个时候用这种插入方法会比较管用ok,现在我们来编
3、辑这个断点的条件,在断点上右键单击,选择如图菜单项在弹出的窗口中可以设置断点命中的条件i==900注意我是在调试C#代码,默认的条件语句语法是C#,如果你想切换,那就需要用Ctrl-B,来插入断点,并在弹出窗口中选择语言通过这样设置条件断点,我们就可以解决我们的问题1,2了.问题3同样通过设置条件断点我们还可以解决我们的问题3,对表达式变化的跟踪stringuser="yizhu2000"for(inti=0;i<10000;i++){DoSomething1().......DoSomethingN()}当循
4、环执行完毕时我们发现user变成了"smart_boy",你不知道这个值是在第几次循环的时候变化的,那么你是不是会选择打上断点,一次一次中断,来查看呢?当然不用在循环体结束的位置我们设置一个断点,打开条件编辑窗口(打开方法同上),设置表达式为user,勾选下面的HasChanged,也就是说,你告诉断点,当user的值发生变化时才触发(注意:第一次执行到断点的时候,程序一定会中断,并计算这时表达式的值,所以,所谓发生变化,指的是以后执行到断点是表达式的值和第一次执行到断点时表达式的值的比较)问题4如何让断点在指
5、定的命中次数或者大于某个次数时触发呢?方法是设定几个断点的HitCount,右键单击断点,在弹出菜单中选择HitCount,会弹出如下窗口在"whenthebreakpointishit"下拉列表里,我们可以看到四个选项breakalways:总是中断breakwhenthehitcountisequalto:等于某次数时中断beakwhenthehitcountisamultpileof:当次数是某数的倍数时中断breakwhenthehitcountisgreaterthanorequalto:当大于等于某
6、数时中断问题5前面4个问题都已经解决了,第5个问题的解决方法是利用断点的Filter功能,比如我希望断点只有被机器名为yizhu的机器访问才能触发,我可以这样设置当其他机器访问程序的时候,断点将不会触发,这样做的优点是通过设置机器名,我们可以让其他机器访问的时候感觉不到断点的存在,除此之外我们可以设置机器名,进程号,进程名,线程号,线程名作为filter,而且还可以把他们组合起来,比如我希望通过当机器yizhu的dllhost进程调用时才触发,那么问题就可以设置为MachineName="yizhu"&Proc
7、essName="dllhost"问题6现在我们来解决第6个问题:在程序性能调试的时候,我们经常需要知道某段代码的执行效率,一般来说,我们可以在程序中加入时间点,通过时间点相减来取得时间间隔,这种方法有个显而易见的缺点就是需要修改程序,想要不修改程序,就需要借助一些工具,那么有没有什么方法可以声明式的插入时间点,并计算值呢?其实断点完全可以做到在给出方法前,我们来看看断点的另外一个设置项,WhenHit,这个选项可以让我们在命中断点后做一些事情,包括输出一些内容,或者调用宏,比如输出一个程序中变量的值我们输出了
8、变量user的值,下面ContinueExecution表示程序不会中断,输出后继续执行,注意表达式需要用{}括起来,,其他的部分会被作为字符串输出。设定WhenHit后断点变成了方形(看厌了圆断点,我还挺喜欢这个方家伙的)在output中查看输出结果,如下:面高亮的部分说,变量申明只能在immediatewindow中进行,所以断点一的变量没有申明成功,关于immediatewind