使用 Visual Studio 调试器浏览代码

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

说明

如果你不熟悉调试代码,建议先阅读 调试,调试技术和工具,然后再阅读本文。

开始调试并进入中断模式

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

在中断模式下,当函数、变量和对象保留在内存中时,应用执行将暂停。 当调试器处于中断模式时,可以浏览代码。 可通过两种非常常见的方法快速进入中断模式:

  • 设置断点 并启动应用。

  • 运行到特定位置或函数

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

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

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

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

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

调试和中断模式

处于中断模式时,可以使用各种命令在代码中导航。 可以检查变量的值以查找违例或错误。 对于某些项目类型,还可以在中断模式下对应用进行调整。

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

说明

如果进入未加载源文件或符号文件(.pdb)的代码,调试器将显示 “找不到源文件”“找不到符号” 页,帮助您查找和加载这些文件。 请参阅指定符号 (.pdb) 和源文件。 如果无法加载符号或源文件,仍然可以在 反汇编 窗口中调试程序集说明。

代码单步执行

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

单步执行代码

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

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

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

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

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

提示

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

单步调试代码并跳过某些函数

调试时,你可能不会关心某个功能。 或者,你可能知道某些代码的工作原理,例如经过良好测试的库代码。 你可以在单步执行代码时使用以下命令跳过代码。 函数仍在运行,但调试器会跳过它们。

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

运行到特定位置或函数

当确切地知道要检查的代码或知道要从何处开始调试时,你可能更喜欢直接运行到特定位置或函数。

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

运行到代码中的断点

若要在代码中设置简单的断点,请选择要暂停执行的代码行旁边的最左边距。 你还可以选择该行,然后选择 F9,选择“调试”>“切换断点”,或者右键单击并选择“断点”>“插入断点”。 断点在代码行旁边的左边距中显示为红点。 调试器会在代码行运行前暂停执行。

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

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

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

运行到函数断点

可以将调试器设置为运行,直到它达到指定函数为止。 可以按名称指定函数,也可以从调用堆栈中选择它。

按名称指定函数断点:

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

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

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

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

  3. 选择“确定”。

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

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

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

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

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

  2. 在“调用堆栈” 窗口中,右键单击某个函数并选择 “运行到光标”,或选择 Ctrl+F10

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

运行到光标位置

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

强制运行到光标位置

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

运行到单击处

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

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

说明

从 Visual Studio 2017 开始,Run to Click 功能可用。

强制运行到单击处

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

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

说明

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

手动中断代码

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

调试非用户代码

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

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

说明

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

调试系统代码

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

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

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

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

  1. 调试时,选择“调试>Windows>模块”按 Ctrl+Alt+U,打开“模块” 窗口。

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

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

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

移动指针以更改执行流

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

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