可以在 dbx 中使用数据更改断点来记录变量或表达式的值的更改时间。
要在访问内存地址时停止执行,请键入:
(dbx) stop access mode address-expression [, byte-size-expression] |
mode 指定内存访问模式。可由以下一个或所有字母组成:
已读取指定地址处的内存。
已写入内存。
已执行内存。
mode 还可以包含以下任一项:
访问后停止进程(缺省值)。
访问前停止进程。
在这两种情况下,程序计数器都将指向违例指令。“之前”和“之后”都具有副作用。
address-expression 是求值结果为地址的任何表达式。如果提供符号表达式,则会自动推导出要监视的区域大小;可以通过指定 byte-size-expression 将其覆盖。也可以使用非符号、无类型地址表达式,在这种情况下,必须提供大小。
在以下示例中,将在读取了内存地址 0x4762 后停止执行。
(dbx) stop access r 0x4762 : |
在以下示例中,将在写入变量速度前停止执行:
(dbx) stop access wb &speed |
使用 stop access 命令时请记住下列要点:
写入变量时(即使值不变),会发生事件。
缺省情况下,在执行了写入变量的指令后会发生事件。可以通过将模式指定为 b 来指示要在执行指令前发生事件。
有关指定访问事件的更多信息,请参见access mode address-expression [, byte-size-expression ]和stop 命令。
(dbx) stop change variable |
dbx 会将程序停止在引起指定变量值更改的行后面的那一行。
如果 variable 是函数的局部变量,则第一次进入函数并分配 variable 的存储空间时,便认为该变量已更改。对于参数也是如此。
该命令无法与多线程应用程序配合使用。
有关指定更改事件的更多信息,请参见change variable和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 会发出错误,说明无法执行此操作。
与使用 change 事件相比,使用 access 事件监视数据更改的速度更快。access 事件不是自动单步执行程序,而是使用速度快得多的页保护方案。
要在条件语句的求值结果为 true 时停止程序执行,请键入:
(dbx) stop cond condition |
condition 发生时,程序便停止执行。
使用 stop cond 命令时请记住下列要点:
dbx 会将程序停止在使条件的求值结果为 true 的行后面的那一行。
该命令无法与多线程应用程序配合使用。
有关指定条件事件的更多信息,请参见cond condition-expression和stop 命令。