启动、中断、导航和停止 Visual Studio 调试器
主题内容
主题内容
开始调试
附加到进程
将自动在调试器中启动该应用程序
导航代码在调试会话中
将代码使用或中断所有断点
单步执行,在中,或者在代码中跳出
运行到指定的位置或功能
设置要执行的下一语句
转到我的代码" Restrict
步骤进入系统调用
单步执行属性和运算符托管代码的
停止调试
开始调试
当您的解决方案处于打开状态时是 Visual Studio,有三的选择开始调试:
选择 调试,启动调试 (键盘:F5)。 |
您的应用程序开始然后运行直到:
|
选择 调试,单步执行 (键盘:F11) 或 调试,逐过程 (键盘:F10)。 |
您的应用程序开始然后中断在第一行。 |
在源窗口中,选择可执行代码行并选择在上下文菜单中 运行到光标处。 |
您的应用程序启动并运行,直到到达断点或光标位置,具体看是 |
附加到进程
调试器还可以附加到进程运行在 Visual Studio 之外的过程。 在附加到程序后,可以使用调试器执行命令,检查程序状态,等等。 您检查程序的能力可能受到限制,根据程序是否生成了使用调试信息,以及是否可以访问程序源代码的,因此,公共语言运行时 JIT 编译器是否跟踪调试信息。
附加到本地计算机上运行的进程
选择 调试,附加到进程。 在 附加到进程 对话框中,选择过程从 可用进程 列表,然后选择 附加。
有关更多信息,请参见附加到运行进程。
将自动在调试器中启动该应用程序
有时,可能需要调试由另一个进程启动的应用程序的启动代码。 这样的示例包括服务和自定义设置操作。 在这些情况下,可以让调试器在应用程序启动时启动并自动附加。
启动注册表编辑器 (regedit.exe)。
导航到 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\image file execution options 文件夹。
选择要在调试器首先 app 的文件夹。
如果该 app 的名称不列表作为子文件夹,选择" image file execution options 然后选择 新建,在快捷菜单上的 键。 选择新项,在快捷菜单上选择 重命名,然后输入该应用程序的名称。
在 app 文件夹的快捷菜单上,选择 新建,字符串值。
从 New Value 将新值的名称。调试器。
在调试器项的快捷菜单上,选择 修改。
在编辑器中字符串对话框中,在 数值数据 框中的类型 vsjitdebugger.exe。
主题内容
导航代码在调试会话中
将代码使用或中断所有断点
在调试使用 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)、源和二进制文件。
如果您无法访问支持文件,您仍可以调试"反汇编"窗口的程序集指令。
单步执行,在中,或者在代码中跳出
“单步执行”是最常见的调试过程之一。 “单步执行”即一次执行一行代码。 当您暂停执行,例如运行调试器附加到断点时,可以使用三个 调试 菜单命令逐句通过代码:
菜单命令 |
键盘快捷键 |
描述 |
---|---|---|
逐语句 |
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)。
运行到指定的位置或功能
有时您想执行到代码中的某一点,然后暂停执行。 如果设置了断点在要中断的位置,请选择 调试、启动调试,如果尚未开始调试,或 调试,继续。 (在两种情况下 F5 是热键)。 调试器停止在代码中执行的下一断点。 选择 调试,继续,直至到达所需的断点。 请参见本主题中的 Set breakpoints in the code 。
还可以运行到您在代码编辑器中的位置将光标,或者运行到指定的函数。
运行到光标位置
若要运行到光标位置,将光标放在代码可执行一行在源窗口。 在编辑上下文菜单,选择 运行到光标处。
运行对于调用堆栈上的函数
在 调用堆栈 窗口中,选择该功能,并从上下文菜单中选择 运行到光标处。
运行到通过名称指定的函数
可以命令调试器运行应用程序,直至到达指定的函数。 可以按名称指定函数也可以从调用堆栈选择它。
若要使用名称指定函数,选择 调试,新建断点,在函数处中断,然后输入函数和其他标识信息的名称。
如果重载函数或多个命名空间,您可以选择要在 选择断点 对话框需的功能。
设置要执行的下一语句
在中断调试器后,可以移动执行点设置要执行的代码的下一条语句。 源窗口或“反汇编”窗口的空白区域中的黄色箭头标记要执行的下一条语句的位置。 通过移动此箭头,可以跳过部分代码或返回到以前执行过的行。 在某些情况下可以使用此方法,例如,跳过包含已知 bug 的代码段。
设置要执行的下一语句,使用以下过程之一:
在源窗口中,将黄色箭头到要对同一源文件的下一条语句的位置
在源窗口中,将该行的光标。接下来要做并选择在上下文菜单中 设置下一语句。
在反汇编窗口中,将在程序集指令的光标。接下来要做并选择在上下文菜单中 设置下一语句。
警告
设置下一条语句将导致程序计数器直接跳到新位置。使用此命令时要小心:
-
不执行旧执行点和新执行点之间的指令。
-
如果向后移动执行点,则不撤消插入的指令。
-
将下一条语句移动到另一个函数或范围通常会导致调用堆栈损坏,导致一个运行时错误或异常。如果尝试将下一条语句移动到另一个范围,则调试器将打开一个含有警告的对话框,并提供一个取消该操作的机会。在 Visual Basic 中,不能将下一条语句移动到另一个范围或函数。
-
在本机 C++,因此,如果已启用运行时检查,设置下一条语句会导致引发异常,当执行到达方法的结尾时。
-
当"编辑并继续"后,编辑的启用,设置下一语句 失败,如果您进行编辑,并继续"无法立即重新映射。例如,如果您编辑了 catch 块中的代码,将发生这种情况。发生这种情况。您将看到告诉您的错误消息操作不受支持。
备注
在托管代码中,在以下情况下不能移动下一条语句:
-
下一条语句与当前语句不在同一个方法中。
-
使用实时调试启动调试。
-
正在展开一个调用堆栈。
-
已引发一个 System.StackOverflowException 或 System.Threading.ThreadAbortException 异常。
应用程序处于活动运行状态时不能设置下一条语句。 要设置下一语句,调试器必须处于中断模式。
转到我的代码" Restrict
有时,您在调试过程中可能只希望查看自己编写的代码,而忽略其他代码(如系统调用)。 为此,可以使用“仅我的代码”调试。 “仅我的代码”将隐藏非用户代码,从而使这些代码不出现在调试器窗口中。 单步执行时,调试器逐句通过所有非用户代码,但不在其中停止。
若要启用或禁用"仅我的代码"调试,请选择 调试,选项和设置。 在 调试,常规 页,请选中或清除的 启用“仅我的代码。
与非用户代码中区分用户代码,"仅我的代码"查看符号 (PDB) 文件和程序优化。
在标准调试版本中,关闭优化并为所有模块创建调试符号。 运行调试版本时,将这些模块视为用户代码。 但优化并且没有调试符号的函数不被视为用户代码。 使用“仅我的代码”时,在库代码的断点处不会停止执行;通常情况下,我们并不想调试库代码。 在“断点”窗口中,这些断点显示时带有“禁用断点”图标。
使用 选项 对话框,若要查看所有代码并在所有断点处停止,可以关闭"仅我的代码"调试。
此外还有三个特性影响调试器确定是否为“我的代码”:DebuggerNonUserCodeAttribute 告知调试器,其所应用到的代码不是“我的代码”; DebuggerHiddenAttribute 对调试器隐藏代码,即使“仅我的代码”关闭; DebuggerStepThroughAttribute 告知调试器逐句通过其所应用的代码,而不是单步执行代码。
启用"仅我的代码"时,可以选择 调试 菜单的 全部中断 并且没有显示"我的代码"处停止执行。 在这种情况下不显示任何代码。 此外,如果选择**“单步”**命令,则编译器将会跳到“我的代码”的下一行。
调试器对编程方式的中断语句(例如 Visual Basic Stop 语句)进行区别处理。 即使启用了“仅我的代码”,调试器也总是在这些语句处中断。 在这种情况下,将会显示非用户代码,而不会将其隐藏,但是单步执行仍会带您跳出非用户代码,转到“我的代码”的下一行。
备注
设备项目不支持“仅我的代码”。
步骤进入系统调用
在加载了该系统代码的调试符号,且未启用"仅我的代码",则可以单步执行系统调用就可以执行其他任何调用。
若要了解如何禁用"仅我的代码",请参见 Restrict stepping to Just My Code
访问 Microsoft 符号文件,请参见" 查找符号 (.pdb)、源和二进制文件 " 主题的 使用窗口和其他 Microsoft 符号。
加载特定系统组件的符号,在调试时:
打开"模块"窗口 (键盘:Ctrl+Alt+U)。
选择要加载符号的模块。
查看**“符号状态”**列可以了解哪些模块加载了符号。
选择在上下文菜单中 加载符号。
单步执行属性和运算符托管代码的
在属性和运算符的调试器逐托管代码的默认情况下。 在大多数情况下,这会提供较好的调试体验。 若要启用单步执行属性或运算符,选择 调试,选项和设置。 在 调试,常规 页上,清除复选框 逐过程执行属性和运算符 (仅限托管)
主题内容
停止调试
停止调试意味着终止调试会话。 停止执行意味着终止正调试的进程并结束调试会话。 请勿与中断执行混淆,后者意味着暂停正在调试的进程的执行但调试会话仍处于活动状态。 进程分离停止调试进程,后者意味着它运行。
从 Visual Studio 停止调试
选择 调试,停止调试。
停止调试 终止正调试的进程,如果程序从 Visual Studio 启动的。 如果附加到进程 (而不是生成其从 Visual Studio,进程继续运行。
停止调试并重新启动
选择 调试,重新启动 停止当前正在调试会话并重新启动在调试器中启动项目。
关闭正在调试的应用程序
在退出正在调试的应用程序时,调试自动终止。