我多年来一直在使用VS的调试器,但我时不时地会遇到一个我以前从未注意到的特性,我会想“该死!我怎么会错过它呢?它是如此有用的!”
免责声明:这些技巧适用于VS2005中的C#项目,不能保证VS或其他语言的旧版本
跟踪对象实例
使用给定类的多个实例?你怎么能把它们区分开?在垃圾回收之前的编程时代,跟踪引用很容易--只需查看内存地址。使用.NET时,您无法做到这一点--对象可以四处移动。幸运的是,watches视图允许您右键单击一个监视并选择'Make Object ID‘。
watches view http://img403.imageshack.us/img403/461/52518188cq3.jpg
这会将{1#}、{2#}等附加到实例的值之后,从而有效地为实例提供唯一的标签。它看起来是这样的:
numbered instance http://img383.imageshack.us/img383/7351/11732685bl8.jpg
该标签在该对象的生存期内保持不变。
监视变量的有意义的值
默认情况下,被监视变量的值就是它的类型。如果想要查看它的字段,就必须展开它,这可能需要很长时间(甚至超时!)如果有很多字段,或者他们做了一些复杂的事情。
但是,一些预定义类型显示了更有意义的信息:
meaningful info http://img205.imageshack.us/img205/4808/37220487md1.jpg
对于我自己的类型来说,这不是很好吗?
嗯..。
使用.NET反射器的...some quality time展示了在我的自定义类型上使用DebuggerDisplay
属性实现这一点是多么容易:
[System.Diagnostics.DebuggerDisplay("Employee: '{Name}'")]
public class Employee {
public string Name { get { ... } }
...
}
..。重新运行然后..。
ta da! http://img60.imageshack.us/img60/926/79816018ha1.jpg
这里有更多关于这个主题的信息:MSDN
在所有异常时中断
..。即使是在代码中处理的那些!我知道,我是一个从出生起就不知道这一点的n00b,但不管怎样,它还是在这里--也许有一天这会对某人有所帮助:
每次引发异常时,都可以强制被调试的进程中断到调试模式。有没有人花了几个小时寻找bug,结果却发现了一段这样的代码?
try {
runStrangeContraption();
} catch(Exception ex) {
/* TODO: Will handle this error later */
}
在这些情况下,捕获所有异常非常方便。这可以从Debug > Exceptions...中启用(Ctrl-Alt-E)。在“抛出”列中的框中勾选您需要的每种类型的异常。
对我来说,那是几次拍打额头的时刻。你愿意分享你的想法吗?
发布于 2009-09-02 13:41:56
两个代码内技巧:
我真的很喜欢System.Diagnostics.DebuggerStepThrough属性;您可以将其附加到类、方法或属性,以使VS在调试时不会默认输入代码。与DebuggerHidden属性相比,我更喜欢它,因为如果确实需要调试,它仍然允许您在忽略的代码中放置断点。
另一个(有时)有用的调用是System.Diagnostics.Debugger.Launch();当执行命中它时,您将看到“选择调试器”对话框,调试器将启动。有点粗鲁,但对于附加到进程的特别糟糕的情况很有用,就像一个由另一个进程产生并立即执行您的代码的进程。
发布于 2008-10-15 13:00:22
try {
// do something big
}
catch {
// breakpoint set here:
throw CantHappenException("something horrible happened that should never happen.");
}
您如何看待最初抛出的异常?在监视窗口中,输入$exception
发布于 2008-10-15 12:03:57
这是我学到的另一个巧妙的技巧:
System.Diagnostics.Debugger.Break()
以编程方式使调试器在下一条指令时中断。真正好的部分是,这也适用于在Release模式下编译的程序,而不需要调试信息。
https://stackoverflow.com/questions/201450
复制相似问题