若要了解有关 Visual Studio 2017 RC 的最新文档,请参阅 Visual Studio 2017 RC 文档。 也许你会为了查看代码变量的状态或查看调用堆栈而想要停止调试程序执行,此时,你可以设置断点。 在开发人员的工具箱中,它们是最重要的调试技术之一。 可通过两种方法在源代码中设置函数断点:在源代码文件的左边距中单击;或将光标放在一行代码上,然后按 F9 键。 断点显示为左边距中的一个红点,且该代码行也会变色: 在调试程序中运行此代码时,只要命中断点,就会在执行该行上的代码之前停止执行。 源代码行会变为黄色: 此时, 可以查看应用程序的当前状态,包括变量值和调用堆栈。 有关调用堆栈的详细信息,请参阅 如何:使用“调用堆栈”窗口。 可以在任意可执行代码行上设置断点。 例如,在上面的 C# 代码中,可以在变量声明、 还可以在调用堆栈中、在“反汇编”窗口中以及在本机 C++ 代码中、在数据条件或内存地址上设置断点。 可通过在“调用堆栈”窗口中设置断点来中断调用函数返回到的指令或行处的执行。 有关调用堆栈的详细信息,请参阅 如何:使用“调用堆栈”窗口。 调试程序必须已停止执行。
在“断点”窗口中,调用堆栈断点显示为具有与函数中下一个可执行指令对应的内存位置的地址。 调试器在指令处中断执行。 若要在执行代码期间直观地跟踪断点,请参阅 调试时映射调用堆栈上的方法。 若要在程序集指令处设置断点,必须使调试器处于中断模式下。
数据断点在存储在指定内存地址中的值更改时中断执行。 如果只读取但不更改该值,则执行不会中断。 若要设置数据断点,必须使调试器处于中断模式下。
请记住,数据断点依赖于特定内存地址的适用性。
数据断点在下列情况下无效:
你还可以使用对象的地址在类的特定实例上调用的方法上设置断点。 以下是一个示例: 例如,给定一个具有地址的
你可以使用“断点”窗口(“调试”/“窗口”/“断点”,或“CTRL + ALT + B”)来查看在你的解决方案中已设置的所有断点。 “断点”窗口提供管理所有断点的中心位置,这在断点非常关键的大型解决方案或复杂调试应用场景中特别有用。 如果需要保存或共享一组断点的状态和位置,则可以仅从“断点”窗口导出和导入断点。 可以通过设置条件来控制在何时何处执行断点。
选中“条件”框时,窗口将扩展,以便显示不同种类的条件。 条件表达式:选择条件表达式时,可以随之选择两个条件:“为 true”和“更改时”。 如果要在满足表达式时中断,请选择“为 true”;如果要在表达式的值更改时中断,请选择“更改时”。 在下面的示例中,我们将断点设置为仅在 在下面的示例中,我们将断点设置为仅在 不同编程语言的“更改时”字段的行为不同。 对于本机代码,如果选择“更改时”,则调试器不会将条件的第一次计算当作一次更改,所以第一次计算时不会命中断点。 对于托管代码,如果选择“更改时”,则选择“更改时”之后的第一次计算时便会命中断点。 如果使用无效语法设置断点条件,则会显示警告消息。 如果在指定断点条件时使用的语法有效但语义无效,则在第一次命中断点将出现警告消息。 在这两种情况下,当命中无效断点时,调试器都会中断执行。 仅在条件有效且计算结果为 条件可以是调试器能够识别的任何有效表达式。 有关有效表达式的详细信息,请参见 调试器中的表达式。 有时,你想要观察特定对象的行为;例如,你可能想要知道一个对象为何多次被插入到一个集合中。 在 C# 和 F# 中,你可以创建引用类型的特定实例的对象 ID,并在断点条件下使用它们。 对象 ID 由公共语言运行时 (CLR) 调试服务生成并与该对象关联。 若要创建对象 ID,请执行以下操作:
如果以后想要删除对象 ID,可以右键单击“局部变量”窗口中的变量,然后选择“删除对象 ID”。 请注意,对象 ID 创建弱引用,且不会阻止对象被垃圾回收。 它们仅对当前调试会话有效。 如果怀疑代码中的循环在一定数量的迭代后开始产生错误行为,则可以设置断点,以在指定的命中数传到关联的代码行后停止执行,而不要强制重复按 F5 键以达到迭代级别。 在“断点设置”窗口中,将条件设置为“命中计数”。 可以随后指定迭代数。 在下面的示例中,我们将断点设置为每隔一次迭代命中一次: 可以将断点限制为仅在指定设备上或在指定进程和线程中触发。 在“断点设置”窗口中,将条件设置为“筛选器”。 输入以下一个或多个表达式。
将字符串值放在双引号内。 可以使用 跟踪点是将消息打印到输出窗口的断点。 跟踪点的作用像这种编程语言中的一个临时跟踪语句。 在“断点设置”窗口中,选中“操作”框。 在“操作”组中选择“将消息记录到输出窗口”。 可以打印通用字符串,例如 this is a test。 要包括变量或表达式的值,请将它放在大括号内。 若要在命中跟踪点时中断执行,请清除“继续执行”复选框。 选中“继续执行”时,不会暂停执行。 在这两种情况下,都将打印消息。 可以在“消息”中使用以下特殊关键字。
断点标签仅用于在“断点”窗口中对断点列表进行排序和筛选。 若要将标签添加到断点中,请选择断点行,然后在上下文菜单中选择“标签”。 右键单击断点并选择“导出”可以将断点导出到 XML 文件。 该文件默认保存在解决方案目录中。 要导入断点,请打开“断点”窗口 (“CTRL + ALT + B”),并在工具栏上单击向右箭头(工具提示为“从文件中导入断点”)。 我删除了断点,但在再次启动调试时继续命中该断点如果在调试时删除了断点,则某些情况下,可能会在下次启动调试时再次命中该断点。 要停止命中此断点,请确保从“断点”窗口删除该断点的所有实例。 调试器无法找到断点源文件的正确版本如果源文件已更改,且源与正在调试的代码不再匹配,即使存在源文件,调试器也将查找对应于断点的源文件。
断点在 DLL 中不起作用当调试器尚未为代码所在的模块加载调试信息时,不能在源文件中设置断点。 征兆可能包括“将不会设置断点”等消息。 警告断点标志符号出现在断点位置。 但是,当加载代码时,这些警告断点将成为实际的断点。 有关加载符号的更多信息,请参见 指定符号 (.pdb) 和源文件。 |
|