Visual Studio

开始调试 VS 项目;附加到进程;中断代码;单步执行代码;运行到光标处;运行到调用堆栈上的函数;设置下一语句;单步执行“仅我的代码”;停止并重新开始调试;从调试的进程分离。

y740d9d3.collapse_all(zh-cn,VS.120).gif开始调试 VS 项目

如果打开的解决方案是 Visual Studio,你有三种方法来开始调试:

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

你的应用程序将启动然后运行,直到:

  • 调试器到达断点。

  • “调试”菜单上选择“停止调试”

  • 将引发异常。

  • 退出应用程序。

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

你的应用程序将启动,然后在第一行中断。

在源窗口中,选择执行代码中的某行,然后在上下文菜单上选择“运行到光标处”

你的应用程序将启动,并一直运行到断点或光标位置,具体取决于断点在前还是光标在前。

调试期间,若要在代码映射上对你的代码执行进行可视化跟踪,请参阅在 Visual Studio 中调试时映射调用堆栈上的方法

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

调试器还可以附加到正在 Visual Studio 外的过程中运行的程序。 一旦附加到某个程序,就可以使用调试器执行命令、检查程序状态,等等。 检查程序的能力可能会受到某些限制,这取决于程序是否用调试信息生成,是否可以访问程序源代码,以及公共语言运行时 JIT 编译器是否在跟踪调试信息。

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

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

“附加到进程”对话框

有关更多信息,请参见使用 Visual Studio 调试器附加到运行的进程

y740d9d3.collapse_all(zh-cn,VS.120).gif使用断点或“全部中断”中断代码

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

当执行到达断点或发生异常时,调试器将中断应用程序的执行。 你还可以随时手动中断执行。

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

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

你可以配置断点,挂起基于多种情况的执行。 请参阅断点:使用命中次数、调用堆栈函数和条件在 Visual Studio 调试器中您所需的时间和位置进行中断 本节描述两种中断代码的基本方式。

在代码中设置断点

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

设置断点

Visual Studio 中的断点提供了一组丰富的附加功能,例如条件断点和跟踪点。 请参阅断点:使用命中次数、调用堆栈函数和条件在 Visual Studio 调试器中您所需的时间和位置进行中断

手动中断代码

若要在正在执行的应用程序上,中断下一个可用的代码行,请选择“调试”“全部中断”(键盘:Ctrl+Alt+Break)。

y740d9d3.collapse_all(zh-cn,VS.120).gif单步执行、逐过程执行或跳出代码

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

菜单命令

键盘快捷键

描述

逐语句

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 中调试时映射调用堆栈上的方法

y740d9d3.collapse_all(zh-cn,VS.120).gif运行至指定位置或函数

有时,你想执行到代码中的某一点,然后停止执行。 如果在想要中断的位置设置了断点,请选择“调试”“启动调试”,如果还未启动调试,可以选择“调试”“继续”(这两种情况下的快捷键都是 F5。) 执行代码时,调试器将在下一个断点停止。 选择“调试”“继续”,直至到达所需的断点。

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

运行到光标处

若要运行到光标位置,请将光标放在源窗口中可执行的代码行上。 在编辑器的上下文菜单上,选择“运行到光标”

在调用堆栈上运行到函数

“调用堆栈”窗口中,选择函数,然后从上下文菜单选择“运行到光标”。 若要对调用堆栈进行可视化跟踪,请参阅在 Visual Studio 中调试时映射调用堆栈上的方法

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

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

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

“新建断点”对话框

如果是重载函数,或者函数在多个命名空间,你可以在“选择断点”对话框中选择想要的函数。

“选择断点”对话框

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

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

Example2

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

  • 在源窗口中,将黄色箭头拖动希望执行下一语句的位置,该位置应在同一源文件。

  • 在源窗口中,将光标放置在希望执行的下一行上,然后在上下文菜单上选择“设置下一语句”

  • 在“反汇编”窗口中,将光标放置在希望执行的下一汇编指令上,然后在上下文菜单上选择“设置下一语句”

警告说明 警告

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

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

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

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

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

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

说明 说明

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

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

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

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

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

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

y740d9d3.collapse_all(zh-cn,VS.120).gif限制单步执行“仅我的代码”

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

说明 说明

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

y740d9d3.collapse_all(zh-cn,VS.120).gif单步执行系统调用

如果你已加载系统代码的调试符号,且未启用“仅我的代码”,则可以单步执行系统调用,就像可以单步执行其他任何调用一样。

要了解如何禁用“仅我的代码”,请参阅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. 在上下文菜单中选择“加载符号”

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

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

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

y740d9d3.collapse_all(zh-cn,VS.120).gif停止 VS 调试

选择“调试”“停止调试”,当程序从 Visual Studio 启动时,终止正在调试的进程。 如果程序附加到进程,而不是从 Visual Studio 启动,则该进程仍继续运行。

y740d9d3.collapse_all(zh-cn,VS.120).gif关闭正在调试的应用

当你退出正在调试的应用时,调试将自动终止。

y740d9d3.collapse_all(zh-cn,VS.120).gif重新启动调试

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

y740d9d3.collapse_all(zh-cn,VS.120).gif从所调试的应用程序分离

选择“调试”、“全部分离”来停止调试,但被调试的进程仍保持运行。



Visual Studio 调试器提供了各种用于检查和修改程序状态的工具。 这些工具中的大多数仅在中断模式下有效。

可视化工具是 Visual Studio 调试器的新组件,通过它可以以有意义的方式查看对象或变量的内容。 例如,可以使用 HTML 可视化工具来查看 HTML 字符串,因为这样可以解释该字符串并在浏览器中显示出来。 你可以通过数据提示、“监视”窗口、“自动”窗口、“局部变量”窗口或“快速监视”对话框来访问可视化工具。 有关详细信息,请参阅可视化工具

可以通过变量窗口来了解变量、寄存器内容和表达式。

可以将调试器窗口中使用的数字格式设置为十进制或十六进制。 有关更多信息,请参见更改调试器窗口的数值格式

下面的调试器窗口提供有关程序的重要信息。

寄存器内容

如何:使用“寄存器”窗口

内存内容

“内存”窗口

  • 调用堆栈上的函数名

  • 参数类型

  • 参数值

如何:使用“调用堆栈”窗口

由编译器为程序生成的程序集代码

如何:使用“反汇编”窗口

由你的程序创建线程,即执行的连续流

如何:使用“线程”窗口

程序使用的模块(DLL 和 EXE)

如何:使用“模块”窗口

在 Visual Studio 中调试时映射调用堆栈上的方法

Visual Studio 2013
2(共 2)对本文的评价是有帮助 评价此主题

创建代码图,以便在调试时对调用堆栈进行可视化跟踪。 你可以在图中进行标注以跟踪代码执行的操作,以便专注于查找 Bug。

使用代码图上的调用堆栈调试

你将需要:

请参阅:视频:利用代码图调试器集成实现可视化调试 (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。 当你绘制一条线并尝试撤消该操作时,直到你绘制另一条线后才会发生变化。

因此,你设置断点、启动调试并生成图,如下所示:

向代码图添加另一个调用堆栈

你注意到图中所有用户笔势均调用 Repaint,但 undo 除外。 这可能解释了 undo 为何不立即发挥作用。

在修复此 Bug 并继续运行程序后,图中增加了从 undo 到 Repaint 的新调用:

向代码图上的调用堆栈添加新方法调用

  • 并非所有调用都会显示在图中。 为什么?

    默认情况下,只有你的代码会显示在图中。 若要查看外部代码,请在“调用堆栈”窗口中将它打开或在 Visual Studio 调试选项中关闭“启用‘仅我的代码’”

  • 更改图是否会影响代码?

    更改图不会对代码造成任何影响。 你可随意在图上重命名、移动或移除任何内容。

  • 这个消息是什么意思:“关系图可能基于旧版本的代码”?

    在你上次更新图后,代码可能已发生更改。 例如,图中的某个调用可能已在代码中不存在了。 请关闭此消息,然后在再次更新图之前,尝试重新生成解决方案。

  • 我如何控制图的布局?

    打开图工具栏上的“布局”菜单:

    • 更改默认布局。

    • 若要停止自动重新排列图,请关闭“调试时自动布局”

    • 若要在添加新项时尽可能少地重新排列图,请关闭“增量布局”

  • 我能否与他人共享此图?

    你可以导出映射,将其发送给他人(如果你有 Microsoft Outlook)或保存到你的解决方案中,以便你将其签入 Team Foundation 版本控制。

    与他人共享调用堆栈代码图

  • 我如何停止此图自动添加新的调用堆栈?

    选择图工具栏上的 。 若要手动向图中添加当前的调用堆栈,请按 Ctrl + Shift + `

    在你进行调试时,图中将继续突出显示现有调用堆栈。

  • 项图标和箭头代表什么?

    若要获取有关项的详细信息,请查看项的工具提示。 你还可以查看“图例”来了解每个图标的含义。

    调用堆栈代码图上各图标的含义

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值