ba (Break on Access)
ba 命令设置一个数据断点。该断点在指定内存被访问时触发。
语法
用户模式
[~Thread] ba[ID] Access Size [Options] [Address [Passes]] ["CommandString"]
内核模式
ba[ID] Access Size [Options] [Address [Passes]] ["CommandString"]
参数
- Thread
- 指定要设置断点的线程。该语法的更多信息,查看线程语法。仅有用户模式可以指定线程。
- ID
- 指定一个可选的数字用来标识该断点。如果没有指定ID,则使用第一个可用的断点号。在ba和ID号之间不能加入空格。每种处理器都只支持一定数量的数据断点。但这对ID号码的值没有任何限制。如果使用中括号([])将ID括起来,ID
可以包含任何表达式。该语法的更多信息,查看数值表达式语法。
- Access
- 指定断点触发的访问类型。该参数可以是下面的值之一。
| 选项 |
行为 |
| e (执行) |
当CPU取指定地址的指令时中断到调试器。 |
| r (读/写) |
当CPU读写指定地址时中断到调试器。 |
| w (写) |
当CPU写指定地址时中断到调试器。 |
| i (i/o) |
(Microsoft Windows XP和之后版本、仅内核模式、仅x86系统)当指定Address的I/O端口被访问时中断到调试器。 |
在Access 和Size 之间不能加入空格
注意 在Windows Server 2003 Service Pack 1
(SP1)上,在基于Itanium的计算机上使用WOW64模拟x86,数据断点的执行选项不能使用,但是可以使用读写选项。
- Size
- 指定要监控访问的位置的大小,以字节为单位。在x86处理器上,该参数可以是1、2或4。但是如果Access 为e,Size
必须是1。
在x64处理器上,该参数可以是1、2、4或者8。但是,如果Access 为e,Size
必须是1。
在基于Itanium的处理器上,该参数可以是从1到0x80000000中任何2的幂。
在Access 和Size 间不能加入空格。
- Options
- 指定断点选项。除非单独指出,可以使用任意数量的下面这些选项:
- /1
- 创建一个"一次性" ("one-shot")断点。该断点触发之后就会被从断点列表中永远去除。
- /f PredNum
- (仅Itanium、仅用户模式) 指定一个断言号。该断点使用相应的断言寄存器(predicate register)进行判定(例如,bp
/f 4 address设置一个使用p4断言寄存器进行判定的断点)。关于断言寄存器的更多信息,查看Itanium结构体系。
- /p EProcess
- (仅内核模式) 指定一个和该断点关联的进程。EProcess
必须是EPROCESS结构的实际地址,而不是PID。这种断点仅在指定的进程上下文内遇到的时候才会触发。
- /t EThread
- (仅内核模式) 指定一个和断点关联的线程。EThread必须是ETHREAD结构的实际地址而不是线程ID。这种断点仅在指定的线程上下文内遇到的时候才会触发。如果同时使用/p
EProcess 和/t EThread ,它们可以按任意顺序排列。
- /c MaxCallStackDepth
- 使得断点仅当调用堆栈小于MaxCallStackDepth 深度时才激活。不能将此选项和/C
组合使用。
- /C MinCallStackDepth
- 使得断点仅当调用堆栈大于MinCallStackDepth深度时才激活。不能将此选项和/c
组合使用。
- Address
- 指定任意合法地址。如果程序访问了该地址的内存,调试器停止执行并显示所有寄存器和标志的当前值。这个地址必须是一个偏移并且根据不同的Size
参数适当的对齐。(例如,如果Size是4,Address必须是4的倍数。)如果省略掉Address,则会使用当前的指令计数器。该语法的更多信息,查看地址和地址区域语法。
- Passes
- 指定断点激活之前要忽略的次数。该数字可以使任何16位值。程序计数器通过该点而不激活断点的次数是该数字减1次。因此,省略该数字等于将它设置为1。注意该数字只计算程序执行通过该点的次数。单步或跟踪通过该点并不计算在内。当到达指定次数后,可以通过清除和重设断点来重置该计数。
- CommandString
- 指定每次遭遇断点指定次数后需要执行的命令列表。这些命令仅在执行g (Go)命令后遇到断点时才执行,而不能在t (Trace)或p (Step)命令之后执行。CommandString
中的调试器命令可以包含参数。
必须使用引号将该命令字符串括起来,并且需要使用分号来分隔多条命令。可以使用标准C控制字符(如\n
和\")。二级引号(\")中的分号被当作引号中的字符串的一部分。
该参数是可选的
环境
| 模式 |
用户模式、内核模式 |
| 目标 |
仅活动目标 |
| 平台 |
所有 |
注释
调试器使用ID 号来在之后的bc (Breakpoint Clear)、bd (Breakpoint Disable)和be (Breakpoint Enable)命令中引用该断点。使用bl (Breakpoint List)命令来查看关联到当前设置的所有断点上的ID号。
ba 命令支持由调试寄存器提供的一些功能。可以在特定内存位置被读、写或执行时中断下来。
断点仅在给定地址给定长度的内存被访问时起效。如果被访问的内存仅是和要监控的内存部分重叠,断点不会被触发。
虽然所有断点类型都需要大小,但是执行断点仅在该地址是指令的第一个字节时就可以触发。
在内核模式下调试多处理器系统时,使用bp (Set Breakpoint)或ba命令设置的断点会应用到所有处理器。例如,当前处理器是3并且输入了ba
e1 MemoryAddress 来在MemoryAddress
设置一个断点,任何处理器(不止是处理器3)执行到该地址时都会产生断点陷阱。
不能使用ba 命令来为用户模式进程设置初始断点。
不能对相同地址创建多个仅CommandString 值不同的断点。但是,可以在单个地址创建多个不同条件的断点(例如/p、
/t、/c和/C的值不同)。
内核模式调试时,目标机的用户模式和内核模式数据断点有区别。用户模式数据断点不能作用于内核执行或内存访问。根据用户模式代码是否使用了调试寄存器状态和是否有用户模式调试器附加上去,内核模式数据断点可以作用于用户模式的执行或内存访问。
要将当前进程已存在的数据断点应用到另一个寄存器上下文中,可以使用.apply_dbp (Apply Data Breakpoint to Context)命令。
下面的例子说明ba命令的使用。下例对变量myVar 上的4字节读访问设置断点。
0:000> ba r4 myVar
下面的命令对从0x3F8到0x3FB 端口上的所有串口访问设置断点。该断点在对这些端口进行任何读写操作时都会触发。
kd> ba i4 3f8
附加信息
关于如何使用断点的示例和更多信息、其他断点命令和控制断点的方法、如何在内核调试器下设置用户空间的断点,查看使用断点。关于条件断点的更多信息,查看设置条件断点。
Build machine: CAPEBUILD