启动、中断、导航和停止 Visual Studio 调试器

主题内容

主题内容

开始调试

  • 附加到进程

  • 将自动在调试器中启动该应用程序

导航代码在调试会话中

  • 将代码使用或中断所有断点

  • 单步执行,在中,或者在代码中跳出

  • 运行到指定的位置或功能

  • 设置要执行的下一语句

  • 转到我的代码" Restrict

  • 步骤进入系统调用

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

停止调试

开始调试

当您的解决方案处于打开状态时是 Visual Studio,有三的选择开始调试:

选择 调试启动调试 (键盘:F5)。

您的应用程序开始然后运行直到:

  • 调试器到达断点。

  • 您在中选择 调试 菜单的 停止调试

  • 异常时引发。

  • 应用程序退出。

选择 调试单步执行 (键盘:F11) 或 调试逐过程 (键盘:F10)。

您的应用程序开始然后中断在第一行。

在源窗口中,选择可执行代码行并选择在上下文菜单中 运行到光标处

您的应用程序启动并运行,直到到达断点或光标位置,具体看是

y740d9d3.collapse_all(zh-cn,VS.110).gif附加到进程

调试器还可以附加到进程运行在 Visual Studio 之外的过程。在附加到程序后,可以使用调试器执行命令,检查程序状态,等等。您检查程序的能力可能受到限制,根据程序是否生成了使用调试信息,以及是否可以访问程序源代码的,因此,公共语言运行时 JIT 编译器是否跟踪调试信息。

附加到本地计算机上运行的进程

选择 调试附加到进程。在 附加到进程 对话框中,选择过程从 可用进程 列表,然后选择 附加

“附加到进程”对话框

有关更多信息,请参见附加到运行进程

y740d9d3.collapse_all(zh-cn,VS.110).gif将自动在调试器中启动该应用程序

有时,可能需要调试由另一个进程启动的应用程序的启动代码。这样的示例包括服务和自定义设置操作。在这些情况下,可以让调试器在应用程序启动时启动并自动附加。

  1. 启动注册表编辑器 (regedit.exe)。

  2. 导航到 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\image file execution options 文件夹。

  3. 选择要在调试器首先 app 的文件夹。

    如果该 app 的名称不列表作为子文件夹,选择" image file execution options 然后选择 新建,在快捷菜单上的 。选择新项,在快捷菜单上选择 重命名,然后输入该应用程序的名称。

  4. 在 app 文件夹的快捷菜单上,选择 新建字符串值

  5. New Value 将新值的名称。调试器。

  6. 在调试器项的快捷菜单上,选择 修改

  7. 在编辑器中字符串对话框中,在 数值数据 框中的类型 vsjitdebugger.exe。

    “编辑字符串”对话框

regedit.exe 中的自动调试器启动条目

主题内容

导航代码在调试会话中

y740d9d3.collapse_all(zh-cn,VS.110).gif将代码使用或中断所有断点

在调试使用 Visual Studio 调试器应用程序时,应用程序或者运行 (执行) 或处于中断模式。

调试器中断该应用程序的执行,当执行到达断点时,或者当发生异常时。您可以手动中断某个执行在 + 任何 + 时间。

断点是让调试器暂停您的应用程序的执行在确定点的信号。当执行在某个断点处挂起时,我们称程序处于中断模式。进入中断模式并不会停止或结束程序的执行;执行可以在任何时候继续。

大多数调试器功能,如查看在本地窗口的变量值或计算"监视"窗口中的表达式,只在中断模式下可用。您的应用程序的所有元素保持 (例如函数、变量和对象保留在内存中,),但是,它们的移动,而且将挂起。在中断模式下,您可以检查元素的位置和状态,以查看是否存在冲突或 Bug。还可以进行调整为 app,在中断模式下时

可以配置断点挂起基于多种情况的执行。请参见 使用断点与跟踪点。本节描述两种基本的方式将代码。

在代码中设置断点

若要在代码中设置简单断点,请打开在 Visual Studio 编辑器的源文件。设置光标在要中断的代码行,然后选择 断点,在上下文菜单 (键盘的 插入断点 : F9。在一行中执行之前,调试器中断执行。

设置断点

在 Visual Studio 的断点提供了一组丰富的其他功能,例如条件断点和跟踪点。请参见 使用断点与跟踪点

手动将代码

若要将代码下一行可用在执行 app 上,选择 调试全部中断 (键盘:Ctrl+Alt+Break)。

  • 如果使用调试只有启用"仅我的代码"选项,您可以断开在下一行代码在项目中。请参见 Restrict stepping to Just My Code

  • 如果正在调试多个程序,则默认情况下,断点或“全部中断”命令将影响所有被调试的程序。请参见本主题中的 Change the break behavior of multiple processes

  • 如果时中断,执行代码,没有相应的源或符号 (.pdf) 文件),调试器显示可帮助您查找相应的文件的 找不到的源文件未找到符号 页。请参见 查找符号 (.pdb)、源和二进制文件

    如果您无法访问支持文件,您仍可以调试"反汇编"窗口的程序集指令。

y740d9d3.collapse_all(zh-cn,VS.110).gif单步执行,在中,或者在代码中跳出

“单步执行”是最常见的调试过程之一。“单步执行”即一次执行一行代码。当您暂停执行,例如运行调试器附加到断点时,可以使用三个 调试 菜单命令逐句通过代码:

菜单命令

键盘快捷键

描述

逐语句

F11

如果某一行包含函数调用,“逐语句”仅执行调用本身,然后在函数内的第一个代码行处停止。否则,单步执行 执行下一条语句。

逐过程

F10

如果某一行包含函数调用,逐过程 执行调用函数,则暂停在代码在第一行调用函数。否则,单步执行 执行下一条语句。

跳出

Shift+F11

“跳出”将一直执行代码,直到函数返回,然后在调用函数中的返回点处中断。

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

  • 调试器通过代码语句实际单步执行而不是物理行。例如 if 子句可以写在一行内:

    int x = 42;
    string s = "Not answered";
    if( int x == 42) s = "Answered!";
    
    Dim x As Integet = 42
    Dim s As String = "Not answered"
    If x = 42 Then s = "Answered!"
    

    当单步执行此行时,调试器将该条件作为一步和这种结果为另一个 (在此示例中,条件为 true)。

y740d9d3.collapse_all(zh-cn,VS.110).gif运行到指定的位置或功能

有时您想执行到代码中的某一点,然后暂停执行。如果设置了断点在要中断的位置,请选择 调试启动调试,如果尚未开始调试,或 调试继续。(在两种情况下 F5 是热键)。调试器停止在代码中执行的下一断点。选择 调试继续,直至到达所需的断点。请参见本主题中的 Set breakpoints in the code

还可以运行到您在代码编辑器中的位置将光标,或者运行到指定的函数。

运行到光标位置

若要运行到光标位置,将光标放在代码可执行一行在源窗口。在编辑上下文菜单,选择 运行到光标处

运行对于调用堆栈上的函数

调用堆栈 窗口中,选择该功能,并从上下文菜单中选择 运行到光标处

运行到通过名称指定的函数

可以命令调试器运行应用程序,直至到达指定的函数。可以按名称指定函数也可以从调用堆栈选择它。

若要使用名称指定函数,选择 调试新建断点在函数处中断,然后输入函数和其他标识信息的名称。

“新建断点”对话框

如果重载函数或多个命名空间,您可以选择要在 选择断点 对话框需的功能。

“选择断点”对话框

y740d9d3.collapse_all(zh-cn,VS.110).gif设置要执行的下一语句

在中断调试器后,可以移动执行点设置要执行的代码的下一条语句。源窗口或“反汇编”窗口的空白区域中的黄色箭头标记要执行的下一条语句的位置。通过移动此箭头,可以跳过部分代码或返回到以前执行过的行。在某些情况下可以使用此方法,例如,跳过包含已知 bug 的代码段。

Example2

设置要执行的下一语句,使用以下过程之一:

  • 在源窗口中,将黄色箭头到要对同一源文件的下一条语句的位置

  • 在源窗口中,将该行的光标。接下来要做并选择在上下文菜单中 设置下一语句

  • 在反汇编窗口中,将在程序集指令的光标。接下来要做并选择在上下文菜单中 设置下一语句

警告说明警告

设置下一条语句将导致程序计数器直接跳到新位置。使用此命令时要小心:

  • 不执行旧执行点和新执行点之间的指令。

  • 如果向后移动执行点,则不撤消插入的指令。

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

  • 在本机 C++,因此,如果已启用运行时检查,设置下一条语句会导致引发异常,当执行到达方法的结尾时。

  • 当"编辑并继续"后,编辑的启用,设置下一语句 失败,如果您进行编辑,并继续"无法立即重新映射。例如,如果您编辑了 catch 块中的代码,将发生这种情况。发生这种情况。您将看到告诉您的错误消息操作不受支持。

说明说明

在托管代码中,在以下情况下不能移动下一条语句:

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

  • 使用实时调试启动调试。

  • 正在展开一个调用堆栈。

  • 已引发一个 System.StackOverflowException 或 System.Threading.ThreadAbortException 异常。

应用程序处于活动运行状态时不能设置下一条语句。要设置下一语句,调试器必须处于中断模式。

y740d9d3.collapse_all(zh-cn,VS.110).gif转到我的代码" Restrict

有时,您在调试过程中可能只希望查看自己编写的代码,而忽略其他代码(如系统调用)。为此,可以使用“仅我的代码”调试。“仅我的代码”将隐藏非用户代码,从而使这些代码不出现在调试器窗口中。单步执行时,调试器逐句通过所有非用户代码,但不在其中停止。

若要启用或禁用"仅我的代码"调试,请选择 调试选项和设置。在 调试常规 页,请选中或清除的 启用“仅我的代码

与非用户代码中区分用户代码,"仅我的代码"查看符号 (PDB) 文件和程序优化。

在标准调试版本中,关闭优化并为所有模块创建调试符号。运行调试版本时,将这些模块视为用户代码。但优化并且没有调试符号的函数不被视为用户代码。使用“仅我的代码”时,在库代码的断点处不会停止执行;通常情况下,我们并不想调试库代码。在“断点”窗口中,这些断点显示时带有“禁用断点”图标。

使用 选项 对话框,若要查看所有代码并在所有断点处停止,可以关闭"仅我的代码"调试。

此外还有三个特性影响调试器确定是否为“我的代码”:DebuggerNonUserCodeAttribute 告知调试器,其所应用到的代码不是“我的代码”;DebuggerHiddenAttribute 对调试器隐藏代码,即使“仅我的代码”关闭;DebuggerStepThroughAttribute 告知调试器逐句通过其所应用的代码,而不是单步执行代码。

启用"仅我的代码"时,可以选择 调试 菜单的 全部中断 并且没有显示"我的代码"处停止执行。在这种情况下不显示任何代码。此外,如果选择**“单步”**命令,则编译器将会跳到“我的代码”的下一行。

调试器对编程方式的中断语句(例如 Visual Basic Stop 语句)进行区别处理。即使启用了“仅我的代码”,调试器也总是在这些语句处中断。在这种情况下,将会显示非用户代码,而不会将其隐藏,但是单步执行仍会带您跳出非用户代码,转到“我的代码”的下一行。

说明说明

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

y740d9d3.collapse_all(zh-cn,VS.110).gif步骤进入系统调用

在加载了该系统代码的调试符号,且未启用"仅我的代码",则可以单步执行系统调用就可以执行其他任何调用。

若要了解如何禁用"仅我的代码",请参见 Restrict stepping to Just My Code

访问 Microsoft 符号文件,请参见" 查找符号 (.pdb)、源和二进制文件 " 主题的 使用窗口和其他 Microsoft 符号

加载特定系统组件的符号,在调试时:

  1. 打开"模块"窗口 (键盘:Ctrl+Alt+U)。

  2. 选择要加载符号的模块。

    查看**“符号状态”**列可以了解哪些模块加载了符号。

  3. 选择在上下文菜单中 加载符号

y740d9d3.collapse_all(zh-cn,VS.110).gif单步执行属性和运算符托管代码的

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

主题内容

停止调试

停止调试意味着终止调试会话。停止执行意味着终止正调试的进程并结束调试会话。请勿与中断执行混淆,后者意味着暂停正在调试的进程的执行但调试会话仍处于活动状态。进程分离停止调试进程,后者意味着它运行。

从 Visual Studio 停止调试

选择 调试停止调试

停止调试 终止正调试的进程,如果程序从 Visual Studio 启动的。如果附加到进程 (而不是生成其从 Visual Studio,进程继续运行。

停止调试并重新启动

选择 调试重新启动 停止当前正在调试会话并重新启动在调试器中启动项目。

关闭正在调试的应用程序

在退出正在调试的应用程序时,调试自动终止。