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