下面有从浅入深的6个问题,您可以尝试回答一下
- 一个如下的语句for (int i = 0; i < 10; i++){if (i == 5)j = 5;},什么都写在一行,你怎么在j=5前面插入断点
- 在一个1000次的循环体内部设置断点,你希望当循环进行到900次后中断,怎么才能做到呢?
- 你有一个表达式在上面循环的某一次发生了变化,你想知道是哪一次,在哪个地方,怎么才能做到?
- 你希望你的断点在被命中100次后,每命中三次中断一次,比如第103,第106,第109怎样做?
- 你有在调试一个服务程序,希望在其内部打上了断点,可是,由于这是一个公用的服务你不希望其他访问这个服务的程序被你的调试所干扰,你想怎么办?
- 怎样知道2个断点中断的时间间隔
问题1,2
这两个问题最简单,我在一个例子里说明
例如如下循环
for(int i=0;i<1000;i++){doSomeThing......}
在循环的大括号上单击右键,插入断点,用这个方法,可以对付那些喜欢把语句写在一行上的家伙,其实,随着.Net3.5中Linq的出现,我们肯定也会经常在在一行上写复杂的表达式,这个时候用这种插入方法会比较管用
ok,现在我们来编辑这个断点的条件,在断点上右键单击,选择如图菜单项

在弹出的窗口中可以设置断点命中的条件i==900

注意我是在调试C#代码,默认的条件语句语法是C#,如果你想切换,那就需要用Ctrl-B,来插入断点,并在弹出窗口中选择语言

通过这样设置条件断点,我们就可以解决我们的问题1,2了
问题3
同样通过设置条件断点我们还可以解决我们的问题3,对表达式变化的跟踪
string user="yizhu2000"
for(int i=0;i<10000;i++){
DoSomething1()
.......
DoSomethingN()
}
当循环执行完毕时我们发现user变成了"smart_boy",你不知道这个值是在第几次循环的时候变化的,那么你是不是会选择打上断点,一次一次中断,来查看呢?当然不用
在循环体结束的位置我们设置一个断点,打开条件编辑窗口(打开方法同上),设置表达式为user,勾选下面的HasChanged,也就是说,你告诉断点,当user的值发生变化时才触发

(注意:第一次执行到断点的时候,程序一定会中断,并计算这时表达式的值,所以,所谓发生变化,指的是以后执行到断点是表达式的值和第一次执行到断点时表达式的值的比较)
问题4
如何让断点在指定的命中次数或者大于某个次数时触发呢?方法是设定几个断点的HitCount,右键单击断点,在弹出菜单中选择Hit Count,会弹出如下窗口

在"when the break point is hit"下拉列表里,我们可以看到四个选项
break always:总是中断
break when the hit count is equal to:等于某次数时中断
beak when the hit count is a multpile of:当次数是某数的倍数时中断
break when the hit count is greater than or equal to:当大于等于某数时中断
问题5
前面4个问题都已经解决了,第5个问题的解决方法是利用断点的Filter功能,比如我希望断点只有被机器名为yizhu的机器访问才能触发,我可以这样设置

当其他机器访问程序的时候,断点将不会触发,这样做的优点是通过设置机器名,我们可以让其他机器访问的时候感觉不到断点的存在,除此之外我们可以设置机器名,进程号,进程名,线程号,线程名作为filter,而且还可以把他们组合起来,比如我希望通过当机器yizhu的dllhost进程调用时才触发,那么问题就可以设置为MachineName="yizhu"&ProcessName="dllhost"
问题6
现在我们来解决第6个问题:
在程序性能调试的时候,我们经常需要知道某段代码的执行效率,一般来说,我们可以在程序中加入时间点,通过时间点相减来取得时间间隔,这种方法有个显而易见的缺点就是需要修改程序,想要不修改程序,就需要借助一些工具,那么有没有什么方法可以声明式的插入时间点,并计算值呢?其实断点完全可以做到
在给出方法前,我们来看看断点的另外一个设置项,When Hit,这个选项可以让我们在命中断点后做一些事情,包括输出一些内容,或者调用宏,比如输出一个程序中变量的值

我们输出了变量user的值,下面Continue Execution表示程序不会中断,输出后继续执行,注意表达式需要用{}括起来,,其他的部分会被作为字符串输出。设定WhenHit后断点变成了方形(看厌了圆断点,我还挺喜欢这个方家伙的)
在output中查看输出结果,如下:

既然可以计算表达式,我们的第一个最简方案就出来了,也就是在程序执行到断点的时候,输出DateTime.Now,这样当然是可行的,但是我们需要的是时间间隔,所以我们还需要自己来算个减法,还是挺麻烦的,怎么样才能让程序自己输出时间间隔呢?有一个想法是这样的,我们在上一个断点声明一个时间变量,然后在下面的断点里用DataTime.Now减去这个变量,即
断点一的条件:{DateTime _t=DateTime.Now;}
断点二的条件:{DateTime.Now-t;}
看起来不错,但是实际运行时就有问题了,让我们看看输出吧

上面高亮的部分说,变量申明只能在immediate window中进行,所以断点一的变量没有申明成功,关于immediatewindow,我们以后会涉猎到,反正就是说想在表达式里申明变量,没门,死路一条.那么我们怎么才能不申明变量又时间点呢?
这时我想起了Thread.SetData 方法,这个方法可以往当前线程专门提供的空间中插入一些数据,并且可以通过GetData得到数据,具体细节参考
http://msdn2.microsoft.com/zh-cn/library/system.threading.thread.setdata(VS.80).aspx
于是方案就有了,在第一个断点处把时间放入Thread的DataSlot,然后第二个断点取出来相减
断点一的条件:{Thread.SetData(Thread.GetNamedDataSlot("ExecutionTime"),DateTime.Now);}
断点二的条件:{DateTime.Now-(DateTime)System.Threading.Thread.GetData(System.Threading.Thread.GetNamedDataSlot("ExecutionTime"));}
看看输出效果

我们的目的已经达到了,output中成功的输出了时间间隔,当然,还不是很完善,首先,这个方法限于两个断点,你想多打几个断点,测试两两间的间隔还是比较麻烦.测量精度也可以提高,大家有兴趣可以自己研究这个方法的扩展
分享到:
相关推荐
通过这个《Visual Studio 2005培训课件》,开发者不仅可以学习到基本的编程知识,还能掌握项目管理、调试技巧和优化策略,从而提升开发能力,高效地利用Visual Studio 2005进行各种类型的应用开发。
《Visual Studio 2005 帮助文档》是一个为开发者提供全面支持的资源集合,它涵盖了关于Microsoft Visual Studio 2005的各种技术、工具、语言特性和开发过程的详细信息。这个帮助文档旨在协助程序员高效地利用Visual ...
- **调试项目**:使用Visual Studio内置的调试工具,可以在运行时检查变量值、设置断点等。 - **部署程序**:完成开发后,需要将程序部署到目标环境中,以便用户使用。 #### 四、创建标准C++程序 - **标准C++...
"Visual Studio 学习资料"这个标题表明这是一个关于学习Visual Studio的相关资源集合,适合初级阶段的学习者。在描述中,强调了这份资料的价值,适合好学之人下载和学习。 以下是一些主要的知识点: 1. **Visual ...
《Professional Visual Studio 2008》是一本由Nick Randolph和David Gardner共同编写的书籍,旨在帮助程序员深入掌握Visual Studio 2008这款集成开发环境(IDE)的各种功能和技巧。本书面向希望熟悉Visual Studio...
《Visual Studio .NET 使用技巧手册》是一本涵盖了各种版本Visual Studio .NET的实用技巧集合,旨在帮助开发者提高工作效率,优化编程体验。以下是一些关键知识点的详细解释: 1. **集成开发环境(IDE)定制**:...
《跟我一起学Visual Studio 2005(1):C#语法篇(上)》是一本面向初学者的教程,旨在帮助读者掌握C#编程语言的基础知识,并结合Visual Studio 2005这一强大的开发环境进行实践。C#是微软公司推出的一种面向对象的编程...
Visual Studio .NET 2003是微软的一个集成开发环境(IDE),它为VB.NET提供了强大的开发工具支持。本资料集包含了VB.NET编程的各种技巧和实例源代码,是学习和提升VB.NET编程能力的重要资源。 首先,VB.NET引入了...
文件"WebCast20070601_Video.wmv"可能是本次课程的视频教程,它会深入演示上述概念的实际应用,包括控件的使用、事件处理和数据绑定等,通过实例帮助学习者更好地理解和掌握Visual Studio 2005中的Windows编程技巧。...
### Visual Studio C# 调试入门及进阶技巧详解 #### 一、引言 在软件开发过程中,错误和异常处理是不可避免的部分。对于初学者来说,掌握有效的调试技术至关重要,这不仅能帮助他们更快地定位问题所在,还能提高...
- **调试技巧**: Visual Studio 2010 提供了强大的调试功能,例如断点设置、变量查看、调用堆栈分析等,这些都是提高代码质量和开发效率的重要手段。 **2.2 新特性与更新** - **STL 改进**: Visual C++ 2010 对...
标题中的“基于Visual Studio 2013解决C语言竞赛题之比赛安排”指的是使用Microsoft的Visual Studio 2013开发环境来编写C语言程序,解决特定的竞赛题目。这个题目是关于乒乓球比赛的赛程安排问题,涉及到逻辑推理和...
- 调试技巧:了解Visual Studio的调试工具,包括断点、步进执行、查看变量状态等。 7. **程序集与命名空间** - 程序集:理解程序集作为.NET Framework的基本单元,以及元数据的作用。 - 命名空间:学习如何组织...
名为“Visual C++ 6.0 编程高手”的`.chm`文件很可能是一个详尽的指南,涵盖了从基本概念到高级技巧的各个方面,帮助读者提升在C++编程和Visual Studio 6.0环境中的技能。 在Visual C++ 6.0中,主要知识点包括: 1...
《零基础学Visual C# 2005 电子教程》是一份专为初学者设计的编程学习资源,旨在帮助没有编程经验的人快速掌握Visual C# 2005的基本概念和技能。C#(发音为"C sharp")是微软公司开发的一种面向对象的编程语言,...
《并行编程与Microsoft Visual Studio 2010:逐步指南》是一本深入探讨如何使用Microsoft Visual Studio 2010进行并行编程的书籍。本书由Donis Marshall撰写,并得到了微软公司的授权出版。该书旨在帮助开发者了解...
10. **改进的调试工具**:Visual Studio 2005的调试器提供了更多功能,如断点条件、数据观察窗口和内存查看器,帮助开发者更快地定位和解决问题。 本课程包含的资源,如PPT、视频和文档,将详细展示这些特性和技巧...
- **调试技巧**:教授如何使用Visual Studio的调试工具来查找和修复代码中的错误,例如查看调用堆栈、设置断点等功能。 - **项目管理**:讲解如何管理项目文件、设置项目属性等,以便更好地组织代码结构。 - **高级...
12. **调试技巧**:学习使用Visual Studio的调试工具,如断点、步进执行、查看变量值等,以找出并修复程序中的错误。 通过这个教程,你不仅可以学到C#编程的基础知识,还能熟悉Visual Studio 2005的开发环境,从而...
《Visual C# 2005开发技术》这本书主要涵盖了微软.NET Framework 2.0环境下的C#编程语言和Visual Studio 2005 IDE的使用。C#是一种面向对象的编程语言,由微软公司推出,它在设计时充分考虑了现代软件开发的需求,...