首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >适用于.NET的Visual Studio调试器提示和技巧

适用于.NET的Visual Studio调试器提示和技巧
EN

Stack Overflow用户
提问于 2008-10-14 14:43:13
回答 14查看 9K关注 0票数 70

我多年来一直在使用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属性实现这一点是多么容易:

代码语言:javascript
复制
[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,结果却发现了一段这样的代码?

代码语言:javascript
复制
try {
    runStrangeContraption();
} catch(Exception ex) {
    /* TODO: Will handle this error later */
}

在这些情况下,捕获所有异常非常方便。这可以从Debug > Exceptions...中启用(Ctrl-Alt-E)。在“抛出”列中的框中勾选您需要的每种类型的异常。

对我来说,那是几次拍打额头的时刻。你愿意分享你的想法吗?

EN

回答 14

Stack Overflow用户

回答已采纳

发布于 2009-09-02 13:41:56

两个代码内技巧:

我真的很喜欢System.Diagnostics.DebuggerStepThrough属性;您可以将其附加到类、方法或属性,以使VS在调试时不会默认输入代码。与DebuggerHidden属性相比,我更喜欢它,因为如果确实需要调试,它仍然允许您在忽略的代码中放置断点。

另一个(有时)有用的调用是System.Diagnostics.Debugger.Launch();当执行命中它时,您将看到“选择调试器”对话框,调试器将启动。有点粗鲁,但对于附加到进程的特别糟糕的情况很有用,就像一个由另一个进程产生并立即执行您的代码的进程。

票数 7
EN

Stack Overflow用户

发布于 2008-10-15 13:00:22

代码语言:javascript
复制
try {
    // do something big
}
catch {
    // breakpoint set here:
    throw CantHappenException("something horrible happened that should never happen.");
}

您如何看待最初抛出的异常?在监视窗口中,输入$exception

票数 19
EN

Stack Overflow用户

发布于 2008-10-15 12:03:57

这是我学到的另一个巧妙的技巧:

代码语言:javascript
复制
System.Diagnostics.Debugger.Break()

以编程方式使调试器在下一条指令时中断。真正好的部分是,这也适用于在Release模式下编译的程序,而不需要调试信息。

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/201450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档