12个visualstudio调试效率技巧(代码片段)

yantuguiguziPGJ yantuguiguziPGJ     2023-02-26     571

关键词:

目录

1、运行到光标位置

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

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

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

5、条件断点

6、跟踪断点

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

8、查看函数返回的值

9、重新附加到进程

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

11、在源码中显示线程

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

结尾


在这篇文章中,我们假定读者了解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个visualstudio调试效率技巧(代码片段)

...使用这个功能强大的工具包来处理调试会话。然而,VisualStudio调试工具提供了更多的功能。下面是一系列VisualStudio调试效率技巧。注意,这些提示和快捷方式已经在的Visualstudio20191 查看详情

12个visualstudio调试效率技巧(代码片段)

...使用这个功能强大的工具包来处理调试会话。然而,VisualStudio调试工具提供了更多的功能。下面是一系列VisualStudio调试效率技巧。注意,这些提示和快捷方式已经在的Visualstudio20191 查看详情

visualstudio调试效率技巧(代码片段)

...发软件的过程中,必不可少的过程就是软件调试,那么在VisualStudio中如何进行调试呢?这里主要写给小白的一些建议和用法。在这篇文章中,我们假定读者了解VS基本的调试知识,如:F5开始使用调试器运行程序F9在当前行设置断... 查看详情

visualstudio2015中的常用调试技巧分享

.NET技术交流群:337901356欢迎您的加入!为什么要学习调试?  调试(Debug)是作为一个程序员必须要学会的东西,学会调试可以极大的提高开发效率,排错时间,很多人不喜欢调试,但我认为这是一个很不可取的选择,调试... 查看详情

前端调试效率低?试试这10个“chrome开发者工具”使用技巧

...分享一些使用“Chrome开发者工具”的小技巧。包括调试,优化页面渲染速度等。希望能提升Web开发人员的工作效率。 1,打开ShadowDOM显示浏览器对例如Video、Password等组件进行了封装,无法查看到组件的详细代码,不利... 查看详情

visualstudio常用小技巧一:代码段+快捷键+插件=效率

用了visualstudio5年多,也该给自己做下备忘录了。每次进新的组换新的电脑,安装自己熟悉的环境又得重新配置,不做些备忘老会忘记一些东西。工具用的好,效率自然翻倍。1,代码段在VisualStudio可以自己添加自己喜欢的代码段... 查看详情

你可能不知道的14个javascript调试技巧(代码片段)

以更快的速度和更高的效率调试你的JavaScript了解你的工具可以在完成任务的过程中发挥重大作用。尽管传言JavaScript难以调试,但是如果你掌握了一些调试技巧,那么你将会花费更少的时间来解决这些错误。我们已经列出了14个... 查看详情

js调试必备的5个debug技巧

...; debugger语句用于停止执行JavaScript,并调用(如果可用)调试函数。使用debugger语句类似于在代码中设置断点。通常,你可以通过按下F12开启调试工具,并在调试菜单中选择"Console"。进入断点后,可以双击下面的某行代码,设新断... 查看详情

10个javascript调试技巧,帮你更好更快地调试代码

...;group_id=6765841109454160396&req_id=2020012011362701001404009605C5B8C5调试技巧,在任何一项技术研发中都可谓是必不可少的技能。掌握各种调试技巧,必定能在工作中起到事半功倍的效果。譬如,快速定位问题、降低故障概率、帮助分析逻... 查看详情

lua-调试技巧(代码片段)

title:lua-调试技巧categories:Luatags:[lua,调试,技巧]date:2022-07-1416:31:27comments:falsemathjax:truetoc:truelua-调试技巧前篇游戏lua脚本调试技巧,达到修改逻辑脚本后能实时生效执行,提高开发效率pc端editor模式新建一个测试代码脚本gDebugCustom=gD... 查看详情

lua-调试技巧(代码片段)

title:lua-调试技巧categories:Luatags:[lua,调试,技巧]date:2022-07-1416:31:27comments:falsemathjax:truetoc:truelua-调试技巧前篇游戏lua脚本调试技巧,达到修改逻辑脚本后能实时生效执行,提高开发效率pc端editor模式新建一个测试代码脚本gDebugCustom=gD... 查看详情

lua-调试技巧(代码片段)

title:lua-调试技巧categories:Luatags:[lua,调试,技巧]date:2022-07-1416:31:27comments:falsemathjax:truetoc:truelua-调试技巧前篇游戏lua脚本调试技巧,达到修改逻辑脚本后能实时生效执行,提高开发效率pc端editor模式新建一个测试代码脚本gDebugCustom=gD... 查看详情

提升前端开发效率及查错能力的小技巧(代码片段)

...,在工作中感到最痛苦的除了无止境的改需求之外,就是调试bug阶段了,有时候开发一个网站也就两个星期左右,但调试起bug来一调就是几个小时!浪费时间不说,效率又低,作为程序员如果自己不懂得心疼自己(摸摸头顶...)... 查看详情

继续分享5个实用的vs调试技巧(代码片段)

继续分享5个实用的vs调试技巧原总结调试vs2019vs前言我在上一篇文章《5个非常实用的vs调试技巧》中分享了5个我认为非常值得了解的vs调试技巧,本周继续分享5个很基础但同样实用的调试技巧。1.条件断点作用简介:顾名思义,... 查看详情

pytorch中,18个速度和内存效率优化技巧(代码片段)

PyTorch中,18个速度和内存效率优化技巧文章目录PyTorch中,18个速度和内存效率优化技巧你为什么要读这篇文章?列表:示例代码指导思想1、把数据移动到SSD中2.在加载数据和数据增强的时候异步处理3.使用pinnedmemory来降... 查看详情

经验总结macidea调试技巧大大提高研发效率

设置断点​行断点就是在代码的左边单击,红色的圆点就代表断点成功,也就是一般最常用的断点在代码运行到这一行的时候会触发。​方法断点方法断点就是断点在方法签名上,在调用这个方法时会触发断点。​fie... 查看详情

visualstudio高效调试手段与技巧总结,值得收藏!

目录1、对0xCCCCCCCC、0xCDCDCDCD和0xFEEEFEEE等常见异常值的辨识度2、遇到Debug下的报错弹框,点击重试,查看函数调用堆栈3、调试时,程序和调试器都发生了闪退,可以尝试到Output窗口中找线索4、被废弃的API函数IsBadRe... 查看详情

visualstudio调试技巧---output窗口输出定位

在使用VC++时,经常使用OutputDebugString往往Output窗口写一些调试信息,如果输出信息遵循某种格式,那么在Output窗口中点击相应输出文本就会跳到相应的代码行中。具体格式MSDN中有说,简单的说法,在输出文本的最前面是"文件名(... 查看详情