处理器断点(ba 断点)

由处理器在调试器请求时控制的断 点称为处理器断点数据断点。 由调试器直接控制的断点称为 软件断点

注意 尽管 术语数据断点 通常用作 处理器断点的同义词,但此术语可能会产生误导。 有两种基本类型的断点:处理器断点(由处理器控制)和软件断点(由调试器控制)。 处理器断点通常在程序数据上设置,这就是它们被称为“数据断点”的原因,但也可以在可执行代码上设置它们。 软件断点通常在可执行代码上设置,但也可以在程序数据上设置。 遗憾的是,在调试文献中,通常将处理器断点称为“数据断点”,即使它们是在可执行代码上设置的。

处理器断点

当访问特定内存位置时,将触发处理器断点。 有四种类型的处理器断点,对应于触发它的内存访问类型:

断点类型 操作
e (执行) 当处理器从指定地址检索指令时触发。
r (读/写) 当处理器读取或写入指定地址的内存时触发。
w (写入) 当处理器在指定地址写入内存时触发。
i (i/o) 在访问指定地址处的 I/O 端口时触发。

每个处理器断点都有一个与之关联的大小。 例如,可以在地址0x70001008设置 w (写入) 处理器断点,大小为 4 个字节。 这将监视地址块(包括0x70001008到0x7000100B)。 如果将此内存块写入,则会触发断点。

处理器可能会对与指定区域重叠但不完全相同的内存区域执行操作。 在上一段中给出的示例中,包含0x7000100F 0x70001000范围的单个写入操作,或只包含0x70001009字节的写入操作将是重叠操作。 在这种情况下,是否触发断点取决于处理器。 有关如何在特定处理器上处理这种情况的详细信息,请参阅处理器架构手册并查找“调试寄存器”或“调试控制寄存器”。 以一种特定处理器类型为例,在 x86 处理器上,每当访问范围与断点范围重叠时,就会触发读取或写入断点。

同样,如果在地址0x00401003上设置了 e (执行) 断点,然后执行跨越0x00401002和0x00401003地址的两字节指令,则结果依赖于处理器。 同样,请参阅处理器体系结构手册了解详细信息。

处理器区分用户模式调试器设置的断点和内核模式调试器设置的断点。 用户模式处理器断点不会影响任何内核模式进程。 内核模式处理器断点可能会影响用户模式进程,具体取决于用户模式代码是否使用调试寄存器状态以及是否附加了用户模式调试器。

若要将当前进程的现有数据断点应用于其他寄存器上下文,请使用 .apply_dbp (将数据断点应用于上下文) 命令。

在多处理器计算机上,每个处理器断点适用于所有处理器。 例如,如果当前处理器为 3,并且使用 命令 ba e1 MyAddressMyAddress 放置断点,则在该地址执行的任何处理器(而不仅仅是处理器 3)都触发断点。 这同样适用于软件断点。

软件断点

与处理器断点不同,软件断点由调试器控制。 当调试器在某个位置设置软件断点时,它会临时将该内存位置的内容替换为中断指令。 调试器会记住此位置的原始内容,因此,如果此内存显示在调试器中,调试器将显示该内存位置的原始内容,而不是中断指令。 当目标进程在此位置执行代码时,中断指令会导致进程进入调试器。 执行选择的任何操作后,可能会导致目标恢复执行,并且执行将按照最初位于该位置的指令继续执行。

处理器断点类型的可用性

i (i/o) 选项仅在内核模式调试期间可用。

并非所有数据大小都可以用于所有处理器断点类型。 允许的大小取决于目标计算机的处理器。 有关详细信息,请参阅 ba (Access 上的中断)

软件断点和处理器断点的限制

使用 bp 或 bm /a 命令时,可以指定数据地址而不是程序地址。 但是,即使指定了数据位置,这些命令也会创建软件断点,而不是处理器断点。 当调试器将软件断点置于某个位置时,它会临时用中断指令替换该内存位置的内容。 这不会损坏可执行映像,因为调试器会记住此位置的原始内容,并且当目标进程尝试执行此代码时,调试器可以做出适当的响应。 但是,在数据位置设置软件断点时,生成的覆盖可能会导致数据损坏。 因此,仅当确定此位置将仅用作可执行代码时,才能在数据位置上设置软件断点。

bpbubm 命令通过将处理器指令替换为断点指令来设置软件断点。 因此,这些不能在只读代码或任何其他无法覆盖的代码中使用。 若要在此类代码中设置断点,必须使用 ba (Break on Access) e (execute) 选项。

不能在同一地址创建多个处理器断点,这些断点仅在触发断点时自动执行的命令中不同。 但是,可以在同一地址创建多个断点,这些断点在其他限制 (例如,可以使用具有不同值的 /p/t/c/C 选项) 的 ba 命令在同一地址创建多个断点。

用户模式进程中的初始断点 (通常在 main 函数上设置,或者其等效) 不能是处理器断点。

支持的处理器断点数取决于目标处理器体系结构。

控制软件断点和处理器断点

可以使用 bp (设置断点) bm (设置断点) 和 bu (设置未解析断点) 命令来创建软件断点。 可以使用 ba (Access 上的中断) 命令创建处理器断点。 禁用、启用和修改断点的命令适用于所有类型的断点。 显示断点列表的命令包括所有断点,并指示每个断点的类型。 有关这些命令的列表,请参阅 控制断点的方法

“WinDbg 断点 ”对话框显示所有断点,指示处理器断点的表示法为“e”、“r”、“w”或“i”,后跟块的大小。 此对话框可用于修改任何断点。 此对话框中的 “命令 ”文本框可用于创建任何类型的断点。如果需要处理器断点,请使用“ba”开始输入。 在 WinDbg 反汇编窗口窗口中使用鼠标设置断点时,调试器会创建一个未解析的软件断点。

处理器断点存储在处理器的调试寄存器中。 可以通过手动编辑调试寄存器值来设置断点,但强烈建议不要这样做。