使用 Visual Studio 调试程序在代码中导航

Visual Studio 调试器可帮助你浏览代码,以检查应用的状态并显示其执行流(也被称为代码单步执行)。 可以使用键盘快捷方式、调试命令、断点和其他功能来快速访问要检查的代码。 通过熟悉调试程序导航命令和快捷方式,可以更快、更轻松地查找和解决应用问题。 有关与代码导航和调试相关的最常用键盘快捷方式的列表,请参阅键盘快捷方式中的调试部分。

注意

如果是首次尝试调试代码,那么在阅读本文前,可能需要阅读零基础调试调试技术和工具

开始调试并进入中断模式

某些导航命令会启动应用并自动附加调试程序。 应用根据用于启动导航的命令在特定代码行上暂停,并且你会进入中断模式(即,应用在调试程序中暂停)。

在“中断模式”中,应用执行被挂起,而函数、变量和对象保留在内存中。 调试程序进入中断模式后,即可在代码中导航。 有两种很常见的方法可以快速进入中断模式:

  • 设置断点并启动应用。

  • 运行到特定位置或函数

    例如,在 Visual Studio 的代码编辑器中,可以使用运行到光标处命令启动应用,附加调试程序并进入中断模式。 然后,可以使用步骤命令导航代码。

    显示依次选择“运行到光标处”和 F11 的动画。

    显示依次选择“运行到光标处”和 F11 的动画。

代码单步执行命令可用于启动应用,但在进入中断模式后更常用。

某些导航命令主要在中断模式下使用(即,在调试程序中暂停时使用)。

调试和中断模式

进入中断模式后,可以使用各种命令在代码中导航。 你可以检查变量的值,以查找冲突或 bug。 对于某些项目类型,还可以在中断模式下对应用进行调整。

大多数调试程序窗口(例如模块监视窗口)仅在将调试程序附加到应用后才可用。 某些调试程序功能(例如在局部变量窗口中查看变量值或在监视窗口中计算表达式)仅在调试程序暂停时(即在中断模式下)可用。

注意

如果中断未加载源或符号 (.pdb) 文件的代码,调试程序会显示未找到源文件未找到符号页面,这可帮助你查找和加载文件。 请参阅指定符号 (.pdb) 和源文件。 如果无法加载符号或源文件,仍可以在反汇编窗口中调试汇编指令。

代码单步执行

代码单步执行是指在附加调试程序的情况下,一次执行应用程序代码的一个语句。 调试程序步骤命令可帮助你观察每个语句的效果,并详细了解其执行流。

单步执行代码

若要在调试时在每个语句上停止,请使用调试>单步执行或选择 F11

调试器会逐句通过代码语句,而不是物理行。 例如,if 子句可以写在一行内:

int x = 42;
string s = "Not answered";
if( int x == 42) s = "Answered!";

但是,当你单步执行此行时,调试程序会将条件视为一步,将结果视为另一步。 在前面的示例中,条件为 true。

在嵌套函数调用上, “逐语句” 将进入并单步执行嵌套最深的函数。 例如,如果对类似 Func1(Func2()) 的调用使用单步执行,调试器将单步执行函数 Func2

提示

在运行每行代码时,你可以将鼠标悬停在变量上以查看其值,或使用 局部变量监视窗口来观察值的变化。 还可以在单步执行函数的过程中直观地跟踪调用堆栈。 (仅限 Visual Studio Enterprise,请参阅调试时映射调用堆栈上的方法。)

逐句通过代码并跳过某些函数

调试时,你可能不关心某个函数。 或者,你可能知道某些代码可正常工作,如经过充分测试的库代码。 你可以在单步执行代码时使用以下命令跳过代码。 这些函数仍会运行,但调试程序会跳过它们。

键盘命令 调试菜单命令 描述
F10 逐过程 如果当前行包含函数调用,则单步跳过运行代码,然后在被调用函数返回后,在第一行代码处挂起执行。
Shift+F11 跳出 单步跳出继续运行代码,并在当前函数返回时挂起执行。 调试器跳过当前函数。

运行到特定位置或函数

当你确切知道要检查的代码或者知道要开始进行调试的位置时,你可能更想要直接运行到特定位置或函数。

  • 如果你认为可能想要重复使用断点,最好设置断点。
  • 其他方法为方便起见,类似于设置临时断点。

运行到代码中的断点

若要在代码中设置简单的断点,请选择要挂起执行的代码行的最左侧边距。 你还可以选择该行,然后选择 F9,选择调试>切换断点,或者右键单击并选择断点>插入断点。 断点显示为代码行左边距中的一个红点。 调试程序在行运行之前挂起执行。

显示如何设置断点的屏幕截图。

显示如何设置断点的屏幕截图。

Visual Studio 中的断点提供了一组丰富的功能,例如条件断点和跟踪点。 有关详细信息,请参阅使用断点

运行到函数断点

你可以将调试程序设置为一直运行,直至到达指定的函数。 可以通过名称指定函数,也可以从调用堆栈中选择函数。

按名称指定函数断点:

  1. 选择调试>新建断点>函数断点

  2. 在“新建函数断点”对话框中,输入函数名称并选择其语言:

    显示“新建函数断点”对话框的屏幕截图。

    显示“新建函数断点”对话框的屏幕截图。

  3. 选择“确定”。

如果函数已重载或位于多个命名空间中,则可以在“断点”窗口中选择所需的断点:

显示断点窗口的屏幕截图。

显示断点窗口的屏幕截图。

从调用堆栈中选择函数断点:

  1. 调试时,通过选择调试>窗口>调用堆栈打开调用堆栈窗口。

  2. 调用堆栈窗口中,右键单击函数,然后选择运行到光标处,或选择 Ctrl+F10

有关直观地跟踪调用堆栈的信息,请参阅调试时映射调用堆栈上的方法

运行到光标位置

若要运行到光标位置,请在源代码或调用堆栈窗口中,选择要在其所在位置中断的行,然后右键单击并选择运行到光标处,或选择 Ctrl+F10。 选择运行到光标处类似于设置临时断点

强制运行到光标位置

若要运行到光标位置,请在源代码或调用堆栈窗口中,选择要在其所在位置中断的行,然后右键单击并选择强制运行到光标处。 选择强制运行到光标处将跳过所有断点和第一次异常,直到调试程序到达光标所在的代码行。

运行到单击处

在调试程序暂停时,可将鼠标悬停在源代码中的某个语句上或反汇编窗口中,然后选择将执行运行到此处绿色箭头。 使用“运行到单击处”类似于设置临时断点

显示“运行到单击处”和绿色箭头的屏幕截图。

注意

从 Visual Studio 2017 开始,运行到单击处可用。

强制运行到单击处

在调试程序暂停时,可将鼠标悬停在源代码中的某个语句上,同时按住 Shift 键,并选择强制执行运行到此处(绿色双箭头)。 如果选择此选项,则应用程序会附加 Visual Studio 调试程序,并在光标位置处暂停。 在执行期间发现的任何断点和首次异常将被暂时禁用。

显示“强制运行到单击处”的屏幕截图。

注意

从 Visual Studio 2022 开始,强制运行到单击可用。

手动中断代码

若要在正在运行的应用中的下一可用代码行处中断,请选择调试>全部中断,或选择 Ctrl+Alt+Break

调试非用户代码

默认情况下,调试器会通过启用名为仅我的代码的设置来尝试仅调试你的应用代码。 有关此功能如何适用于各种项目类型和语言以及可以如何对其进行自定义的详细信息,请参阅仅我的代码

若要在调试时查看框架代码、第三方库代码或系统调用,可以禁用“仅我的代码”。 在工具(或调试)>选项>调试中,清除启用仅我的代码复选框。 如果禁用“仅我的代码”,非用户代码会在调试器窗口中显示,且调试器可以单步执行非用户代码。

注意

设备项目不支持“仅我的代码”。

调试系统代码

如果你已加载 Microsoft 系统代码的调试符号,并已禁用“仅我的代码”,则可以像执行任何其他调用一样单步执行系统调用。

从 Visual Studio 2022 版本 17.7 开始,可在单步执行外部代码时自动编译 .NET 代码,而无需手动加载调试符号。 有关详细信息,请参阅在调试时从 .NET 程序集生成源代码

若要了解如何加载 Microsoft 符号,请参阅配置符号文件和加载选项的位置

加载特定系统组件的符号:

  1. 在调试时,通过选择调试>窗口>模块,或按 Ctrl+Alt+U 打开模块窗口。

  2. 模块窗口中,可以通过符号状态列了解哪些模块加载了符号。 右键单击要为其加载符号的模块,然后选择加载符号

单步执行托管代码中的属性和运算符

默认情况下,调试器将逐过程执行托管代码中的属性和运算符。 在多数情况下,此行为会提供较好的调试体验。 若要启用单步执行属性或运算符,请选择调试>选项。 在调试>常规页面上,清除单步跳过属性和运算符(仅限托管)复选框。

移动指针以更改执行流

可以通过移动黄色执行指针来更改将运行的下一个语句。 在中断模式下可以使用此功能。

这是一项高级调试程序功能。 有关详细信息,请参阅移动执行指针