简介:调试是开发环节的主要部分之一。对于一个非玩具型的程序,调试有时候会比较有难度,有时候会让人迷惑,有时候又很恼人。近几年的调试工具已经让调试任务变得更加简单省时。
本文总结了11个在Visual Studio调试时比较有用的技巧,使用它们能帮你省下很多时间。
悬停鼠标查看表达式的值。
调试本身还是比较有麻烦的。你可能会单步执行一个函数来找出哪里出错了,或者你查看调用堆栈来看某个值是从哪来的。但是这些情况下,增加一个监视表达式或者浏览一遍一堆局部变量都会耗时不少。然而,如果你将鼠标指向一个关心的变量,你会发现Visual Studio会显示这些变量的值,这确实比增加监视表达式省事多了。如果你指向的变量是个类或者结构体,你点击一下,这个变量还会展开,这样你就能快速方便地看到关心的字段了。
调试时改变变量的值
调试器也只不过是分析崩溃和异常行为的工具。很多时候,对于一个新写的函数,当你单步执行并确认该函数能按预期工作了,那么许多bug能够避免了。有时候你会好奇:如果某个条件为true,这个函数是不是就执行正确了?大部分情况下,你不需要修改代码并重新执行,你只需要鼠标悬停到这个变量,这时会出现值,然后双击这个值修改就行了!
设置下一条要执行的语句
调试时常见的一个场景是通过单步执行来分析一个函数为何出错。如果你发现一个函数调用了另一个函数,被调用的函数出错了,你会怎么做?是重新调试吗?这里有个更好的办法,把黄色的语句指针拖拽到你想执行的那条语句就行了,然后单步进入执行。很简单吧?
编辑并继续
调试一个复杂的程序或者插件的时候,发现一个错误,但是你不想花时间停止,重新编译构建并启动,或者这个函数调用次数太多了以至于你也不想用前面说的那个技巧。怎么办呢?没问题,就地修改代码并继续调试,Visual Studio会修改你的程序并继续调试,而不用重新启动。
注意,“编辑并继续”功能有一大串已知的限制。
第一,64位代码不行。如果你的C#代码不能使用这个功能,去项目设置,构建页,选择x86作为平台目标。不用担心,平台目标对于release配置和debug配置是分开的。
第二,“编辑并继续”的改变应该是局部的,例如是在一个函数中。如果你改变了函数签名,或者增加了一个新的方法或类,那么你就得重启你的应用程序了,要不然就放弃修改继续调试。改变包含lambda表达式的函数意味着修改了自动生成的委托类,因此也不能使用这个功能了。
一个方便的监视窗口
貌似每个现在的调试器都有一个监视窗口。然而,Visual Studio比较酷的是程序员可以很容易地在监视窗口中添加删除一个变量。单击空白行,输入表达式,回车就能添加一个新的变量,想删除某个再被监视的变量的话,直接按delete键就行了。
此外,你不光可以在监视普通变量,你还可以输入一些内置的特殊变量:输入$handles来追踪你的应用程序打开的handles数目(这样方便查找泄漏),输入$err能够看到最后一个函数返回的错误码(然后Tool/Error Lookup来获取一个对应的文字描述),或者@eax(64机器上对应@rax)来查看寄存器的值(这个值通常表示函数的返回值)。
注释汇编
使用交互式汇编模式会让你更容易地优化程序关键部分的性能。Visual Studio会显示每行代码对应的汇编指令,允许你单步执行,在任意位置加断点,表达式求值。这些都跟调试C++代码一样。
带有栈的线程窗口
调试多线程应用程序可能会很痛苦,但也可以很有趣,这取决于你用什么调试器。Visual Studio 2010一个非常好的特色是线程窗口中带有栈视图。你能够很容易看到所有的线程,直接从窗口中浏览它们的调用栈。
条件断点
如果你在重现一个不常见的事件,并且在断点处执行了多次都没有重现出来,那么你可以使用条件断点。设置断点在某些条件满足时才停下来,这样Visual Studio会在条件不满足时忽略断点,继续执行。
内存窗口
许多bug是由不正确的结构定义(例如错误的属性对齐)导致的。你可以直接看到对应位置的内存,并修复这样的bug。Visual Studio 有个特色能够让你在内存窗口中查看8/16/32/64位整形或者浮点数,并允许你就地修改(输入新值即可)。
跳转到定义
最后要提的一个特色跟调试没有直接关系,而是用于探索大的项目。如果你要调试一个不是自己写的代码中的一个bug,你需要找到这个代码的定义。例如你想知道这是什么类型,或者想知道这个函数具体干了什么。Visual Studio有个功能是跳转到定义,用这个功能就能找到相应代码。
命令窗口
第11个技巧是chaau建议的,善用这个技巧真的会节省很多时间。Visual Studio支持命令窗口(View/Other Windows/Command Windows)。打开这个窗口之后,你就可以输入命令自动调试了。例如你可以输入如下命令计算MFC ColeDateTime变量:
| [color=rgb(51, 51, 51) !important]?[color=rgb(0, 111, 224) !important] [color=rgb(0, 45, 122) !important]dt[color=rgb(51, 51, 51) !important].[color=rgb(0, 78, 208) !important]Format[color=rgb(51, 51, 51) !important]([color=rgb(0, 128, 0) !important]"%Y-%m-%d %H:%M:%S"[color=rgb(51, 51, 51) !important])
|
英文原文链接:
http://www.codeproject.com/Articles/359801/10plus-powerful-debugging-tricks-with-Visual-Studi