我已经用VS的调试器工作了很多年,但偶尔我会遇到一个我以前从未注意到的功能,并想"该死!我怎么会错过它?它有so个有用的功能!"

[免责声明:这些技巧适用于VS 2005中的C#项目,不能保证VS或其他语言的较早版本]

跟踪对象实例

处理给定类的多个实例?你怎么能把他们区分开来?

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 Reflector显示了使用自定义类型上的DebuggerDisplay属性可以轻松实现这一点:

[System.Diagnostics.DebuggerDisplay("Employee: '{Name}'")]
public class Employee {
    public string Name { get { ... } }
    ...
}

... 重新运行,然后...

ta da! http://img60.imageshack.us/img60/926/79816018ha1.jpg

这里有更多关于这个主题的信息:MSDN

在所有例外情况下中断

... 甚至是那些用代码处理的!

每次抛出异常时,可以强制已调试的进程进入调试模式.你有没有经历过几个小时的错误搜寻,却发现了这样一段代码?

try {
    runStrangeContraption();
} catch(Exception ex) {
    /* TODO: Will handle this error later */
}

在这些情况下,捕捉所有异常非常方便.


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

推荐答案

代码中的两个技巧:

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

另一个(有时)有用的电话是System.Diagnostics.Debugger.Launch();当执行命中它时,您将看到" Select 调试器"对话框,调试器将启动.这有点粗鲁,但对于附加到进程(比如由另一个进程生成并立即执行代码的进程)尤其有用.

.net相关问答推荐

通过 System.Net.Mail 的 VB SMTP 停止工作

如何规范机器之间连字符的排序顺序?

在 WP7 中将 List 转换为 ObservableCollection

判断内部异常的最佳方法?

如何将 Javascript 日期时间转换为 C# 日期时间?

使用字典作为数据源绑定组合框

如何中止任务,如中止线程(Thread.Abort 方法)?

通用枚举到int的C#非装箱转换?

哪个单元测试框架?

ReaderWriterLock 与锁{}

InternalsVisibleTo 属性不起作用

Await 运算符只能在 Async 方法中使用

Mono 是树莓派

清除 .NET 的 StringBuilder 内容的最佳方法

当程序员说针对接口而不是对象的代码时,他们是什么意思?

哪个密码字符在 winforms 文本框中显示黑点 (•)?

是否可以判断对象是否已附加到实体框架中的数据上下文?

如何重新启动我的 C# WinForm 应用程序?

当它被抛出和捕获时,不要在那个异常处停止调试器

实体框架太慢了.我有哪些 Select ?