VisualStudio内置了很多有用的调试功能,但它们并不为人所知。本文列出了一些我的最爱,包括我最近在VS2013中发现的调试功能。1.Lambda表达式中的断点如果你点击左边的列设置断点,你很容易误以为断点发生在行级。您实际上可以在行内插入断点,就像在LINQLamdba表达式中一样。只需右键单击代码部分,然后从菜单中选择Breakpoint>Insertbreakpoint。2.方便的输出窗口输出窗口对调试很有用,断点也是弹窗或者中断程序,但是真的很吵。只需右键单击输出窗口(确保输出设置为调试),关闭模块加载、模块卸载、进程退出和线程退出,只输出你关心的内容。现在使用Debug.WriteLine提供您真正关心的内容。您还可以在输出窗口中使用Ctrl-S保存设置。3.客户端和服务端的额外调试(VS2012)服务端和客户端项目在一个解决方案中有用,你只需要一份VisualStudio运行时,它不会在alt-tab键的前进和后退中得到迷路了,尤其是当他们使用数据结构工程等通用代码时。有一个缺点,启动项目是唯一需要额外调试的项目。如果您遇到异常,它将显示在您的客户端上,而不是服务器上。现在这个问题很容易解决了。右键单击该解决方案,选择属性>多个启动项目,然后选择启动操作作为您需要附加以进行调试的项目。4.创建一个可重建的项目模板如果您负责SDK或API,请创建一个简单的应用程序供您自己使用。然后使用文件>导出模板保存它。现在,只需单击几下,您就可以随时从模板创建新项目。更好的是,将它们提供给用户和测试人员使用,这样他们就可以为您提供最少的重建。5、使用DebuggerDisplay属性调试器默认会使用ToString()来监听并在窗口中正常输出类名。即使您重写了ToString,它对其他调试器来说也可能不是很明显。在您的类中使用DebuggerDisplay和一个简单的表达式,而不是更改属性值。例如:[DebuggerDisplay("Order{ID,nq}")classOrder{publicstringID{get{returnid;}}}"nq"防止双引号出现分歧。你也可以在这里使用方法,但不要做任何可能有轻微副作用的事情,或者你正在观察的对象可能会改变它的行为并导致奇怪的事情发生。6.管理断点你创建了一些有趣的断点,现在你想关闭其中一个,因为它被击中了太多次,但你很快就会再次需要它。如果删除断点,则必须返回并找到断点位置。打开经常被忽视的断点窗口(Ctrl-Alt-B)。此窗口显示您设置的所有断点,但重要的是允许您通过删除复选标记来禁用它们。再次检查以重新启用它。该窗口还提供了快速调试功能:当条件断点发生时countofoccurrences观察它发生的频率并根据标签断点允许有效和无效的次数中断当它发生时,在输出窗口中显示一条消息代替真正的中断7.断开或输出调用者信息(.NET4.5/Windows8Store)没有为调用程序的当前方法准备全局变量,获取当前堆栈内容是一个非常慢的操作。一种快速简便的方法是使用CallerMemberName属性向该方法添加一个额外的可选字符串参数。例如,voidMyFunction(stringsomeValue,[CallerMemberName]stringcaller=null){...}因为这是一个可选值,所以你不必修改任何调用者,但现在你可以:①在一些基于调用者的程序中设置variableBreakpointcondition②将调用程序的内容输出到日志文件或输出窗口也可以使用CallerLineNumber和CallerFilePath。还要记住,构造函数、终结器和运算符重载将显示它们关联的方法名称(.ctor、op_Equals等)。8.监控方法返回值(VS2013,.NET4.5/Windows8.1Store)有时候你想看到方法返回值但是并不容易,因为它是另一个方法的入参,所以你没有存储值值。这个功能是在VS2013中加入的,但是很容易错过,得适时适地用。正确的位置是Autos窗口,正确的时间是返回到调用方法的位置。当您在方法主体之前或方法主体中调用该方法时,您看不到这一点。它是单个步骤,如下所示:箭头指示它是一个返回值,并让您知道与其关联的方法名称。写在***我还必须强调一旦软件离开您的机器,日志记录对于解决问题是多么有效。但这是一个更大的问题。我错过了一些更好的调试建议吗?请随时在下面的评论中告诉我。附言MichaelParshin也有一些很好的调试建议。原文链接:http://damieng.com/blog/2014/02/05/8-visual-studio-debugging-tips-debug-like-a-boss翻译链接:http://blog.jobbole.com/59618/
