ba(访问时中断)

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

用户模式

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

内核模式

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

参数

线
指定断点适用的线程。 有关语法的详细信息,请参阅线程语法。 只能在用户模式下指定线程。

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

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

选项 操作

e(执行)

当 CPU 从指定地址检索指令时,会中断到调试器。

r(读取/写入)

当 CPU 读取或写入指定地址时,中断到调试器。

w(写入)

当 CPU 写入指定地址时,中断到调试器。

i (i/o)

(仅内核模式,仅基于 x86 的系统)访问指定地址处的 I/O 端口时,中断到调试器。

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

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

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

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

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

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

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

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

/w dx 对象表达式根据 dx 对象表达式返回的布尔值设置条件断点。 该参数是一个数据模型 (dx) 表达式,其值为 true(符合条件 - 中断)或 false(不符合条件 - 不中断)。

此示例基于 globalVariable 的值设置条件断点。 例如,这允许访问断点在确定调试器是否应该中断时检查写入的值。

ba w 4 /w "mymodule!globalVariable == 4" mymodule!globalVariable

此示例演示如何使用 JavaScript 设置断点。

ba w 4 /w "@$scriptContents.myFunc(mymodule!globalVariable)" mymodule!globalVariable

有关调试器对象的详细信息,请参阅 dx(显示调试器对象模型表达式)

有关条件断点的详细信息,请参阅设置条件断点

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

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

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

必须用引号括住该命令字符串,并用分号分隔多个命令。 可以使用标准 C 控制字符(如 \n\")。 包含在二级引号 (\") 中的分号会被解释为内嵌引号字符串的一部分。

此参数是可选的。

环境

说明
模式 用户模式、内核模式
目标 仅限实时调试
平台 全部

其他信息

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

注解

调试器使用 ID 号在以后的 bc(清除断点)bd(清除断点)be(启用端点) 命令中指代断点。

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

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

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

在处理器对与指定区域重叠与不完全相同的内存区域执行操作时,可能会发生此情况。 在此示例中,包含 0x70001000 至 0x7000100F 范围的单个写入操作,或仅包含 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