启动、中断、导航和停止 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,进程继续运行。

停止调试并重新启动

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

关闭正在调试的应用程序

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