ba 命令设置处理器断点 (通常称为 数据断点 ) ,但不太准确。 当访问指定的内存时,会触发此断点。

User-Mode

[~Thread] ba[ID] Access Size [Options] [Address [Passes]] ["CommandString"]

Kernel-Mode

ba[ID] Access Size [Options] [Address [Passes]] ["CommandString"]
指定断点应用于的线程。 有关语法的详细信息,请参阅 线程语法。 只能在用户模式下指定线程。

指定标识断点的可选数字。 如果未指定 ID,则使用第一个可用的断点编号。 不能在 ba 和 ID 号之间添加空格。 每个处理器仅支持有限数量的处理器断点,但 ID 号的值没有限制。 如果将 ID 括在方括号中 ([]) , 则 ID 可以包含任何表达式。 有关语法的详细信息,请参阅 数值表达式语法

指定满足断点的访问类型。 此参数的取值可为下列值之一:

指定要监视访问的位置的大小(以字节为单位)。 在基于 x86 的处理器上,此参数可以是 1、2 或 4。 但是,如果 Access 等于 e则 Size 必须为 1。

在基于 x64 的处理器上,此参数可以是 1、2、4 或 8。 但是,如果 Access 等于 e则 Size 必须为 1。

指定断点选项。 可以使用任意数量的以下选项,但如所示除外:

创建“一次性”断点。 触发此断点后,断点将从断点列表中永久删除。

/pEProcess
(内核模式仅) 指定与此断点关联的进程。 EProcess 应该是 EPROCESS 结构的实际地址,而不是 PID。 仅当在此过程的上下文中遇到断点时,才会触发断点。

/tEThread
(内核模式仅) 指定与此断点关联的线程。 EThread 应该是 ETHREAD 结构的实际地址,而不是线程 ID。 仅当此线程的上下文中遇到断点时,才会触发该断点。 如果使用 /pEProcess/tEThread ,则可以按任一顺序输入它们。

/cMaxCallStackDepth
仅当调用堆栈深度小于 MaxCallStackDepth 时,断点才处于活动状态。 不能将此选项与 /C 组合在一起。

/CMinCallStackDepth
仅当调用堆栈深度大于 MinCallStackDepth 时,断点才处于活动状态。 不能将此选项与 /c 组合在一起。

指定任何有效的地址。 如果应用程序访问此地址的内存,调试器将停止执行并显示所有寄存器和标志的当前值。 此地址必须是偏移量并适当对齐以匹配 Size 参数。 (例如,如果 Size 为 4, 则 Address 必须是 4.) 如果省略 Address,则使用当前指令指针。 有关语法的详细信息,请参阅地址和地址范围语法

指定在断点激活之前传递的次数。 此数字可以是任何 16 位值。 程序计数器通过此点而不中断的次数比此数字的值少一次。 因此,省略此数字与将其设置为 1 相同。 另请注意,此数字仅计算应用程序在此时间点后 执行的 次数。 单步执行或跟踪超过此点不算数。 达到完整计数后,只能通过清除并重置断点来重置此数字。

CommandString
指定每次遇到断点的指定次数时要执行的命令列表。 只有在发出 g (Go) 命令后命中断点,而不是在 t (Trace) p (Step) 命令之后,才会执行这些命令。 CommandString 中的调试器命令可以包含参数。

必须将此命令字符串括在引号中,并且应用分号分隔多个命令。 可以使用标准 C 控制字符 (,例如 \n\“) 。 二级引号 (\“) 中包含的分号解释为嵌入带引号的字符串的一部分。

此参数是可选的。

有关处理器断点的详细信息,请参阅 处理器断点 (ba 断点) 。 有关使用断点、控制断点的其他断点命令和方法的详细信息和示例,以及有关如何在内核调试器的用户空间中设置断点的信息,请参阅 使用断点。 有关条件断点的详细信息,请参阅 设置条件断点

调试器使用 ID 号引用稍后 bc (断点清除) 中的断 点,bd (断点禁用) ,并 (断点启用) 命令。

使用 bl (断点列表) 命令列出所有现有断点、其 ID 号及其状态。

使用 .bpcmds (显示断点命令) 命令列出所有现有断点、其 ID 号以及用于创建断点的命令。

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

处理器可能会对与指定区域 重叠 但不完全相同的内存区域执行操作。 在此示例中,包含要0x7000100F 0x70001000范围的单个写入操作,或只包含0x70001009字节的写入操作将是重叠操作。 在这种情况下,是否触发断点取决于处理器。 有关具体的详细信息,应参阅处理器手册。 若要采用一个特定实例,在 x86 处理器上,每当访问范围与断点范围重叠时,将触发读取或写入断点。

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

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

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

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

不能在同一地址创建多个处理器断点,这些断点仅在其 CommandString 值上不同。 但是,可以在同一地址创建具有不同限制的多个断点, (例如, ) /p/t/c/C 选项的不同值。

有关处理器断点的更多详细信息以及适用的其他限制,请参阅 处理器断点 (ba 断点)

以下示例演示 ba 命令。 以下命令设置一个断点,用于对变量 myVar 的 4 个字节进行读取访问。

0:000> ba r4 myVar

以下命令在地址从0x3F8到0x3FB的所有串行端口上添加断点。 如果向这些端口读取或写入任何内容,则会触发此断点。

kd> ba i4 3f8