Oracle® Solaris Studio 12.4:使用 dbx 调试程序

退出打印视图

更新时间: 2015 年 1 月
 
 

设置数据更改断点(监视点)

您可以使用数据更改断点(也称为“监视点”)在 dbx 中注明更改变量或表达式值的时间。

访问地址时停止执行

使用 stop access 命令可在已访问内存地址时停止执行:

(dbx) stop access mode address-expression [, byte-size-expression]

mode 指定内存访问模式。有效的模式选项包括:

r

已读取指定地址处的内存。

w

已写入内存。

x

已执行内存。

mode 还可以包含以下任一项:

a

访问后停止进程(缺省值)。

b

访问前停止进程。

在这两种情况下,程序计数器都将指向访问指令。“之前”和“之后”都具有副作用。

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

    使用 stop change 命令时请记住下列要点:

  • 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 会发出错误,说明无法执行此操作。


注 -  与使用 change 事件相比,使用 access 事件监视数据更改的速度更快。access 事件不是自动单步执行程序,而是使用速度更快的硬件或 OS 服务。

条件停止执行

如果条件语句的求值结果为 true,请使用 stop cond 命令停止程序执行:

(dbx) stop cond condition

条件发生时,程序便停止执行。

    使用 stop cond 命令时请记住下列要点:

  • dbx 会将程序停止在使条件的求值结果为 true 的行后面的那一行。

  • 该命令无法与多线程应用程序配合使用。

有关指定条件事件的更多信息,请参见cond 事件规范stop 命令