12个Visual Studio调试效率技巧(小结)

在这篇文章中,我们假定读者了解 VS 基本的调试知识,如:

F5 开始使用调试器运行程序
F9 在当前行设置断点
F10 运行到下一个断点处
F5 从被调试的已停止程序恢复执行
F11 步进到函数内(如果当前程序指针指向一个函数)
F10 步过函数(如果当前程序指针指向一个函数)
Shift+F11 步出执行的函数
暂停执行
附加到进程
鼠标悬停时快速查看源代码中的元素
调试窗口:局部变量、监视、即时窗口、模块、调用堆栈、异常设置

许多开发人员使用这个功能强大的工具包来处理调试会话。然而, Visual Studio 调试工具提供了更多的功能。下面是一系列Visual Studio调试效率技巧。注意,这些提示和快捷方式已经在的Visual studio 2019 16.6 EN-US版本中进行了验证,验证时 Visual studio 没有安装扩展。

1、运行到光标位置

使用快捷键 Ctrl+F10 ,您可以让调试器运行到光标所在行位置。

2、通过点击鼠标,运行到当前位置

在调试运行的程序时,通过鼠标悬停在当前行的代码上时,出现绿色的符号,可以点击此符号,直接让断点运行到此处。

3、在此处作为下一条要执行的语句

在调试运行的程序时,通过鼠标悬停在当前行的代码上时,通过按住 Ctrl 键转换为将此处作为下一条要执行的语句。它与通过绿色箭头符号运行到这里不同,此功能将会跳过中间的语句,直接将断点跳转到此处。因此,在下面的动图中,我们可以在监视窗口中引用obj仍然为null,中间的 MyClass 构造函数并没有被执行。

4、数据断点:当值发生变化时,触发中断(值更改时中断)

当你设置一个非静态的设置器为断点时,当所有对象的属性的值发生更改时触发断点。通过局部窗口(监视器窗口)右键点击: 值更改时中断 菜单,单个对象也可以获得相同的行为。

下面的动画说明了这个功能,只有当 obj2.Prop 发生变化时,命中断点,而 obj1.Prop 发生变化时没有命中断点。

注意:数据断点绑定到活动对象时,旨在调试期间起作用。因此,一旦调试过程停止,设置的断点就会丢失,在以后的调试过程中不能重用它。

5、条件断点

可以将条件附加到断点中,以便尽在特定场景中触发中断。在下面的动图中,我们在循环中定义条件 i>6 的断点。然后点击 继续 ,可以看到一旦断点停止, i 的值实际上变成了 7

6、跟踪断点

在遇到断点时,停止程序执行时最常见的操作。但是,你可以选择在输出窗口中不终止(或带终止)打印一些跟踪信息。下面的动图说明了这种可能性。我们在输出窗口中跟踪i从0到9的值。注意:跟踪断点在编辑器的断点显示位置显示为菱形形状。

注意,条件和跟踪操作都可以在断点上指定。

 

7、跟踪超出作用域的对象

在监视窗口中,通过当前执行范文内引用的名称来跟踪对象。但是,当这样的跟踪引用超出作用域时,即使在引用对象仍处于活动状态时,它在监视窗口的上下文也不安的毫无意义并且被禁用。

在许多情况下,我们想继续跟踪作用域外对象的状态。为此,请在监视窗口中右键单击此类引用,单击菜单 [Make Object ID] 创建对象ID(M) ,并要在监视器中添加$1(或者$2,$3,...,取决于你已经创建了多个对象ID)。

下面的动图演示了如何跟踪作用域外对象的属性获取器的状态,该属性获取器以字符串的形式返回实际的日期时间。它很好地显示了当引用 objFct() 上下文中超出作用域时,要观看的 obj 项将被禁用,而 $1 仍然会获得更新。

8、查看函数返回的值

函数返回的值有时在源代码中被忽略,或者有时这个值在调试时无法被显示的访问。

这样的返回值可以显示在 调试->窗口->自动窗口 中。伪变量 $ReturnValue 也可以在即时窗口和监视窗口中使用,以方便查看最后一个函数调用的返回值。

注意,菜单 调试->窗口->自动窗口 仅在 Visual Studio 调试器附加到进程并且程序被调试器暂停时可用。

9、重新附加到进程

Visual Studio 2017 开始,重新附加到进程 Shift+Alt+P 工具被提出,并且非常方便。将调试器附加到某个进程后, Visual Studio 会记住它,并建议将调试器重新附加到同一进程。斜体也一样,因为这里有一个关于进程标识的启发式方法:

  • 如果已附加的进程仍然运行着,重新附加到进程,重新附加到它。
  • 否则,Visual Studio将尝试查找和前一个进程名具有相同名称的单进程,并将调试器重新附加到该进程。
  • 如果找到几个使用此名称的进程,则打开“附加到进程”对话框,只显示名称相同的进程
  • 如果找不到具有此名称的进程,则显示“附加到进程”对话框

重新附加到进程也适用于涉及多个进程的调试会话。在这种情况下, Visual Studio 会尝试使用上述相同的启发式方法来查找它附加到的所有进程。

10、在即时窗口和在观察窗口的 No-Side-Effect 评估

有时,在即时窗口或监视窗口中评估表达式时,某些状态会更改。这种行为通常时不希望发生的。你不想仅仅因为需要评估表达式的值而破坏调试程序的状态。这种情况被称为 Heisenbug ,该术语时物理学家 Werner Heisenberg 的双关语,它首先断言了量子力学的观察者效应,该现象指出,观察系统的行为不可避免的会改变器状态。

为了避免更改任何状态,你可以在表达式后面加上 nse (No-Side-Effect)。下面的动图说明了这种可能性(在监视窗口中监视 State 的值是否有变化)。

下面这种动图是 nse 在监视窗口的使用。由于 SideEffectFct() 所观察的项中有 Refresh 评估按钮,所以此示例比前一个示例更简单。

11、在源码中显示线程

调试多线程应用程序是有名的复杂。希望 在源码中显示线程 按钮能提供很大的帮助。它在编辑器的左侧边栏引入标记图标,以跟踪其他线程被暂停的位置。这个标记可以用来显示线程 ID ,并最终切换到另一个线程。注意:如果至少两个线程在同一位置暂停,则会显示不同的标记符号。

更多调试多线程应用程序的技巧可以在这个微软文档中找到: Get started debugging multithreaded applications (C#, Visual Basic, C++)

https://docs.microsoft.com/en-us/visualstudio/debugger/get-started-debugging-multithreaded-apps?view=vs-2019

下面是这个演示的源代码,如果你想演示它,可以进行参考:

using System;
using System.Threading;

class Program {
  static void Main() {
   for (int i=0; i< 5; i++) {
     // Avoid capturing a loop variable in the lambda below
     int j = i;
     // So 2 thread are blocked on '0' case
     if (j == 1) { j = 0; }
     ThreadPool.QueueUserWorkItem(delegate { Method(j); });
   }
   Thread.Sleep(60000);
  }
  static void Method(int id) {
   switch(id) {
     case 0:
      Thread.Sleep(60000); break;
     case 1:
      Thread.Sleep(60000); break;
     case 2:
      Thread.Sleep(60000); break;
     case 3:
      Thread.Sleep(60000); break;
     case 4:
      Thread.Sleep(60000); break;
   }
  }
}

12、从反编译的IL代码中调试源代码

我们经常依赖一些黑盒组件:我们没有源代码的组件。

但是,在调试复杂行为时,观察甚至调试引用的黑盒组件引用的逻辑。这就是为什么从16.5版本开始, Visual Studio 2019 可以从编译好的程序中生成一些源代码。这样的源代码是可以调试的。这个特性是基于开源软件(OSS)工程:ILSpy( https://github.com/icsharpcode/ILSpy)。

反编译菜单可以在模块窗口的组件右键菜单(如下面的动图所示)和 Source Not FoundNo Symbols Loaded 对话框中给出。

IL 代码反编译为源代码不可能是完美的,因为一些源代码信息在编译时丢失了。因此,这个特性有一些限制,在这个官方文档的最后会解释: Generate source code from .NET assemblies while debugging

https://docs.microsoft.com/en-us/visualstudio/debugger/decompilation?view=vs-2019

结尾

Visual Studio非常出色,在调试方面尤其出色。 在这里,我试图选择一些既隐藏又经常有用的技巧,希望它们能帮助您提高生产率。

到此这篇关于12个Visual Studio调试效率技巧(小结)的文章就介绍到这了,更多相关VisualStudio调试技巧内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 分享Visual Studio原生开发的10个调试技巧(2)

    之前关于Visual Studio调试技巧的文章引起了大家很大的兴趣,以至于我决定分享更多调试的知识.以下的列表中你可以看到写原生开发的调试技巧(接着以前的文章来编号).这些技巧可以应用在VS2005或者更新版本中(当然有一些可以适用于旧版本).如果你继续,你可以知道每个技巧的详细信息. 技巧11:数据断点 当数据所在内存位置变化时,调试器将会中断.然而,这是唯一可能在一个时间创建4这样的硬件的数据断点.数据断点只能在编译的过程中添加,可以通过菜单(编译>新断点>新数据断点)或者通过断点窗口来

  • 分享Visual Studio原生开发的10个调试技巧

    最近碰巧读了Ivan Shcherbakov写的一篇文章,<11个强大的Visual Studio调试小技巧>.这篇文章只介绍了一些有关Visual Studio的基本调试技巧,但是还有其他一些同样有用的技巧.我整理了一些Visual Studio(至少在VS 2008下)原生开发的调试技巧.(如果你是工作在托管代码下,调试器会有更多的特性,在CodeProject中有介绍它们的文章),下面是我的整理的一些技巧: 异常中断 | Break on Exception Watch窗口中的伪变量 |

  • Visual Studio调试技巧汇总

    调试是软件开发周期中很重要的一部分.它具有挑战性,同时也很让人疑惑和烦恼.总的来说,对于稍大一点的程序,调试是不可避免的.最近几年,调试工具的发展让很多调试任务变的越来越简单和省时. 1 悬停鼠标查看表达式值 调试是很有挑战性的.比如在函数内逐步运行可以看出哪里出错,查看堆栈信息可以知道函数被谁调用等等. 但是无论哪种情况下,查看表达式和局部变量的值都是很麻烦的(把表达式和局部变量放到watch窗口里). 一种更简单的方法,把鼠标停在所需查看的数据上.如果是类或结构,那么点击展开可以很方便快速地

  • 12个Visual Studio调试效率技巧(小结)

    在这篇文章中,我们假定读者了解 VS 基本的调试知识,如: F5 开始使用调试器运行程序 F9 在当前行设置断点 F10 运行到下一个断点处 F5 从被调试的已停止程序恢复执行 F11 步进到函数内(如果当前程序指针指向一个函数) F10 步过函数(如果当前程序指针指向一个函数) Shift+F11 步出执行的函数 暂停执行 附加到进程 鼠标悬停时快速查看源代码中的元素 调试窗口:局部变量.监视.即时窗口.模块.调用堆栈.异常设置 许多开发人员使用这个功能强大的工具包来处理调试会话.然而, Vi

  • 超全整理visual studio快捷键使用技巧

    一.快捷键技巧 1.注释:CTRL+K+C 2.取消注释:CTRL+K+U 3.设置断点调试:F9,断点行不执行 4.回到上一个光标位置:CTRL± 5.前进到下一个光标位置:CTRL+Shift± 6.复制整行代码:光标停在该行,CTRL+C,再粘贴CTRL+V 7.剪切整行代码:光标停在该行,CTRL+X 8.删除整行代码:光标停在该行,CTRL+L 9.撤销:CTRL+Z 10.返撤销:CTRL+Y 11.调试(启动):F5 12.逐语句调试:F11 13.使用滚动条预览整个文件:工具—>

  • 你不知道的 IDEA Debug调试小技巧(小结)

    一.多线程调试断点 Intellij IDEA 的debug断点调试是有一个模式的选择的,就像下面这张图,平时我们都使用的是默认的 ALL(在Eclipse中默认是线程模式) ,这种模式我们只能将一个线程断下来,但其他线程却已经执行过了:而将其改为 Thread 后,就可以多个线程都断下来,并且可以很方便的切换线程的执行流程,这就是多线程调试. 在debug控制台能够很方便的查看线程的执行状态,也可以很方便的选择某个线程去执行: 二.回退断点 不知道大伙有没有遇到这样一个问题,当我们进行debu

  • C#编程和Visual Studio使用技巧(上)

    对开场白没兴趣?好吧,我们直接切入正题,下面介绍10个C#编程和Visual Studio IDE使用技巧. 1.Environment.Newline 你是否知道这个属性是与平台无关的?允许你根据每个平台输出新的换行字符. Console.WriteLine("My Tips On ,{0}C#", Environment.NewLine); 2.命名空间别名 你是否知道可以使用更短的别名代替长的命名空间?你是否遇到过需要限制完整的命名空间以避免产生歧义?看下面的代码示例,它是使用扩

  • 配置Visual Studio 以调试.net framework源代码第1/2页

    基本步骤注意,这个功能在Visual Studio 2008 Express版里不支持.1)安装Visual Studio 2008 QFE.这个QFE只是更新一个Visual Studio调试器的DLL,以便可以获取源代码,更多细节参加下载页面.2)运行Visual Studio 2008依次展开Tools->Options->Debugging->General.如果你在Visual Basic Profile环境下运行,你需要将lower left of the Options D

  • .NET Visual Studio 代码性能分析工具

    下面通过图文并茂的方式给大家介绍下,具体内容如下: 软件开发中的性能优化对程序员来说是一个非常重要的问题.一个小问题可能成为一个大的系统的瓶颈.但是对于程序员来说,通过自身去优化代码是十分困难的.幸运的是,有一些非常棒的工具可以帮助程序员进行代码分析和性能测试,从而大大简化程序员进行代码性能优化的过程.MSDN杂志2011年7月份曾发布主题为".NET代码分析工具和技术"的那一期,让广大程序员收获颇丰.四年过去之后,这些工具又进一步做出了很多改进,同时也出现了更多的选择.本文对当前主流

  • Visual Studio 2017 15.5 正式发布!性能再提升

    Visual Studio 2017 15.5 版本已正式发布,同时发布的还有 Visual Studio for Mac 7.3.此次更新包含主要性能改进,新特性以及 bug 修复.发行说明中文版目前尚未更新,可先查看英文版.部分亮点整理如下: 性能 大型 C# 和 Visual Basic 项目的解决方案加载时间几乎减半.调试和发布之间的切换时间明显缩短.在 .NET Core 项目中添加,删除和重命名文件和文件夹会更快.项目模板现在也应该比以前更快地展开,在最特殊的情况下,甚至可以看到最多

随机推荐