Visual|Visual Studio

开始调试 VS 项目;附加到进程;中断代码;单步执行代码;运行到光标处;运行到调用堆栈上的函数;设置下一语句;单步执行“仅我的代码”;停止并重新开始调试;从调试的进程分离。
内容 Start debugging a VS project; attach to a process
Break into code, step or run through code, set the next statement to execute
Stop, restart debugging; detach from the debugged process
开始调试 VS 项目;附加到进程

  • Start debugging a VS project | Attach to a process
开始调试 VS 项目

如果打开的解决方案是 Visual Studio,你有三种方法来开始调试:
选择“调试”、“启动调试”(键盘:F5)。
你的应用程序将启动然后运行,直到:
  • 调试器到达断点。
  • 在“调试”菜单上选择“停止调试”。
  • 将引发异常。
  • 退出应用程序。
选择“调试”、“单步执行”(键盘:F11)或“调试”、“逐过程”(键盘:F10)。
你的应用程序将启动,然后在第一行中断。
在源窗口中,选择执行代码中的某行,然后在上下文菜单上选择“运行到光标处”。
你的应用程序将启动,并一直运行到断点或光标位置,具体取决于断点在前还是光标在前。

调试期间,若要在代码映射上对你的代码执行进行可视化跟踪,请参阅在 Visual Studio 中调试时映射调用堆栈上的方法。
Contents | Start debugging a VS project; attach to a process
附加到进程
调试器还可以附加到正在 Visual Studio 外的过程中运行的程序。 一旦附加到某个程序,就可以使用调试器执行命令、检查程序状态,等等。 检查程序的能力可能会受到某些限制,这取决于程序是否用调试信息生成,是否可以访问程序源代码,以及公共语言运行时 JIT 编译器是否在跟踪调试信息。
附加到本地计算机上运行的进程
选择“调试”,“附加到进程”。 在“附加到进程”对话框中,从“可用进程”列表中选择进程,然后选择“附加”。
有关更多信息,请参见使用 Visual Studio 调试器附加到运行的进程。
Contents | Start debugging a VS project; attach to a process
中断代码、单步执行或运行代码、设置要执行的下一语句
  • Break into code by using breakpoints or Break All | Step into, over, or out of the code | Run to a specified location or function | Set the next statement to execute | Restrict stepping to Just My Code | Step into system calls | Step into properties and operators in managed code
使用断点或“全部中断”中断代码
用 VS 调试器调试应用程序时,应用程序或者正在运行(执行)或处于中断模式。
当执行到达断点或发生异常时,调试器将中断应用程序的执行。 你还可以随时手动中断执行。
断点是一个信号,它通知调试器在某个特定点上暂时将应用程序执行挂起。 当执行在某个断点处挂起时,我们称程序处于中断模式。 进入中断模式并不会停止或结束程序的执行;执行可以在任何时候继续。
大多数调试器功能(例如,在本地窗口中查看变量值,或在“监视”窗口中计算表达式)仅在中断模式下可用。 应用程序的所有元素都将保留(例如,函数、变量和对象都保留在内存中),但其移动和活动将被挂起。 在中断模式下,你可以检查元素的位置和状态,以查看是否存在冲突或 Bug。 在中断模式下,你还可以对应用程序进行调整。
你可以配置断点,挂起基于多种情况的执行。 请参阅断点:使用命中次数、调用堆栈函数和条件在 Visual Studio 调试器中您所需的时间和位置进行中断。 本节描述两种中断代码的基本方式。
在代码中设置断点
若要在代码中设置简单断点,请打开 Visual Studio 编辑器中的源文件。 设置光标要中断的代码行,然后在上下文菜单上选择“断点”、“插入断点”(键盘:F9)。 调试器将在执行该代码行之前中断执行。
Visual Studio 中的断点提供了一组丰富的附加功能,例如条件断点和跟踪点。 请参阅断点:使用命中次数、调用堆栈函数和条件在 Visual Studio 调试器中您所需的时间和位置进行中断。
手动中断代码
若要在正在执行的应用程序上,中断下一个可用的代码行,请选择“调试”、“全部中断”(键盘:Ctrl+Alt+Break)。
  • 如果使用“仅我的代码”选项进行调试,则可以在项目的下一个代码行中断执行。 请参阅Restrict stepping to Just My Code。
  • 如果正在调试多个程序,则默认情况下,断点或“全部中断”命令将影响所有被调试的程序。 请参阅Configure the execution behavior of multiple processes。
  • 如果中断正在执行的代码,而没有响应的源或符号 (.pdf) 文件,调试器将显示“未找到源文件”或“未找到符号”页面,帮助你找到相应的文件。 请参阅在 Visual Studio 调试器中指定符号 (.pdb) 和源文件。
    如果你无法访问支持文件,仍可以在“反汇编”窗口中调试汇编指令。
Contents | Break into code, step or run through code, set the next statement to execute
单步执行、逐过程执行或跳出代码
“单步执行”是最常见的调试过程之一。 “单步执行”即一次执行一行代码。 当你暂停执行时(例如运行调试器到断点),可以使用三个“调试”菜单命令来单步执行代码:
菜单命令
键盘快捷键
【Visual|Visual Studio】 描述
逐语句
F11
如果某一行包含函数调用,“逐语句”仅执行调用本身,然后在函数内的第一个代码行处停止。 否则,请“逐语句”执行下一语句。
逐过程
F10
如果某一行包含函数调用,则“逐过程”执行调用函数,然后在调用函数的第一个代码行处停止。 否则,请“逐语句”执行下一语句。
跳出
Shift+F11
“跳出”将一直执行代码,直到函数返回,然后在调用函数中的返回点处中断。
  • 在嵌套函数调用上,“逐语句”将进入并单步执行嵌套最深的函数。 如果对类似 Func1(Func2()) 的调用使用“逐语句”,调试器将进入并单步执行函数 Func2。
  • 实际上,调试器逐句通过代码语句,而不是物理行。 例如,if 子句可以写在一行内:
    C# VB
    int x = 42; string s = "Not answered"; if( int x == 42) s = "Answered!";

    当你单步执行此行时,调试器将该条件视为一步,将结果视为另一步(在此示例中,条件为 true)。
若要在逐步执行函数的过程中,对调用堆栈进行可视化跟踪,请参阅在 Visual Studio 中调试时映射调用堆栈上的方法。
Contents | Break into code, step or run through code, set the next statement to execute
运行至指定位置或函数
有时,你想执行到代码中的某一点,然后停止执行。 如果在想要中断的位置设置了断点,请选择“调试”、“启动调试”,如果还未启动调试,可以选择“调试”、“继续”。(这两种情况下的快捷键都是 F5。) 执行代码时,调试器将在下一个断点停止。 选择“调试”、“继续”,直至到达所需的断点。
你还可以运行到代码编辑器中光标停放的位置,或者运行到指定的函数。
运行到光标处
若要运行到光标位置,请将光标放在源窗口中可执行的代码行上。 在编辑器的上下文菜单上,选择“运行到光标”。
在调用堆栈上运行到函数
在“调用堆栈”窗口中,选择函数,然后从上下文菜单选择“运行到光标”。 若要对调用堆栈进行可视化跟踪,请参阅在 Visual Studio 中调试时映射调用堆栈上的方法。
运行到通过名称指定的函数
可以命令调试器运行应用程序,直至到达指定的函数。 你可以通过名称指定函数,也可以从调用堆栈中选择函数。
若要通过名称指定函数,请选择“调试”、“新建断点”、“在函数处中断”,然后输入函数名称和其他标识信息。
如果是重载函数,或者函数在多个命名空间,你可以在“选择断点”对话框中选择想要的函数。
Contents | Break into code, step or run through code, set the next statement to execute
设置要执行的下一语句

将调试器中断后,你可以移动执行点,设置下一个要执行的代码语句。 源窗口或“反汇编”窗口的空白区域中的黄色箭头标记要执行的下一条语句的位置。 通过移动此箭头,可以跳过部分代码或返回到以前执行过的行。 在某些情况下可以使用此方法,例如,跳过包含已知 bug 的代码段。
若要设置下一个执行的语句,请使用以下过程之一:
  • 在源窗口中,将黄色箭头拖动希望执行下一语句的位置,该位置应在同一源文件。
  • 在源窗口中,将光标放置在希望执行的下一行上,然后在上下文菜单上选择“设置下一语句”。
  • 在“反汇编”窗口中,将光标放置在希望执行的下一汇编指令上,然后在上下文菜单上选择“设置下一语句”。
警告
设置下一条语句将导致程序计数器直接跳到新位置。 使用此命令时要小心:
  • 不执行旧执行点和新执行点之间的指令。
  • 如果向后移动执行点,则不撤消插入的指令。
  • 将下一条语句移动到另一个函数或范围通常会导致调用堆栈损坏,导致一个运行时错误或异常。 如果尝试将下一条语句移动到另一个范围,则调试器将打开一个含有警告的对话框,并提供一个取消该操作的机会。 在 Visual Basic 中,不能将下一条语句移动到另一个范围或函数。
  • 在本机 C++ 中,如果已启用运行时检查,设置下一条语句会导致执行到达方法的结尾时引发异常。
  • 当启用“编辑并继续”时,如果你进行了“编辑并继续”无法立即重新映射的编辑,那么“设置下一语句”将失败。 例如,如果你编辑了 catch 块中的代码,将发生这种情况。 出现这种情况时, 你将看到错误消息,告诉你操作不受支持。
说明
在托管代码中,在以下情况下不能移动下一条语句:
  • 下一条语句与当前语句不在同一个方法中。
  • 使用实时调试启动调试。
  • 正在展开一个调用堆栈。
  • 已引发一个 System.StackOverflowException 或 System.Threading.ThreadAbortException 异常。
应用程序处于活动运行状态时不能设置下一条语句。 要设置下一语句,调试器必须处于中断模式。
Contents | Break into code, step or run through code, set the next statement to execute
限制单步执行“仅我的代码”
有时,你在调试过程中可能只希望查看自己编写的代码,而忽略其他代码(如系统调用)。 为此,可以使用“仅我的代码”调试。 “仅我的代码”将隐藏非用户代码,从而使这些代码不出现在调试器窗口中。 单步执行时,调试器逐句通过所有非用户代码,但不在其中停止。 请参见仅我的代码
说明
设备项目不支持“仅我的代码”。
Contents | Break into code, step or run through code, set the next statement to execute
单步执行系统调用
如果你已加载系统代码的调试符号,且未启用“仅我的代码”,则可以单步执行系统调用,就像可以单步执行其他任何调用一样。
要了解如何禁用“仅我的代码”,请参阅Restrict stepping to Just My Code
若要访问 Microsoft 符号文件,请参阅在 Visual Studio 调试器中指定符号 (.pdb) 和源文件主题中的Use symbol servers to find symbol files not on your local machine。
在调试时加载特定系统组件的符号:
  1. 打开“模块”窗口(键盘:Ctrl+Alt+U)。
  2. 选择要加载符号的模块。
    查看“符号状态”列可以了解哪些模块加载了符号。
  3. 在上下文菜单中选择“加载符号”。
Contents | Break into code, step or run through code, set the next statement to execute
单步执行托管代码中的属性和运算符
默认情况下,调试器将逐过程执行托管代码中的属性和运算符。 在多数情况下,这会提供较好的调试体验。 若要启用单步执行属性或运算符,请选择“调试”、“选项和设置”。 在“调试”、“常规”页面上,清除“逐过程执行属性和运算符(仅限托管)”复选框
Contents | Break into code, step or run through code, set the next statement to execute
停止并重新开始调试;从调试的进程分离 停止调试意味着终止调试会话。 停止执行意味着终止正调试的进程并结束调试会话。 请勿与中断执行混淆,后者意味着暂停正在调试的进程的执行但调试会话仍处于活动状态。 从进程分离将停止调试进程,但进程仍会运行。
  • Stop debugging from VS | Close the app that is being debugged | Restart debugging | Detach from the debugged app
停止 VS 调试
选择“调试”、“停止调试”,当程序从 Visual Studio 启动时,终止正在调试的进程。 如果程序附加到进程,而不是从 Visual Studio 启动,则该进程仍继续运行。
Contents | Stop, restart debugging; detach from the debugged process
关闭正在调试的应用
当你退出正在调试的应用时,调试将自动终止。
重新启动调试
选择“调试”、“重新启动”,停止当前正在调试的会话并重新启动调试器中的启动项目。
Contents | Stop, restart debugging; detach from the debugged process
从所调试的应用程序分离
选择“调试”、“全部分离”来停止调试,但被调试的进程仍保持运行。





Visual Studio 调试器提供了各种用于检查和修改程序状态的工具。 这些工具中的大多数仅在中断模式下有效。
DataTips 可视化工具 可视化工具是 Visual Studio 调试器的新组件,通过它可以以有意义的方式查看对象或变量的内容。 例如,可以使用 HTML 可视化工具来查看 HTML 字符串,因为这样可以解释该字符串并在浏览器中显示出来。 你可以通过数据提示、“监视”窗口、“自动”窗口、“局部变量”窗口或“快速监视”对话框来访问可视化工具。 有关详细信息,请参阅可视化工具。
变量窗口 可以通过变量窗口来了解变量、寄存器内容和表达式。
可以将调试器窗口中使用的数字格式设置为十进制或十六进制。 有关更多信息,请参见更改调试器窗口的数值格式。
其他调试器窗口 下面的调试器窗口提供有关程序的重要信息。
寄存器内容
如何:使用“寄存器”窗口
内存内容
“内存”窗口
  • 调用堆栈上的函数名
  • 参数类型
  • 参数值
如何:使用“调用堆栈”窗口
由编译器为程序生成的程序集代码
如何:使用“反汇编”窗口
由你的程序创建线程,即执行的连续流
如何:使用“线程”窗口
程序使用的模块(DLL 和 EXE)
如何:使用“模块”窗口
在 Visual Studio 中调试时映射调用堆栈上的方法 Visual Studio 2013 2(共 2)对本文的评价是有帮助 - 评价此主题 创建代码图,以便在调试时对调用堆栈进行可视化跟踪。 你可以在图中进行标注以跟踪代码执行的操作,以便专注于查找 Bug。

你将需要:
  • Visual Studio Ultimate 2013
  • 可调试的代码,例如 Visual C# .NET、Visual Basic .NET、C++ 和 JavaScript。 若要可视化在同一个解决方案中多个应用之间共享的代码或者适用于 Microsoft Dynamics AX 的 X++ 代码,请确保你有 Visual Studio 2013 Update 2 或更高版本。
请参阅:视频:利用代码图调试器集成实现可视化调试 (Channel 9) ? Map the call stack ? Make notes about the code ? Update the map with the next call stack ?Add related code to the map ? Find bugs using the map ? Q & A
生成调用堆栈图
  1. 开始调试。 (键盘:“F5”)
  2. 在你的应用进入中断模式或你单步执行某一函数之后,请选择“代码图”。 (键盘:Ctrl + Shift + `)

    当前的调用堆栈在新代码图上显示为橙色:

    在你继续调试时,该代码图将自动更新。 请参阅Update the map with the next call stack。
对代码进行标注 添加注释以跟踪代码发生的情况。 若要在注释中添加新行,请按 Shift + Return。
使用下一个调用堆栈更新图 运行你的应用到下一个断点或单步执行某一函数。 此图将添加新的调用堆栈。
向图中添加相关代码 现在你已生成一个图,下一步做什么? 如果你正在使用 Visual C# .NET 或 Visual Basic .NET,请添加诸如字段、属性和其他方法等项,以便跟踪代码发生的情况。
双击一个方法以查看其代码定义。 (键盘:在图上选择该方法,然后按 F12)

添加要在图上跟踪的项。


在这里,你可以轻松查看哪些方法使用了相同的字段。 最近添加的项显示为绿色。
继续生成图以查看更多代码。

使用图查找 Bug 通过代码可视化,可帮助你更快发现 Bug。 例如,假设你正在一个绘图程序中调查 Bug。 当你绘制一条线并尝试撤消该操作时,直到你绘制另一条线后才会发生变化。
因此,你设置断点、启动调试并生成图,如下所示:

你注意到图中所有用户笔势均调用 Repaint,但 undo 除外。 这可能解释了 undo 为何不立即发挥作用。
在修复此 Bug 并继续运行程序后,图中增加了从 undo 到 Repaint 的新调用:
问题解答
  • 并非所有调用都会显示在图中。 为什么?
    默认情况下,只有你的代码会显示在图中。 若要查看外部代码,请在“调用堆栈”窗口中将它打开或在 Visual Studio 调试选项中关闭“启用‘仅我的代码’”。
  • 更改图是否会影响代码?
    更改图不会对代码造成任何影响。 你可随意在图上重命名、移动或移除任何内容。
  • 这个消息是什么意思:“关系图可能基于旧版本的代码”?
    在你上次更新图后,代码可能已发生更改。 例如,图中的某个调用可能已在代码中不存在了。 请关闭此消息,然后在再次更新图之前,尝试重新生成解决方案。
  • 我如何控制图的布局?
    打开图工具栏上的“布局”菜单:
    • 更改默认布局。
    • 若要停止自动重新排列图,请关闭“调试时自动布局”。
    • 若要在添加新项时尽可能少地重新排列图,请关闭“增量布局”。
  • 我能否与他人共享此图?
    你可以导出映射,将其发送给他人(如果你有 Microsoft Outlook)或保存到你的解决方案中,以便你将其签入 Team Foundation 版本控制。

  • 我如何停止此图自动添加新的调用堆栈?
    选择图工具栏上的 。 若要手动向图中添加当前的调用堆栈,请按 Ctrl + Shift + `。
    在你进行调试时,图中将继续突出显示现有调用堆栈。
  • 项图标和箭头代表什么?
    若要获取有关项的详细信息,请查看项的工具提示。 你还可以查看“图例”来了解每个图标的含义。


    推荐阅读