尽管我一般不喜欢关于SO的讨论/主观帖子,但我真的很欣赏人们放在一起的"隐藏的秘密"帖子.它们提供了一些您可能现在可能发现的常见错过的工具的概述.
对于这个问题,我想探索Visual Studio .NET调试器.你经常使用或最近发现的VS.NET调试器中有哪些"隐藏的秘密",希望你早就知道?
我最喜欢的功能之一是断点时可用的"When Hit ..."选项.您可以使用变量的值以及许多其他信息打印消息,例如:
$ADDRESS
- 现行指示
$CALLER
- 上一个功能名称
$CALLSTACK
- 调用堆栈
$FUNCTION
- 当前功能名称
$PID
- 进程ID
$PNAME
- 流程名称
$TID
- 线程ID
$TNAME
- 线程名称
你也可以让它运行一个宏,但我从来没有使用过这个功能.
对于.net应用程序System.Diagnostics
有很多有用的调试事项.该Debugger
例如类:
Debugger.Break(); // Programmatically set a break point Debugger.Launch(); // Launch the debugger if not already attached Debugger.IsAttached // Check if the debugger is attached
System.Diagnostics
也有很多好的属性.我使用的两个是调试器显示属性,用于更改放入本地窗口的详细信息,以及用于跳过不关心调试的代码的逐步属性:
// Displays the value of Property1 for any "MyClass" instance in the debugger [DebuggerDisplay("{Property1}")] public class MyClass { public string Property1 { get; set; } [DebuggerStepThrough] public void DontStepInto() { // An action we don't want to debug } }
您可以在"监视"窗口中右键单击对象,然后单击"创建对象ID".
它将为该实例分配一个ID号,允许您在复杂的对象图中查看哪些对象引用同一个实例.
作为一名Web开发人员,他使用与我的前端代码在同一解决方案中的Web服务大多数时间,我发现能够"附加"到一个进程是一个巨大的节省时间.
在我找到这个隐藏的gem之前,我总是要在一些调用Web服务方法的前端代码上设置一个断点并进入它.现在,我知道这个技巧/功能,我可以轻松地在我想要的代码的任何部分设置断点,这节省了我的时间和精力.
$exception
在监视窗口中,即使您没有将Exception
实例分配给命名变量的catch,也会显示当前正在处理的异常.
线程窗口,来自Debug - > Windows - > Threads.您可以冻结和解冻线程,并切换活动线程.在使用多线程应用程序调试或复制问题时,这非常棒.
您可以将黄色"Next Statement"箭头拖放到另一个位置.程序恢复后,将在该语句中恢复执行.您可以将它添加到工具栏,一个名为Set Next Statement的蓝色箭头,但默认情况下不存在.
您可以"撤消"您所做的导航,例如滚动,转到另一个文件或跳转到参考.快捷方式是ctrl--(控制减去.)这样你可以跳转到一个函数,检查那里的代码,然后回到你原来的地方而不看.
条件断点.
您可以将windbg扩展加载到Visual Studio调试器中,并从即时窗口中使用它们.
正如在另一篇文章中发表的那样,Sara Ford正在对VS调试器进行一系列演讲.
她的博客是VS技巧的最佳来源:http://blogs.msdn.com/saraford/archive/tags/Visual+Studio+2008+Tip+of+the+Day/default.aspx
这有点旧.如果添加一个监视表达式err,hr
,那么它将保存GetLastError()的结果,格式为HRESULT(仅限VC++调试器).
执行暂停时,可以在代码中上下拖动当前行光标(黄色箭头).
此外,为了在异常暂停期间启用此功能,您必须先在异常详细信息上单击"启用编辑".
您还可以通过在以下位置检查感兴趣的内容来使VS处理已处理的异常:Debug-> Exceptions:Thrown column