Visual Studio调试器指南---控制执行
Visual Studio 调试器提供了功能强大的命令来控制应用程序的执行。 下面描述了为控制执行利用调试器命令可执行的任务:
开始(或继续)执行
中断执行
停止执行
逐句通过应用程序
运行到指定的位置
设置执行点
开始执行
开始执行是最基本的调试功能之一。
在“调试”菜单上选择“开始”、“逐语句”或“逐过程”。
- 或 -
在源窗口中,右击可执行代码中的某行,然后选择“运行到光标处”。
如果选择“启动”,则应用程序启动并一直运行到断点。 可以在任何时刻中断执行,以检查值,修改变量,或检查程序状态。
若选择了“逐语句”或“逐过程”,应用程序会启动并执行,然后在第一行中断。如果选择“运行到光标处”,则应用程序启动并一直运行到断点或光标位置,具体看是断点在前还是光标在前。 可以在源窗口中设置光标位置。 某些情况下,不出现中断。 这意味着执行始终未到达设置光标处的代码。
解决方案可能包含不止一个项目。 这时候,可以选择将由“调试”菜单执行命令启动的启动项目。 或者,也可以从“解决方案资源管理器”启动选定的项目。可以使用“调试”菜单上的“开始执行(不调试)”命令,在不使用调试器的情况下开始执行项目。
中断执行
当用 Visual Studio 调试器调试应用程序时,应用程序或者正在运行(执行)或处于中断模式。 大多数调试器功能(比如在**“监视”**窗口中计算表达式)只在中断模式下可用。当执行到达一个断点或发生异常,调试器将中断程序的执行。 您可以随时手动中断执行。 如果在执行没有相应源的代码时中断,将能够在“反汇编”窗口中进行调试。
手动中断程序执行
在“调试”菜单上,单击“全部中断”。
调试器将停止所有在调试器下运行的程序的执行。 程序并不退出,可以随时恢复执行。 调试器和应用程序现在处于中断模式。
如果正在调试多个程序,则默认情况下,断点或“全部中断”命令将影响所有被调试的程序。 如果想仅中断当前程序,可以更改该默认值。
更改调试多个程序时的中断行为
在“工具”菜单上,单击“选项”。
在“选项”对话框中,选择“调试”文件夹,并单击“常规”类别。
切换“一个进程中断时则中断所有进程”。
单击“确定”。
停止调试或停止执行
停止调试意味着终止调试会话。 停止执行意味着终止正调试的进程并结束调试会话。 请勿与中断执行混淆,后者意味着暂停正在调试的进程的执行但调试会话仍处于活动状态。
停止调试
- 在“调试”菜单上,选择“停止调试”。
如果程序是从 Visual Studio 启动的,则**“停止调试”终止正调试的进程。 如果程序附加到进程,而不是从 Visual Studio 启动的,则该进程仍继续运行。 如果要终止被附加的进程,可以通过“进程窗口”终止单个进程,或者通过“全部终止”**命令终止所有被附加的进程。
终止所有正调试的被附加进程
- 在“调试”菜单上选择“全部终止”。
如果要停止当前正在调试的运行并立刻开始新运行,可以使用**“重新启动”**命令。
停止调试并重新启动
- 在“调试”菜单上选择“重新启动”。
“重新启动”**停止当前正在调试的会话,并重启启动项目。
如果退出正在调试的应用程序,调试将自动停止。 如果正在调试多个程序,调试将继续进行,直到退出了最后一个程序。 如果调试的是由其他应用程序承载的项目(如由 Microsoft Internet Explorer 承载的 Web 项目),若退出宿主应用程序(如 Microsoft Internet Explorer),调试将停止。
在 Visual Basic 和 C# 中,如果正在调试一个 Web 服务,而使用该服务的客户端应用程序被终止了,则 Web 服务的调试也会停止。
单步执行
“单步执行”是最常见的调试过程之一。 “单步执行”即一次执行一行代码。
“调试”菜单提供了三个逐句通过代码的命令:
逐语句
逐过程
跳出
“逐语句”和“逐过程”的差异仅在于它们处理函数调用的方式不同。 这两个命令都指示调试器执行下一行的代码。 如果某一行包含函数调用,“逐语句”仅执行调用本身,然后在函数内的第一个代码行处停止。 而“逐过程”执行整个函数,然后在函数外的第一行处停止。 如果要查看函数调用的内容,请使用“逐语句”。 若要避免单步执行函数,请使用“逐过程”。
在嵌套函数调用上,“逐语句”将进入并单步执行嵌套最深的函数。 如果对类似 Func1(Func2()) 的调用使用“逐语句”,调试器将进入并单步执行函数 Func2。如果要进入并单步执行特定的嵌套函数,请使用快捷菜单中的“单步执行特定函数”命令。 位于函数调用的内部并想返回到调用函数时,请使用“跳出”**。 “跳出”将一直执行代码,直到函数返回,然后在调用函数中的返回点处中断。
运行到指定位置
有时,在调试过程中,您想执行到代码中的某一点,然后中断。 如果在要中断的位置设置了断点,则可以实现上述目的。
运行到已设置断点的指定位置
在“调试”菜单上,单击“启动”或“继续”。
您其实不需要在任何情况下都设置断点。 Visual Studio 调试器提供特定命令以运行到光标位置或运行到指定的函数。
设置下一语句
在 Visual Studio 调试器中,可以移动执行点来设置要执行的下一条代码语句。 源窗口或“反汇编”窗口的空白区域中的黄色箭头标记要执行的下一条语句的位置。 通过移动此箭头,可以跳过部分代码或返回到以前执行过的行。 在某些情况下可以使用此方法,例如,跳过包含已知 bug 的代码段。注意:设置下一条语句将导致程序计数器直接跳到新位置。 使用此命令时要小心以下情况:
不执行旧执行点和新执行点之间的指令。
如果向后移动执行点,则不撤消插入的指令。
将下一条语句移动到另一个函数或范围通常会导致调用堆栈损坏,导致一个运行时错误或异常。 如果尝试将下一条语句移动到另一个范围,则调试器将打开一个含有警告的对话框,并提供一个取消该操作的机会。 在 Visual Basic 中,不能将下一条语句移动到另一个范围或函数。
在本机 C++ 中,如果已启用运行时检查,则设置下一条语句会导致执行到达方法的结尾时引发异常。
当启用“编辑并继续”时,如果您做出了“编辑并继续”无法立即重新映射的编辑,则“设置下一语句”将失败。 例如,如果您编辑了 catch 块中的代码,将发生这种情况。 发生这种情况时,您将看到类似如下的错误消息:“无法将下一语句设置到此位置。不支持操作。未知错误: 错误号”
在托管代码中,在以下情况下不能移动下一条语句:
下一条语句与当前语句不在同一个方法中。
使用实时调试启动调试。
正在展开一个调用堆栈。
已引发一个 System.StackOverflowException 或 System.Threading.ThreadAbortException 异常。
应用程序处于活动运行状态时不能设置下一条语句。 要设置下一语句,调试器必须处于中断模式。
设置要执行的下一语句
在源窗口中,单击黄色箭头,要将下一条语句设置到哪个位置,就将箭头拖到该位置,该位置应在同一源文件中
- 或 -
在源窗口中,右击要执行的下一条语句,然后选择“设置下一语句”。
在“反汇编”窗口中,右击要执行的下一条汇编语言指令,然后选择“设置下一语句”。