在 Visual Studio 上下文中,当调试应用时,这一般意味着你在附加了调试器的状况下(即在调试器模式下)运行应用程序。 执行此操做时,调试器在运行过程当中可提供许多方法让你查看代码的状况。 你能够逐步执行代码、查看变量中存储的值、设置对变量的监视以查看值什么时候改变、检查代码的执行路径等。html
断点是可靠调试的最基本和最重要的功能。断点指示 Visual Studio 应在哪一个位置挂起你的运行代码,以使你能够查看变量的值或内存的行为,或肯定代码的分支是否运行。要进行调试,须要在调试器附加到应用进程的状况下启动应用。 F5(“调试”>“开始调试”)是执行该操做最多见的方法。所以咱们首先设置断点再开始调试。windows
按 F5(“调试”>“开始调试”)或调试工具栏中的“开始调试”按钮 ,调试器将运行至它遇到的第一个断点。 若是应用还没有运行,则按 F5 会启动调试器并在第一个断点处中止。编辑器
要在附加了调试器的状况下启动应用,请按 F11(“调试”>“单步执行”)。 F11 是单步执行”命令,每按一次,应用就执行下一个语句。 使用 F11 启动应用时,调试器会在执行的第一个语句上中断。函数
黄色箭头表示调试器暂停处的语句,它还在同一点上暂停应用执行(此语句还没有执行)。工具
F11 是一种以最详尽方式检查执行流的好方法。 (为了更快地浏览代码,VS展现了一些其余选项。)默认状况下,调试器会跳过非用户代码(若是须要更多详细信息,请参阅仅个人代码)。visual-studio
在托管代码中将看到一个对话框,询问你是否但愿在自动跳过属性和运算符时收到通知(默认行为)。 若稍后想更改设置,请在“调试”下的“工具”>“选项”菜单中禁用“单步跳过属性和运算符”设置。测试
若是所在的代码行是函数或方法调用),则能够按 F10(“调试”>“单步跳过”)而不是 F11。ui
按 F10 将使调试器前进,但不会单步执行应用代码中的函数或方法(代码仍将执行)。
spa
上图中当前程序走到32行,按下 F10 后,直接走到34行,而没有进入到调用的方法中。debug
如前所述在默认状况下,调试器会跳过托管属性和字段,但经过“单步执行特定内容”命令可替代此行为。
右键单击属性或字段,选择“单步执行特定内容”,而后选择一个可用选项。
在此示例中,经过“单步执行特定函数”将转到 shape.Width 的 Set 属性代码处。
在调试器中,将鼠标悬停在代码行上,直到“运行到单击处”(将执行运行到此处)按钮出如今左侧。
自 Visual Studio 2017 起,可用使用“运行到单击位置”(将执行运行到此处)按钮。
低版本的VS,能够经过如下方式达到上述效果
(1)经过鼠标拖拽“黄色箭头”到目标位置行。
(2)参考第7步骤,“运行到光标处”功能。
单击“运行到单击处”(将执行运行到此处)按钮。 调试器将前进到单击的代码行。 使用此按钮相似于设置临时断点。 此命令对于快速到达应用代码的可见区域也很方便。 你可在任何打开的文件中使用“运行到单击处”。
有时你可能但愿继续调试会话,但在整个当前函数中一直使调试器前进。
按 Shift+F11(或“调试”>“单步跳出”)。
此命令将恢复应用执行(并使调试器前进),直到当前函数返回。
右键单击应用中的代码行,而后选择“运行到光标处”。 此命令将启动调试并在当前代码行上设置临时断点。
若是设置了断点,则调试器会在其命中的第一个断点处暂停。
按 F5,直至到达在其上选择了“运行到光标处”的代码行。
当编辑代码并但愿快速设置临时断点并同时启动调试器时,此命令颇有用。
调试时可以使用“调用堆栈”窗口中的“运行到光标处”。
单击调试工具栏中的“重启”按钮 (Ctrl+Shift+F5)。
当你按下“重启”时,与中止应用并重启调试器相比,它节省了时间。 调试器在执行代码命中的第一个断点处暂停。
若确实要中止调试器并返回到代码编辑器,能够按红色中止按钮而不是“重启”。
shapes 集合中有3笔记录。循环中运行到第2次时,控制台已经在第1次循环结束时输出打印了内容。
此时单击调试工具栏中的“重启”按钮 (Ctrl+Shift+F5),控制台窗口关闭,当即从新开启一个新的控制台窗口。此过程的速度比中止调试,而后再按下F5调试的速度更快。
展开对象以查看其全部属性(例如本示例中的 sharp 对象)。
一般,在调试时,你须要快速检查对象的属性值,数据提示是一种实现此目的的好方法。
在大多数受支持的语言中,可在调试会话中途编辑代码。 有关详细信息,请参阅编辑并继续。
调试时,查看代码编辑器底部的“自动”窗口。
在“自动”窗口中,可看到变量及其当前值和类型。 “自动”窗口显示当前行或前一行使用的全部变量(在 C++ 中,该窗口显示前三个代码行中的变量。 查看文档以了解特定于语言的行为)。
接下来,查看“局部变量”窗口。 “局部变量”窗口显示当前范围中的变量。
有关详细信息,请参阅在“自动”窗口和“局部变量”窗口中检查变量。
在 JavaScript 中,支持“局部变量”窗口,但不支持“自动”窗口。
可以使用“监视”窗口指定要关注的变量(或表达式)。
在调试时,右键单击对象并选择“添加监视”。
在本示例中,在 sharp 对象上设置了监视,当在调试器中移动时,可看到其值发生了变化。 与其余变量窗口不一样,“监视”窗口始终显示正在监视的变量(当超出范围时,它们会变灰)。
有关详细信息,请参阅使用“监视”窗口和“快速监视”窗口设置监视
“调用堆栈”窗口显示方法和函数被调用的顺序。 最上面一行显示当前函数(此示例中的 Draw
方法)。 第二行显示 Draw 是从Main 函数调用的,依此类推。 调用堆栈是检查和理解应用执行流的好方法。
可双击代码行来查看该源代码,这也会更改调试器正在检查的当前范围。 此操做不会使调试器前进。
还可以使用“调用堆栈”窗口中的右键单击菜单执行其余操做。 例如,你可将断点插入到指定的函数中,使用“运行到光标处”重启应用,而后检查源代码。 请参阅如何:检查调用堆栈。
异常帮助程序是帮助调试错误的好功能。 你还能够执行其余操做,如查看错误详细信息及从异常帮助程序添加监视。 或者,若有须要可更改引起特定异常的条件。 有关如何在代码中处理异常的详细信息,请参阅调试技术和工具。
查看详细信息
展开“异常设置”节点以查看有关如何处理此异常类型的更多选项。异常设置 -> 编辑条件
若是在调试会话期间发现一个要在代码中测试的更改,则也能够执行此操做。
单击 c2.First.Value
的第二个实例且将 c2.First.Value
更改成 c2.Last.Value
。
屡次按 F10(或“调试”>“单步跳过”),向前移动调试器并执行已编辑的代码。
F10 一次使调试器前进一个语句,可是是跳过函数而不是单步执行它们(跳过的代码仍然执行)。
调试器暂停时,对源代码的边距中的黄色箭头或反汇编窗口标记要执行的下一个语句的位置。 你能够经过移动此箭头执行的下一个语句。 能够跳过了一部分代码,或返回到上一代码行。 移动指针可用于如跳过包含已知的 bug 的代码部分的状况。
若要更改要执行的下一个语句,调试器必须处于中断模式。 在源代码中或反汇编窗口中,将黄色箭头拖到不一样的行,或右键单击你想要执行的下和选择的行设置下一语句。
程序计数器直接跳转到新位置,并说明旧的和新执行点之间不会执行。 可是,若是向后移动执行点,则不撤消插入的指令。
一、将下一条语句移动到另外一个函数或范围一般会致使调用堆栈损坏,致使一个运行时错误或异常。 若是尝试将下一条语句移动到另外一个范围,则调试器将打开一个含有警告的对话框,并提供一个取消该操做的机会。
二、当启用“编辑并继续”时,若是你进行了“编辑并继续”没法当即从新映射的编辑,那么 “设置下一语句” 将失败。 例如,若是你编辑了 catch 块中的代码,将发生这种状况。 在此状况下,会显示错误消息,告知你不支持该操做。
在托管代码中,您不能移动下一个语句,若是:
(1)下一条语句与当前语句不在同一个方法中。
(2)在实时调试启动调试。
(3)正在进行的调用堆栈展开。
(4)已引起一个 System.StackOverflowException 或 System.Threading.ThreadAbortException 异常