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