您可以使用数据更改断点(也称为“监视点”)在 dbx 中注明更改变量或表达式值的时间。
使用 stop access 命令可在已访问内存地址时停止执行:
(dbx) stop access mode address-expression [, byte-size-expression]
mode 指定内存访问模式。有效的模式选项包括:
已读取指定地址处的内存。
已写入内存。
已执行内存。
mode 还可以包含以下任一项:
访问后停止进程(缺省值)。
访问前停止进程。
在这两种情况下,程序计数器都将指向访问指令。“之前”和“之后”都具有副作用。
address-expression 是求值结果为地址的任何表达式。如果提供符号表达式,则会自动推导出要监视的区域大小。可以通过指定 byte-size-expression 覆盖它。也可以使用非符号、无类型地址表达式,在这种情况下,必须提供大小。
在以下示例中,该命令将在读取了内存地址 0x4762 之后在任意四个字节后停止执行。
(dbx) stop access r 0x4762, 4
在以下示例中,将在写入变量速度前停止执行:
(dbx) stop access wb &speed
使用 stop access 命令时请记住下列要点:
写入变量时(即使值不变),会发生事件。
缺省情况下,在执行了写入变量的指令后会发生事件。可以通过将模式指定为 b 来指示要在执行指令前发生事件。
有关指定 access 事件的更多信息,请参见access 事件规范 和stop 命令。
如果指定变量的值已更改,请使用 stop change 命令停止程序执行:
(dbx) stop change variable
dbx 会将程序停止在引起指定变量值更改的行后面的那一行。
如果 variable 是函数的局部变量,则第一次进入函数并分配 variable 的存储空间时,便认为该变量已更改。对于参数也是如此。
该命令无法与多线程应用程序配合使用。
有关指定 change 事件的更多信息,请参见change 事件规范 和stop 命令。
dbx 实现的 stop change 操作是自动单步执行且每一步都检查值。如果库未使用 -g 选项进行编译,则单步执行会跳过库调用。因此,如果控制按以下方式流动,dbx 便不会跟踪嵌套的 user_routine2,因为跟踪会跳过库调用和对 user_routine2 的嵌套调用。
user_routine calls library_routine, which calls user_routine2, which changes variable
variable 值的更改是在从库调用返回后便已发生,而不是在 user_routine2 中发生的。
dbx 无法为块局部变量({} 中嵌套的变量)中的更改设置断点。如果尝试在块局部嵌套变量中设置断点或跟踪,dbx 会发出错误,说明无法执行此操作。
如果条件语句的求值结果为 true,请使用 stop cond 命令停止程序执行:
(dbx) stop cond condition
条件发生时,程序便停止执行。
使用 stop cond 命令时请记住下列要点:
dbx 会将程序停止在使条件的求值结果为 true 的行后面的那一行。
该命令无法与多线程应用程序配合使用。