最近合做开发,代码已经完成了,可是一调试,错误一大堆,因为是合做开发,不肯定是哪层的错误,得一步步得走,非常费时费力,平时调试的技巧用的很少,如今集中调试,结果有些手忙脚乱,效率也很低,因此在网上找了一些技巧,整理了一下,分享给你们。它们都很简单,却能帮咱们节约大量的时间,但愿对你们有帮助。程序员
跳到当前光标处(Ctrl+F10)编辑器
我常常看到人们为了到达目标代码位置,而在程序中早早设定了断点,而后反复地按F10/F11,一步步走到目标代码处。当程序员的确须要仔细观察每一步的状态变化时, F10/F11是合理的选择。然而多数状况下,人们只想快速到达他们真正关心的代码处,这时候F10/F11就不是最佳选择了。工具
这时,你应该利用“跳到当前光标处”这个功能。先把光标定位在要测的目标代码行上,再同时按Ctrl和F10,被测程序将直接跳到该行停下。你不再用按许屡次F10/F11了。即便目标代码位于独立的类或方法中,你仍然能够从当前正在检查的地方跳过去。spa
条件中断.net
另外一种常见的状况是:开发人员设置断点,运行程序,利用不一样的输入触发断点,而后在断点处手工检查是否知足某些特定的条件,从而决定是否继续调查。若是当前场景不是他们想要的,按F5继续运行程序,尝试别的输入,手动重复刚才的过程。线程
针对上述状况,Visual Studio提供了一个方便得多的功能——“条件中断”。只有当程序知足了开发人员预设的条件后,条件断点才会被触发,调试器中断。这将避免频繁地手工检查/恢复程序运行,大量减小调试过程当中的手工和烦琐工做。调试
如何设置条件断点code
设置条件断点很是容易。在特定的行上,按F9设置断点。blog
而后右击断点–编辑窗口左侧的红点,在上下文菜单上选择“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
上述宏代码将循环当前的堆栈,把全部的局部变量输出到“输出”窗口。
使用自定义的“DumpLocals”宏
而后,咱们能够在以下的一个简单程序中使用刚定制的“DumpLocals”宏了:
上述代码中,咱们用F9在“Add”方法的返回值处加了个断点,而后右击断点,在弹出菜单上选择“When hit”。
将显示以下对话框。和以前不同, 咱们不选“Print a message”选项,也不手工设定须要输出的变量;而是选择“Run a marco”复选框,并指定到咱们上面建立的UsefulThings.DumpLocals宏上:
为了使程序能在命中跟踪点后仍继续运行,咱们将继续选中“continue execution”复选框。
运行程序
如今按F5运行程序,当“Add”方法被调用时,咱们会在Visual Studio的“输出”窗口中看到以下结果。注意命中跟踪点时,宏会自动列出每一个局部变量的名称和值:
或者在代码中写有Debug.Print() 语句来输出想查看的数据,在vs调试状态下咱们能够再vs的OutPut窗口看见,同上图。
利用数据提示功能(DataTips)
当程序执行到某一个位置,把鼠标放到变量上,会自动显示值。
利用可视化调试窗体(DebuggerVisualizers)
举一个DataTable的DebuggerVisualizers的例子:
直接点击放大镜的图标,或者下拉列表中选择DataTable Visualizer,便可打开可视化的界面:以下图
固然若是是DateSet,可视化工具窗口的表能够选择DataSet所包含的全部表的信息。
转载的朋友请标明出处:http://blog.csdn.net/xiaoxian8023/article/details/7217549