在调试器请求时由处理器控制的断点称为 处理器断点 或 数据断点。 由调试器直接控制的断 点称为软件断点。
注意 尽管术语 数据断点 通常用作 处理器断点的同义词,但此术语可能会产生误导。 有两种基本类型的断点:处理器断点(由处理器控制)和软件断点(由调试器控制)。 处理器断点通常在程序数据上设置 -- 这是它们称为“数据断点”的原因 -- 但也可以在可执行代码上设置它们。 软件断点通常在可执行代码上设置,但也可以在程序数据上设置这些断点。 遗憾的是,调试文献中通常将处理器断点称为“数据断点”,即使它们是在可执行代码上设置的。
处理器断点
访问特定内存位置时,将触发处理器断点。 有四种类型的处理器断点,对应于触发它的内存访问类型:
| 断点类型 | 行动 |
|---|---|
| e(执行) | 当处理器从指定地址检索指令时触发。 |
| r (读/写) | 当处理器读取或写入指定地址处的内存时触发。 |
| w (写入) | 当处理器在指定地址处写入内存时触发。 |
| i (i/o) | 访问指定地址处的 I/O 端口时触发。 |
每个处理器断点都有与之关联的大小。 例如,可以在地址 0x70001008 处设置一个大小为 4 个字节的 w(write)处理器断点。 这将监视地址块,从0x70001008到0x7000100B(含)。 如果写入此内存块,将触发断点。
处理器可能对与指定区域重叠但不完全相同的内存区域执行操作。 在上一段中给出的示例中,一个包含范围从0x70001000到0x7000100F的单个写操作,或者一个只包含0x70001009字节的写操作,将是重叠的操作。 在这种情况下,是否触发断点依赖于处理器。 有关如何在特定处理器上处理这种情况的详细信息,请参阅处理器体系结构手册并查找“调试寄存器”或“调试控制寄存器”。 若要以一种特定的处理器类型为例,在 x86 处理器上,每当访问的范围与断点范围重叠时,就会触发读取或写入断点。
同样,如果在地址 0x00401003 上设置了 e(execute)断点,然后执行一条跨越地址 0x00401002 和 0x00401003 的双字节指令,其结果将依赖于处理器。 同样,有关详细信息,请参阅处理器体系结构手册。
处理器区分用户模式调试器设置的断点和内核模式调试器设置的断点。 用户模式处理器断点不会影响任何内核模式进程。 内核模式处理器断点可能会或可能不会影响用户模式进程,这取决于用户模式代码是否使用调试寄存器状态,以及是否存在连接的用户模式调试器。
若要将当前进程的现有数据断点应用于其他寄存器上下文,请使用 .apply_dbp(将数据断点应用到上下文) 命令。
在多处理器计算机上,每个处理器断点都适用于所有处理器。 例如,如果当前处理器为 3,并且使用命令 ba e1 MyAddress 将断点置于 MyAddress,则执行的任何处理器(而不仅仅是处理器 3)将触发断点。 这同样适用于软件断点。
软件断点
软件断点与处理器断点不同,由调试器控制。 当调试器在某些位置设置软件断点时,它会临时将该内存位置的内容替换为中断指令。 调试器会记住此位置的原始内容,以便在调试器中显示此内存时,调试器将显示该内存位置的原始内容,而不是中断指令。 当目标进程在此位置执行代码时,断点指令会导致进程进入调试器。 在执行您选择的任何操作后,您可以让目标恢复执行,执行将从原来位于该位置的指令开始继续。
处理器断点类型的可用性
i (i/o) 选项仅在内核模式调试期间可用。
并非所有数据大小都可用于所有处理器断点类型。 允许的大小取决于目标计算机的处理器。 有关详细信息,请参阅 ba(访问中断点)。
软件断点和处理器断点的限制
使用 bp 或 bm /a 命令时,可以指定数据地址而不是程序地址。 但是,即使指定了数据位置,这些命令也会创建软件断点,而不是处理器断点。 当调试器将软件断点置于某个位置时,它会临时将该内存位置的内容替换为中断指令。 这不会损坏可执行映像,因为调试器会记住此位置的原始内容,当目标进程尝试执行此代码时,调试器可以相应地响应。 但是,在数据位置设置软件断点时,生成的覆盖可能会导致数据损坏。 因此,仅当您确信某个位置将仅用作可执行代码时,在该数据位置设置软件断点才是安全的。
bp、bu 和 bm 命令通过将处理器指令替换为中断指令来设置软件断点。 因此,这些代码不能在只读代码或任何其他无法改写的代码中使用。 若要在此类代码中设置断点,必须使用 ba (Break on Access) 和 e (execute) 选项。
不能在同一地址创建多个处理器断点,这些断点仅在触发断点时自动执行的命令中不同。 在同一地址使用ba命令时,可以通过为/p、/t、/c和/C选项设置不同的值来创建多个断点,这些断点在其他限制条件上有所不同。
用户模式进程中的初始断点(通常在 主 函数或其等效项上设置)不能是处理器断点。
支持的处理器断点数取决于目标处理器体系结构。
控制软件断点和处理器断点
可以使用 bp(设置断点)、 bm(设置符号断点)和 bu(设置未解析 断点)命令创建软件断点。 可以使用 ba(访问断点) 命令创建处理器断点。 禁用、启用和修改断点的命令适用于所有类型的断点。 显示断点列表的命令包括所有断点,并指示每个断点的类型。 有关这些命令的列表,请参阅 控制断点的方法。
WinDbg 断点 对话框显示所有断点,指示表示法为“e”、“r”、“w”或“i'的处理器断点,后跟块的大小。 此对话框可用于修改任何断点。 此对话框中的 “命令 ”文本框可用于创建任何类型的断点。如果需要处理器断点,请使用“ba”开始输入。 在 WinDbg 反汇编窗口 或 源窗口中使用鼠标设置断点时,调试器将创建未解析的软件断点。
处理器断点存储在处理器的调试寄存器中。 可以通过手动编辑调试寄存器值来设置断点,但强烈建议不要这样做。