我已经使用VS的调试器进行了多年的工作,但是时不时地遇到一个从未见过的功能,然后想:“该死!我怎么会错过呢?它是如此有用!”
[免责声明:这些技巧可在VS 2005中用于C#项目,不能保证VS或其他语言的较早版本。]
跟踪对象实例
使用给定类的多个实例?你怎么区分他们?在垃圾收集前编程的日子里,跟踪引用很容易-只需查看内存地址即可。使用.NET,您无法做到这一点-对象可以随意移动。幸运的是,手表视图使您可以右键单击手表,然后选择“制作对象ID”。
这会在实例的值之后附加一个{1#},{2#}等,从而有效地为该实例提供了唯一的标签。看起来像这样:
标签在该对象的生存期内一直存在。
监视变量的有意义的值
默认情况下,监视变量的值是它的类型。如果要查看其字段,则必须对其进行扩展,如果有很多字段或它们做了复杂的事情,这可能会花费很长时间(甚至是超时!)。
但是,某些预定义类型显示了更有意义的信息:
- 字符串显示其实际内容
- 列表和字典显示其元素数量等。
有意义的信息http://img205.imageshack.us/img205/4808/37220487md1.jpg
为我自己的类型拥有它不是很好吗?
嗯...
...使用.NET Reflector的一些优质时间表明DebuggerDisplay
,使用我的自定义类型上的属性可以轻松完成此操作:
[System.Diagnostics.DebuggerDisplay("Employee: '{Name}'")]
public class Employee {
public string Name { get { ... } }
...
}
...重新运行,然后...
da!http://img60.imageshack.us/img60/926/79816018ha1.jpg
这里有关于此主题的更多信息:MSDN
打破所有例外
...甚至是用代码处理的!我知道,自从我出生以来就一直不知道这件事,我真是个n00b,但是无论如何,这还是有可能的-也许这有一天会帮助某个人:
您可以在每次引发异常时强制已调试的进程进入调试模式。曾经进行过数小时的错误查找,只是遇到了这样的一段代码吗?
try {
runStrangeContraption();
} catch(Exception ex) {
/* TODO: Will handle this error later */
}
在这些情况下,捕获所有异常非常方便。可以从Debug> Exceptions ...(Ctrl-Alt-E)启用。选中“引发”列中需要的每种异常类型的框。
那对我来说是一些拍额的时刻。你愿意分享你的吗?