在 Visual Studio 上下文中,当调试应用时,这通常意味着你在附加了调试器的情况下(即在调试器模式下)运行应用程序。 执行此操作时,调试器在运行过程中可提供许多方法让你查看代码的情况。 你可以逐步执行代码、查看变量中存储的值、设置对变量的监视以查看值何时改变、检查代码的执行路径等。

01 设置断点(F9)并启动调试器(F5)

断点是可靠调试的最基本和最重要的功能。断点指示 Visual Studio 应在哪个位置挂起你的运行代码,以使你可以查看变量的值或内存的行为,或确定代码的分支是否运行。要进行调试,需要在调试器附加到应用进程的情况下启动应用。 F5(“调试”>“开始调试”)是执行该操作最常见的方法。因此我们首先设置断点再开始调试。

按 F5(“调试”>“开始调试”)或调试工具栏中的“开始调试”按钮 ,调试器将运行至它遇到的第一个断点。 如果应用尚未运行,则按 F5 会启动调试器并在第一个断点处停止。

02 单步调试(F11)

要在附加了调试器的情况下启动应用,请按 F11(“调试”>“单步执行”)。 F11 是单步执行”命令,每按一次,应用就执行下一个语句。 使用 F11 启动应用时,调试器会在执行的第一个语句上中断。

黄色箭头表示调试器暂停处的语句,它还在同一点上暂停应用执行(此语句尚未执行)。

F11 是一种以最详尽方式检查执行流的好方法。 (为了更快地浏览代码,VS展示了一些其他选项。)默认情况下,调试器会跳过非用户代码(如果需要更多详细信息,请参阅仅我的代码)。

在托管代码中将看到一个对话框,询问你是否希望在自动跳过属性和运算符时收到通知(默认行为)。 若稍后想更改设置,请在“调试”下的“工具”>“选项”菜单中禁用“单步跳过属性和运算符”设置。

03 单步跳过代码以跳过函数(F10)

如果所在的代码行是函数或方法调用),则可以按 F10(“调试”>“单步跳过”)而不是 F11。

按 F10 将使调试器前进,但不会单步执行应用代码中的函数或方法(代码仍将执行)。

上图中当前程序走到32行,按下 F10 后,直接走到34行,而没有进入到调用的方法中。

04 单步执行属性

如前所述在默认情况下,调试器会跳过托管属性和字段,但通过“单步执行特定内容”命令可替代此行为。

右键单击属性或字段,选择“单步执行特定内容”,然后选择一个可用选项。

在此示例中,通过“单步执行特定函数”将转到 shape.Width 的 Set 属性代码处。

05 导航代码(使用鼠标快速运行到代码中的某个点)

在调试器中,将鼠标悬停在代码行上,直到“运行到单击处”(将执行运行到此处)按钮出现在左侧。

自 Visual Studio 2017 起,可用使用“运行到单击位置”(将执行运行到此处)按钮。

低版本的VS,可以通过以下方式达到上述效果

(1)通过鼠标拖拽“黄色箭头”到目标位置行。

(2)参考第7步骤,“运行到光标处”功能。

单击“运行到单击处”(将执行运行到此处)按钮。 调试器将前进到单击的代码行。

使用此按钮类似于设置临时断点。 此命令对于快速到达应用代码的可见区域也很方便。 你可在任何打开的文件中使用“运行到单击处”。

06 使调试器从当前函数中跳出(Shift + F11)

有时你可能希望继续调试会话,但在整个当前函数中一直使调试器前进。

按 Shift+F11(或“调试”>“单步跳出”)。

此命令将恢复应用执行(并使调试器前进),直到当前函数返回。

07 运行到光标处(Ctrl + F10)

右键单击应用中的代码行,然后选择“运行到光标处”。 此命令将启动调试并在当前代码行上设置临时断点。

如果设置了断点,则调试器会在其命中的第一个断点处暂停。

按 F5,直至到达在其上选择了“运行到光标处”的代码行。

当编辑代码并希望快速设置临时断点并同时启动调试器时,此命令很有用。

调试时可使用“调用堆栈”窗口中的“运行到光标处”。

08 快速重启应用

单击调试工具栏中的“重启”按钮 (Ctrl+Shift+F5)。

当你按下“重启”时,与停止应用并重启调试器相比,它节省了时间。 调试器在执行代码命中的第一个断点处暂停。

若确实要停止调试器并返回到代码编辑器,可以按红色停止按钮而不是“重启”。

shapes 集合中有3笔记录。循环中运行到第2次时,控制台已经在第1次循环结束时输出打印了内容。

此时单击调试工具栏中的“重启”按钮 (Ctrl+Shift+F5),控制台窗口关闭,立即重新开启一个新的控制台窗口。此过程的速度比停止调试,然后再按下F5调试的速度更快。

09 使用数据提示检查变量
在调试器中暂停时,将鼠标悬停在对象上并看到其默认属性值。通常,当尝试调试问题时,通过此方式可以试图找出变量是否存储了期望它们在特定应用状态具有的值。

展开对象以查看其所有属性(例如本示例中的 sharp 对象)。

通常,在调试时,你需要快速检查对象的属性值,数据提示是一种实现此目的的好方法。

在大多数受支持的语言中,可在调试会话中途编辑代码。 有关详细信息,请参阅编辑并继续

10 使用“自动”和“局部变量”窗口检查变量

调试时,查看代码编辑器底部的“自动”窗口。

在“自动”窗口中,可看到变量及其当前值和类型。 “自动”窗口显示当前行或前一行使用的所有变量(在 C++ 中,该窗口显示前三个代码行中的变量。 查看文档以了解特定于语言的行为)。

接下来,查看“局部变量”窗口。 “局部变量”窗口显示当前范围中的变量。

有关详细信息,请参阅在“自动”窗口和“局部变量”窗口中检查变量

在 JavaScript 中,支持“局部变量”窗口,但不支持“自动”窗口。

11 设置监视

可使用“监视”窗口指定要关注的变量(或表达式)。

在调试时,右键单击对象并选择“添加监视”。

在本示例中,在 sharp 对象上设置了监视,当在调试器中移动时,可看到其值发生了变化。 与其他变量窗口不同,“监视”窗口始终显示正在监视的变量(当超出范围时,它们会变灰)。

有关详细信息,请参阅使用“监视”窗口和“快速监视”窗口设置监视

12 检查调用堆栈
调试时单击“调用堆栈”窗口,默认情况下,该窗口在右下方窗格中打开。
 

“调用堆栈”窗口显示方法和函数被调用的顺序。 最上面一行显示当前函数(此示例中的 Draw 方法)。 第二行显示 Draw 是从Main 函数调用的,依此类推。 调用堆栈是检查和理解应用执行流的好方法。

可双击代码行来查看该源代码,这也会更改调试器正在检查的当前范围。 此操作不会使调试器前进。

还可使用“调用堆栈”窗口中的右键单击菜单执行其他操作。 例如,你可将断点插入到指定的函数中,使用“运行到光标处”重启应用,然后检查源代码。 请参阅如何:检查调用堆栈

13 检查异常
应用引发异常时,调试器会将你转至引发异常的代码行。

异常帮助程序是帮助调试错误的好功能。 你还可以执行其他操作,如查看错误详细信息及从异常帮助程序添加监视。 或者,如有需要可更改引发特定异常的条件。 有关如何在代码中处理异常的详细信息,请参阅调试技术和工具

查看详细信息

展开“异常设置”节点以查看有关如何处理此异常类型的更多选项。异常设置 -> 编辑条件

14 编辑代码并继续调试

如果在调试会话期间发现一个要在代码中测试的更改,则也可以执行此操作。

  1. 单击 c2.First.Value 的第二个实例且将 c2.First.Value 更改为 c2.Last.Value

  2. 多次按 F10(或“调试”>“单步跳过”),向前移动调试器并执行已编辑的代码。

    F10 一次使调试器前进一个语句,但是是跳过函数而不是单步执行它们(跳过的代码仍然执行)。

15 移动指针以更改执行流

调试器暂停时,对源代码的边距中的黄色箭头或反汇编窗口标记要执行的下一个语句的位置。 你可以通过移动此箭头执行的下一个语句。 可以跳过了一部分代码,或返回到上一代码行。 移动指针可用于如跳过包含已知的 bug 的代码部分的情况。

若要更改要执行的下一个语句,调试器必须处于中断模式。 在源代码中或反汇编窗口中,将黄色箭头拖到不同的行,或右键单击你想要执行的下和选择的行设置下一语句

程序计数器直接跳转到新位置,并说明旧的和新执行点之间不会执行。 但是,如果向后移动执行点,则不撤消插入的指令。

1、将下一条语句移动到另一个函数或范围通常会导致调用堆栈损坏,导致一个运行时错误或异常。 如果尝试将下一条语句移动到另一个范围,则调试器将打开一个含有警告的对话框,并提供一个取消该操作的机会。

2、当启用“编辑并继续”时,如果你进行了“编辑并继续”无法立即重新映射的编辑,那么 “设置下一语句” 将失败。 例如,如果你编辑了 catch 块中的代码,将发生这种情况。 在此情况下,会显示错误消息,告知你不支持该操作。

在托管代码中,您不能移动下一个语句,如果:

(1)下一条语句与当前语句不在同一个方法中。

(2)在实时调试启动调试。

(3)正在进行的调用堆栈展开。

(4)已引发一个 System.StackOverflowException 或 System.Threading.ThreadAbortException 异常

Visual Studio 调试系列2 基本调试方法的更多相关文章

  1. Visual Studio 调试系列12 远程调试部署在远程计算机IIS上的ASP.NET应用程序

    系列目录     [已更新最新开发文章,点击查看详细] 要调试已部署到IIS的ASP.NET应用程序,请在部署应用程序的计算机上安装并运行远程工具,然后从Visual Studio附加到正在运行的应用 ...

  2. Visual Studio 调试系列11 远程调试

    系列目录     [已更新最新开发文章,点击查看详细] 你可以调试已部署在另一台计算机的 Visual Studio 应用程序. 要进行此操作,可使用 Visual Studio 远程调试器. 01 ...

  3. 64 位win 7或windows 8下的visual studio不能连接Oracle数据库调试网站的问题

    在64 位win 7或windows 8系统下,visual studio直接F5运行网站调试,你会发现不能连接Oracle数据库,会报一个“ORA-06413: Connection not ope ...

  4. [转]使用 Minidumps 和 Visual Studio .NET 进行崩溃后调试

    本文关键字:Minidumps, Windows, SEH, VisualC, .NET 摘要 本文讲述了 minidumps 是怎样工作的.当你的程序崩溃的时候应该如何生成它们.以及如何在 Visu ...

  5. WebApi-路由机制 Visual Studio 2015中的常用调试技巧分享

    WebApi-路由机制   一.WebApi路由机制是什么? 路由机制通俗点来说:其实就是WebApi框架将用户在浏览器中输入的Url地址和路由表中的路由进行匹配,并根据最终匹配的路由去寻找并匹配相应 ...

  6. visual studio code(vscode) 调试php(转)

    原文链接:http://www.cnblogs.com/CLR010/p/5276077.html visual studio code(vscode) 调试php   1.下载vscode (vis ...

  7. Visual Studio工具栏中无法选择调试设备

    Visual Studio工具栏中无法选择调试设备 在Visual Studio工具栏中,默认显示已经识别的设备.用户可以从中选择对应的设备,进行调试和部署App.但是由于误操作,可能导致该选项丢失. ...

  8. Visual Studio 2013 如何在停止调试Web程序后阻止IIS Express关闭

    vs2013 调试项目的时候,当停止调试的时候,端口就被断了.之前以为是IIS那边的控制问题,但是其他并行的项目运行都没有出现这种情况. 最初也没在意,直到现在实在忍受不了了,每次重开也太烦了.就去各 ...

  9. Visual Studio 2008打开vs2010解决方案的方法

    一个朋友遇到了个问题:用visual studio 2008软件,无法打开一个asp.net网站的sln解决方案.如下图,原因是此解决方案由vs2010生成的,必须由vs2010运行程序打开. 这样一 ...

随机推荐

  1. T4随记

    关于T4模板的信息我就不赘述了,百度一大堆 MSDN的介绍 https://msdn.microsoft.com/zh-cn/library/bb126478.aspx 下面是简单的一个示例,从类中获 ...

  2. std::string的Copy-on-Write:不如想象中美好(VC不使用这种方式,而使用对小字符串更友好的SSO实现)

    Copy-on-write(以下简称COW)是一种很重要的优化手段.它的核心思想是懒惰处理多个实体的资源请求,在多个实体之间共享某些资源,直到有实体需要对资源进行修改时,才真正为该实体分配私有的资源. ...

  3. 你一定能看懂的JDK动态代理

    前言:阅读这篇文章前,一定要知道什么是代理模式,具体可以参考这篇文章<设计模式(一):代理模式>. 在<设计模式(一):代理模式>一文中说了,程序员思思买书有两种选择:一种是选 ...

  4. 设计模式之装饰器模式(decorator pattern)

    装饰器模式主要对现有的类对象进行包裹和封装,以期望在不改变类对象及其类定义的情况下,为对象添加额外功能.是一种对象结构型模式.需要注意的是,该过程是通过调用被包裹之后的对象完成功能添加的,而不是直接修 ...

  5. React躬行记(4)——生命周期

    组件的生命周期(Life Cycle)包含三个阶段:挂载(Mounting).更新(Updating)和卸载(Unmounting),在每个阶段都会有相应的回调方法(也叫钩子)可供选择,从而能更好的控 ...

  6. 工作中vue项目前后端分离,调用后端本地接口出现跨域问题的完美解决

    在我们实际开发中,选择不错的前端框架可以为我们省掉很多时间,当然,有时我们也会遇到很多坑. 最近在做vue项目时就遇到了跨域问题,一般来说,出现跨域我们第一反应使用jsonp,但是这个只支持get请求 ...

  7. tensorflow学习笔记-bili莫烦

    bilibili莫烦tensorflow视频教程学习笔记 1.初次使用Tensorflow实现一元线性回归 # 屏蔽警告 import os os.environ[' import numpy as ...

  8. C# 死锁 TaskCompletionSource

    在异步转同步时,使用不当容易造成死锁(程序卡死) 看如下案例: 有一个异步方法 private static async Task TestAsync() { Debug.WriteLine(&quo ...

  9. HTTP 学习笔记03

    通用信息头 Cache-Control : no-cache(不缓存当前请求) [*] Connection:close(返回当前请求后立即断开)[*] Date:...(HTTP消息产生的时间) P ...

  10. C#8.0: 在 LINQ 中支持异步的 IAsyncEnumerable

    C# 8.0中,提供了一种新的IAsyncEnumerable<T>接口,在对集合进行迭代时,支持异步操作.比如在读取文本中的多行字符串时,如果读取每行字符串的时候使用同步方法,那么会导致 ...