断点告诉调试器应用程序应该在某个点中断或暂停执行。当中断发生时,程序和调试器被称为处于中断模式。跟踪点是Visual Studio中的一个新调试器功能。跟踪点是具有与其关联的自定义操作的断点。当命中跟踪点时,调试器将执行指定的跟踪点操作,而不是中断程序执行。跟踪点的一个常见用途是在程序到达某个点时打印消息。您可以将跟踪点用于许多与使用跟踪相同的目的,但无需修改代码。另一个区别是,跟踪点只在调试器下运行时工作。

断点概述

断点标志符号

源窗口和反汇编窗口通过在左边距中显示名为glyph的符号来显示断点位置。下表描述了这些标志符号。如果将鼠标放在断点图示符上,则会出现一个断点提示,其中包含更多信息。此信息对于错误和警告断点特别有用。

Glyph

Description

Debug Glyph 1

正常断点。实心标志符号表示断点已启用。空心标志符号表示它已被禁用。

Debug Glyph 2

高级断点。激活/禁用。符号+表示断点至少附加了一个高级功能(如条件、命中计数或筛选器)。

Debug Glyph 3

映射断点。激活/禁用。断点在ASP/ASP.NET代码中设置并映射到相应HTML页面中的断点,或者在服务器端脚本文件中设置并映射到相应的客户端脚本文件。

Debug Glyph 4

追踪点。激活/禁用。达到此点将执行指定的操作,但不会中断程序执行。

Debug Glyph 5

高级跟踪点。激活/禁用。符号+表示跟踪点至少附加了一个高级功能(如条件、命中计数或筛选器)。

Debug Glyph 6

映射跟踪点。激活/禁用。跟踪点在ASP/ASP.NET代码中设置,并映射到相应HTML页面中的跟踪点。

Debug Glyph 7

断点或跟踪点错误。X表示由于错误条件,无法设置断点或跟踪点。

Debug Glyph 8

断点或跟踪点警告。感叹号表示由于临时条件,无法设置断点或跟踪点。通常,这意味着断点或跟踪点位置的代码尚未加载。如果附加到进程并且未加载该进程的符号,则也可以看到。加载代码或符号时,将启用断点并更改图示符

基本断点

最基本的断点是在源代码行或函数上设置的断点。注意:如果一个源文件中有超过64000行代码,则不会命中64000行之后的行上的断点。

一行上有多个断点

有时,一行代码包含多个可执行语句。在这种情况下,可以在行上设置多个断点。包含当前选定断点的代码语句周围将出现一个框。此框可用于区分同一行代码上的多个断点。可以在“断点”窗口中选择断点,也可以单击“源”窗口中包含断点的语句。

高级断点

如果您有VisualC++或VisualStudio,任何版本,您可以设置更高级的断点,创建具有高级特性的断点,并以更强大的方式使用断点。

内存地址和内存更改上的断点

可以在内存地址上设置断点,也就是地址断点。在C/C++中,可以设置一个在内存更改时命中的断点,也就是数据断点(仅限本机)。

筛选、命中计数和条件

过滤器、命中计数和条件是可以附加到任何类型断点(包括跟踪点)的高级功能。

  • 筛选器导致在指定的计算机、进程和线程上设置断点。在调试运行在多个处理器上的应用程序时,筛选器非常有用。
  • 命中计数跟踪断点被命中的次数。默认情况下,断点在每次被命中时都会中断执行。您可以更改此行为,以便只有当命中计数等于或超过指定值或命中计数是给定值的倍数时,断点才会断开。指定的命中计数仅为调试会话保留。
  • 条件是一个表达式,计算该表达式以确定断点是否将断开。

断点限制

在调试混合模式、本机和托管代码时,请避免在系统组件上设置断点。在混合模式调试期间在系统组件上设置断点可能会导致公共语言运行库中断,调试器停止响应。除非您单步执行调用,否则调试器不会自动附加到XML Web服务。这意味着在XML Web服务中设置的任何断点都不会被命中,除非您进入调用。如果尝试使用“开始调试”或“继续”来运行断点,而不是使用“单步执行”,则不会命中断点。

设置简单断点

Visual Studio调试器提供了许多设置断点的方法。下面提供了两种设置简单断点的快速方法。

  • 在快捷菜单上设置简单断点
    在源窗口中,右键单击要设置断点的可执行代码行。在快捷菜单上,单击“断点”,然后单击“插入断点”。
  • 在“调试”菜单上设置简单断点
    在源窗口中,单击要设置断点的可执行代码行。在“调试”菜单上,单击“切换断点”。

设置地址断点

可以在“反汇编”窗口中的内存地址处设置断点。设置断点后,可以在“断点”窗口中编辑地址断点。先转到汇编窗口,然后进行下面的操作:

在“反汇编”窗口中,单击一行代码,然后单击“调试”菜单上的“切换断点”。

-或者-
右键单击一行代码,然后选择“插入断点”。

设置函数断点

可以在函数的开头或函数中的指定位置设置断点。对于脚本,只能在函数的开头设置断点。

  • 插入函数断点
    (可选)在源窗口中,单击函数的名称。这会将函数的名称插入到“新建断点”对话框中,以便您不必键入它。
    在“调试”菜单上,指向“新建断点”,然后单击“函数断点”。

    出现“新建断点”对话框。

    如果“函数”文本框不显示要设置断点的函数的名称,请在“函数”框中键入函数名称,并确保“语言”下拉列表显示该函数的正确编程语言。如果函数未重载,则只需要函数名。对于重载函数,可以指定参数以正确设置断点。键入函数名,后跟括在括号中的参数类型名。例如,对于一个名为a的C#方法,它接受一个带字符串参数和int参数,请键入a(int,string)。
    在本机C++中,可以使用上下文运算符。(仅限Visual Basic和C)如果希望Visual Studio Intellisense验证输入的函数名,请选中“使用Intellisense验证函数名”复选框。
    如果选中该复选框,并且键入的内容与重载签名不匹配,则会出现“选择断点”对话框,您可以选择要放入断点的重载。如果未选中该复选框并键入函数名,则断点将放入所有重载中。如果未选中该复选框,并且键入的签名不匹配,则不会在代码中插入断点。
    断点设置在函数的开头。如果要在函数中的其他位置设置断点,请更改“行”和“字符”框中的值。
    单击“确定”。
  • 从“断点”窗口插入函数断点

    后面的操作跟上面一样。

从调用堆栈窗口设置函数调用的断点

此功能不适用于Transact-SQL、Internet Explorer中的脚本或ASP。本主题描述如何使用调用堆栈窗口在对函数的特定调用上设置断点。断点在函数调用中的下一个可执行指令处设置。如果要在函数本身上设置断点,而不是在对函数的特定调用上设置断点。

在“调用堆栈”窗口中,在中断模式下,右键单击函数调用,然后单击快捷菜单(断点子菜单)上的“插入断点”。断点符号出现在函数调用名称旁边的左边距中。查看断点属性时,此断点显示为地址断点,其内存位置与函数中的下一个可执行指令相对应。

设置数据断点(Native Only)

当写入存储在指定内存位置的值时,数据断点中断执行。如果值是读而不是写的,则执行不会中断。数据断点在以下情况下不起作用:如果未被调试的进程写入内存位置,或者内存位置在两个或多个进程之间共享。如果在内核中更新了内存位置,则数据断点不起作用。例如,如果内存被传递给32位Windows ReadFile函数,则内存将从内核模式更新,并且调试器不会在内存写入时中断。若要设置数据断点,调试器必须仅处于中断模式。变量的地址从一个调试会话更改到下一个调试会话。因此,在每个调试会话结束时,数据断点都会被自动禁用。如果在局部变量上设置了数据断点,则在函数结束时,数据断点将保持启用状态。但是,它设置的内存地址不再具有相同的含义。因此,这种断点的结果是不可预测的。如果在局部变量上设置数据断点,最佳做法是在函数结束之前删除或禁用断点。

标签: none

添加新评论