当前位置:  开发笔记 > 编程语言 > 正文

.NET的Visual Studio调试器提示和技巧

如何解决《.NET的VisualStudio调试器提示和技巧》经验,为你挑选了7个好方法。

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

[免责声明:这些提示适用于VS 2005中的C#项目,不保证VS或其他语言的旧版本]

跟踪对象实例

使用给定类的多个实例?你怎么能分开他们?在垃圾收集前编程时,很容易跟踪引用 - 只需查看内存地址即可.使用.NET,你不能这样做 - 对象可以移动.幸运的是,通过手表视图,您可以右键单击手表并选择"创建对象ID".

手表查看http://img403.imageshack.us/img403/461/52518188cq3.jpg

这会在实例的值之后附加{1#},{2#}等,从而有效地为实例提供唯一标签.它看起来像这样:

编号实例http://img383.imageshack.us/img383/7351/11732685bl8.jpg

标签在该对象的生命周期内保持不变.

观察变量的有意义值

默认情况下,监视变量的值是它的类型.如果你想看到它的字段,你必须扩展它,如果有很多字段或它们做了一些复杂的事情,这可能需要很长时间(甚至超时!).

但是,某些预定义类型显示更有意义的信息:

字符串显示其实际内容

列表和词典显示其元素数等.

有意义的信息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 */
}

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


那对我来说是一些前额拍打的时刻.你愿意分享你的吗?



1> plinth..:
try {
    // do something big
}
catch {
    // breakpoint set here:
    throw CantHappenException("something horrible happened that should never happen.");
}

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



2> Cristi Diaco..:

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

System.Diagnostics.Debugger.Break()

以编程方式使调试器在下一条指令上中断.在真正好的部分,这也适用于在编译的程序发布模式,无需调试信息.


我喜欢用If(System.Diagnostics.Debugger.IsAttached){System.Diagnostics.Debugger.Break()}来包围它.否则客户端可能会在没有取出时出现令人讨厌的错误!

3> Jon Tackabur..:

我总是确保在我创建的新线程上设置"Name"属性.这样,当我调试时,我可以更容易地识别不同的线程.



4> Brian..:

当然,请查看当天的VS提示:

http://blogs.msdn.com/SaraFord/



5> Atanas Korch..:

一些来自我

取消选中工具 - >选项 - >调试中的"启用我的代码"选项.

有条件的断点 - 它们几乎每天都能挽救我的生命

如果事情变得丑陋,请使用.NET框架源



6> Paolo Tedesc..:

两个代码内的技巧:

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

另一个(有时)有用的调用是System.Diagnostics.Debugger.Launch() ; 当执行命中时,您将看到"选择调试器"对话框,调试器将启动.有点粗鲁,但有用,特别讨厌附加到进程,像一个由另一个生成的进程,并立即执行您的代码.


我最近了解了System.Diagnostics.DebuggerStepThrough - 很有用.另外,在过去的几周里我使用了Debugger.Launch很多 - 对于一个特定的项目,如果我尝试直接从'Attach to process'对话框中附加,该过程就会死掉,但是使用Debugger.Launch ()附加(相同的?!)调试器就好了.

7> leppie..:

.load sos 在立即窗口:)

推荐阅读
贾志军
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有