Visual studio2010设计一个程序计算斐波那契数列 c

visual studio的调试技巧 - 技术斋
- 博客频道 - CSDN.NET
文章转自:
这是我写的关于VS2010和.Net4发布的博客系列的第26篇。
今天的博文包含了一些有用的能用于VS的调试技巧。 我的朋友(他写了很多很好的关于VS使用技巧和窍门的)最近向我强调了这些很好的技巧,大部分使用VS的开发人员好像不知道这些技巧(即使他们大部分都在产品开发组呆过一阵子)。 如果你还没有使用过这些技巧,希望这篇博文能帮你发现它们。 它们学起来很容易,能帮你节省很多时间。
运行到光标(Ctrl+ F10)
我经常看见人们是这样来调试应用程序的: 他们在应用程序需要调试的代码前设置一个断点,然后反复的敲F10/F11来逐步通过代码,直到到达他们真正想要研究的确切位置。有些时候他们需要仔细观察所跨过的每行代码,这样使用F10/F11 就很合理。 但是更普遍的是,他们只想快点进入他们真正关心的那行代码——这是使用F10/F11 就不是最好的选择了。
相反, 你可能想利用调试器支持的特性“运行到光标”。 只需简单地把你的光标放在代码中你想程序运行到的那一行,然后同时敲Ctrl+F10。这样程序就会运行到光标所在的那一行, 然后执行中止,由调试器控制——这样就节约了你反复敲击F10/F11到达那里的时间。即使你想运行到的那行代码不在当前调试的方法或类里,而是在一个独立的方法或类里,这也同样奏效。
我们经常在可用性学习中见到另一个普遍的技巧:开发人员设置断点,运行程序,试着输入一些数据,当到达一个断点时,手工检查某种条件是不是成立,如果成立才决定进一步研究。 如果条件不符合他们想要的, 按F5继续执行程序,尝试另外一些输入,再手工重复同样的过程。
VS的条件断点功能提供了一个更加容易的方法来处理以上情况。 条件断点允许你只在某种明确指定的条件成立时才中止执行,由调试器控制。这帮你免于手动检查/恢复你的程序, 使得整个调试过程免去许多手工活,也不那么冗长乏味。
设置一个条件断点
设置一个条件断点十分简单,在代码里按F9为某一行设置一个断点:
然后右击断点——编辑器左边的红色圆圈,在右键菜单中,选择“条件…” :
将弹出以下对话框, 允许你指明某种条件,只有当这种条件成立时,断点才能达到。 例如:我们可以通过写下面的表达式来指明,只有当paginatedDinners列表元素的个数小于10时,才中止程序,由调试器控制。
现在, 当我重新运行程序来研究一下, 调试器只在这个查找返回值小于10时,才中止程序执行。 如果返回值不小于10 ,将不会触发断点。
命中次数功能
有时你只想在条件第N次成立时中止执行。例如:仅当第5次出现查找返回值小于10时,才中止执行。你这样启用这个功能:右击断点, 选择“命中次数…”菜单命令。
将弹出以下对话框, 允许你指明程序中断的条件:条件被第N次满足时,或者条件被满足的次数是N的倍数时,或者条件被满足的次数大于等于N次时。
机器/线程/进程筛选器
你可以右击断点,选择“筛选器…”菜单命令, 来指明断点只在某台特定的机器,或某个特定的进程或线程中才能被触发。
跟踪点——当击中断点时自定义行为
很多人不知道的一个调试功能是使用。 跟踪点是一个断点, 当它被击中时,某种自定义的宏会被触发执行。当你想研究你的应用程序而又不想中止执行程序时, 这个功能特别有用。
我将用一个简单的控制台程序来演示如何使用跟踪点。 下面是的递归实现:
在上面的应用程序中,针对特定的输入,我们使用Console.WriteLine()来输出最后的斐波那契数列。假如我们想在调试过程中研究斐波那契的递归过程——而不停止调试的执行? 跟踪点能帮我们很轻松地做到这一点。
设置跟踪点
你可以这样启用跟踪点:按F9在代码上设置一个断点, 右击断点,在右键菜单中选择“命中条件…”菜单命令:
将弹出以下对话框——允许你指定当断点触发时,进行何种操作:
如上所示,我们指定每次当断点的条件成立时,打印跟踪信息。注意我们指定了想要输出的局部变量“X” 的值作为输出信息的一部分。 局部变量能通过{变量名}的语法被引用。 也有内嵌的命令(像$CALLER,$CALLSTACK, $FUNCTION等等)可以用来输出跟踪信息中常见的值。
上面对话框的底部, 我们也选中了“继续执行”单选框——表示我们不希望调试器暂停程序。 相反,程序会继续执行——只是我们自定义的跟踪信息会在每次断点条件满足时输出,就这点不同。
现在当我们运行程序时,我们会发现自定义的跟踪信息会自动出现在VS的输出窗口中——使我们能看到程序的递归过程。
你也可以选择为你的程序设置一个自定义跟踪监听器——这样跟踪点的输出信息就会被重定向到它里面,而不是VS的输出窗口里。
跟踪点——运行自定义的宏
上周我在伦敦做了一次演讲, 听众中有个人问了这样一个问题:有没有可能当击中一个跟踪点时,自动输出所有的局部变量。
这个功能不是内置在VS中的, 但是可以通过在VS中写一个自定义的宏来启用它,然后设置一个跟踪点,当它被击中时,调用这个宏。 为了实现这个目的, 打开VS中的宏窗口(工具-&宏-&宏菜单命令)。然后在项目管理器“MyMacros”结点下面, 选择模板或者新建一个模板(如:添加一个名为“UsefulThings”的 模板), 再将下面的VB宏代码贴到模板里,并保存它:
Sub DumpLocals()
Dim outputWindow As EnvDTE.OutputWindow
&&&&&&&outputWindow = DTE.Windows.Item(EnvDTE.Constants.vsWindowKindOutput).Object
Dim currentStackFrame As EnvDTE.StackFrame
&&&&&&&currentStackFrame = DTE.Debugger.CurrentStackFrame
&&&&&&&outputWindow.ActivePane.OutputString(&*Dumping Local Variables*& + vbCrLf)
For Each exp As EnvDTE.Expression In currentStackFrame.Locals
&&&&&&&&&&&outputWindow.ActivePane.OutputString(exp.Name + & = & + exp.Value.ToString() + vbCrLf)
上面的宏代码依次检测当前堆栈,获取所有的局部变量,并将其显示在输出窗口。
使用DumpLocals自定义宏
在下面这个简单的应用程序中,我们可以利用自定义的“DumpLocals”宏:
在上面的Add方法的return语句上,按F9设置一个断点。 右击断点,选择“命中条件…”菜单命令:
将弹出以下对话框,上例中,我们选中了“打印信息”的单选框,再手工指定希望输出的变量, 而这里, 我们选中“运行宏”的单选框,使它指向我们创建的自定义宏UsefulThings.DumpLocals:
我们仍然选中“继续执行”单选框,这样能保证当跟踪点被击中时,程序依然能够继续执行。
现在当我们按F5运行程序,当调用Add方法时,我们将看见以下输出出现在VS输出窗口中。 注意当跟踪点被击中时,宏是如何自动列出各个变量名及其值的。
VS调试器功能非常丰富。 我强烈建议大家抽出一些时间来学习它的所有功能。 以上的技巧和诀窍只是很多大家没有真正意识到的功能中的一小部分。
我之前写过其他一些(包括数据标签固定,断点导入导出,保留最后值变量, 等等)。 我将发表更多关于VS2010的智能跟踪和转储文件调试支持的博文。这些技术提供了很多非常酷的新功能,会让程序(包括产品中的程序)的调试变得非常简单和强大。
也请务必看看Scott Cate很棒的,你可以学习如何更好的利用VS。他有一些非常棒的免费视频和博客。
也要看看Jim Griesmer很棒的。 他有许多很好的可以利用的技巧和诀窍。
希望这能对您有所帮助。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:215428次
积分:3657
积分:3657
排名:第3720名
原创:140篇
转载:67篇
评论:105条
(1)(6)(1)(1)(5)(6)(6)(1)(3)(2)(2)(5)(1)(1)(2)(1)(6)(1)(20)(32)(8)(2)(4)(16)(24)(23)(8)(5)(3)(3)(3)(4)(1)(1)VS2010调试技巧
编辑:www.fx114.net
本篇文章主要介绍了"VS2010调试技巧",主要涉及到VS2010调试技巧方面的内容,对于VS2010调试技巧感兴趣的同学可以参考一下。
 跳到当前光标处(Ctrl+F10)
  我经常看到人们为了到达目标代码位置,而在程序中早早设定了断点,然后反复地按F10/F11,一步步走到目标代码处。当程序员的确需要仔细观察每一步的状态变化时, F10/F11是合理的选择。然而多数情况下,人们只想快速到达他们真正关心的代码处,这时候F10/F11就不是最佳选择了。
  这时,你应该利用&跳到当前光标处&这个功能。先把光标定位在要测的目标代码行上,再同时按Ctrl和F10,被测程序将直接跳到该行停下。你再也不用按许多次F10/F11了。即使目标代码位于独立的类或方法中,你仍然可以从当前正在检查的地方跳过去。
  条件中断
  另一种常见的情况是:开发人员设置断点,运行程序,利用不同的输入触发断点,然后在断点处手工检查是否满足某些特定的条件,从而决定是否继续调查。如果当前场景不是他们想要的,按F5继续运行程序,尝试别的输入,手动重复刚才的过程。
  针对上述情况,Visual Studio提供了一个方便得多的功能&&&条件中断&。只有当程序满足了开发人员预设的条件后,条件断点才会被触发,调试器中断。这将避免频繁地手工检查/恢复程序运行,大量减少调试过程中的手工和烦琐工作。
  如何设置条件断点
  设置条件断点非常容易。在特定的行上,按F9设置断点。
  然后右击断点&编辑窗口左侧的红点,在上下文菜单上选择&Condition&&。
  这时弹出一个对话框供你设置激活该断点所需的条件。比如:我们希望只有当局部变量paginatedDinners的尺寸小于10时,调试才中断。我们可以写出如下的表达式:
  现在我再运行这个程序,实现搜索,只有返回值小于10时,程序运行才会被中断。对于大于10的值,该断点将被跳过。
  记录到达断点次数
  有时你希望,只有当第N次满足条件的运行到达断点时,才中断程序运行。例如:当第五次返回少于10份晚餐的查询结果时,中断程序运行。  可以通过右击断点,然后在弹出菜单上选择&Hit count&&菜单命令实现。
  这时系统弹出一个对话框,它允许你指定:(1)当满足条件,而且进入断点的累计次数等于N时,断点命中一次。(2)当满足条件,而且进入断点的累计次数是N的倍数时,断点命中一次。(3)当满足条件,而且进入断点的累计次数大于N时,每次命中断点。
  机器/线程/进程过滤
  设置如下:右击断点;在弹出菜单上选择&Filter&&菜单命令;然后指定命中断点的特定条件:在指定的机器上、或指定的进程中、或指定的线程中。
  跟踪点&进入断点时的自定义操作
  许多人不知道&跟踪点(TrackPoints)&这个调试功能。&跟踪点&是种特殊的断点,当它被命中时,它会触发一系列自定义操作。如果你想观察程序的行为,而又不想中断调试的时候,这个功能尤其有用。
  我将用一个简单的控制台程序来演示如何使用&跟踪点&。如下是斐波那契数列的一个递归实现:
  以上程序中,我们使用Console.WriteLine() 输出针对特定输入值生成的最终斐波那契数列。如果希望在调试器里观察操作中每一次递归运算后的数列而又不实际中断程序运行,该怎么办呢?&跟踪点&可以轻松实现。
  设置跟踪点
  你可以在特定的行上,按F9加跟踪点。然后  右击断点,在上下文菜单中选择&When Hit&&:
  在弹出对话框上,你可以设置命中该断点时,所触发的事件。
  在上面例子中,我们设定一旦命中断点时就打印追踪信息。注意,我们已经把局部变量&x&的值,作为追踪信息的一部分输出。局部变量可以通过{变量名}语法输出。你还可以利用系统内置的命令($CALLER, $CALLSTACK, $FUNCTION等等),在追踪信息中输出常用的调试值。
  在上例中,我们同时选中了底端的&continue execution&选项,这说明我们不希望程序中断调试状态,而是继续运行。唯一的不同是:每次断点条件满足时,我们的自定义追踪信息都将被输出。
  现在当我们运行程序时,会发现自定义追踪信息自动显示在Visual Studio的&输出&窗口里。这让我们很容易看到程序的递归调用过程:
  你也可以选择往应用程序中添加一个自定义追踪信息的监听器。这时追踪点的输出信息将通过它输出,而不是Visual Studio的&输出&窗口。
  跟踪点&运行自定义的宏
  上周,我在伦敦演讲时,有听众问道:当命中跟踪点时,能否自动输出所有的局部变量?
  Visual Studio中并没有这样的内置功能,但我们可以写一个自定义宏来实现,然后在命中跟踪点时调用该宏。这个的实现需要先打开Visual Studio的宏编辑器(工具-&宏-&宏IDE菜单命令),然后在项目资源管理器的MyMacros节点下选择一个模块或创建新模块(如:加个名为&UsefulThings&的模块),再把下面的VB宏代码贴到模块中并保存。
Sub DumpLocals() Dim outputWindow As EnvDTE.OutputWindow outputWindow&=&DTE.Windows.Item(EnvDTE.Constants.vsWindowKindOutput).Object Dim currentStackFrame As EnvDTE.StackFrame currentStackFrame&=&DTE.Debugger.CurrentStackFrame outputWindow.ActivePane.OutputString(&*Dumping Local Variables*&&+&vbCrLf) For Each exp As EnvDTE.Expression In currentStackFrame.Locals outputWindow.ActivePane.OutputString(exp.Name&+&&&=&&&+exp.Value.ToString()&+&vbCrLf) Next End Sub
&
  利用可视化调试窗体(DebuggerVisualizers)
举一个DataTable的DebuggerVisualizers的例子:
当然如果是DateSet,可视化工具窗口的表可以选择DataSet所包含的所有表的信息
我们提供的服务:
本文标题:
本页链接:

我要回帖

更多关于 斐波那契数列 的文章

 

随机推荐