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

退出打印视图

更新时间: 2015 年 1 月
 
 

使用调用方过滤器限定断点

没有经验的用户有时会将设置条件事件命令(监视类型命令)与使用过滤器混淆。从概念上来说,“监视”会创建在执行每行代码前必须检查的前提条件(在监视的作用域内)。但即便是有条件触发的断点命令也可以连接过滤器。

假设有这样一个示例:

(dbx) stop access w &speed -if speed==fast_enough

此命令指示 dbx 监视变量 speed;如果变量 speed 已写入(“监视”部分),则 -if 过滤器生效。dbx 检查 speed 的新值是否等于 fast_enough。如果不等,程序会继续执行,而“忽略”stop 命令。

dbx 语法中,过滤器以命令末尾处的 [-if condition] 形式表示。

stop in function [-if condition]

假设有一个包含以下代码的简单示例:

44:     if(open(filename, ...) == -1)
45:          return "Error";

您可以使用以下命令在出现某一特定故障时停止执行,例如,open()ENOENT

(dbx) stop at 45 -if errno == 2

使用过滤器,可以非常方便地在局部变量上放置数据更改断点。在以下示例中,当前作用域处在函数 foo() 中,而相关变量 index 处在函数 bar() 中。

(dbx) stop access w &bar`index -in bar

bar`index 用于确保选取的是函数 bar() 中的 index 变量,而不是函数 foo 中的 index 变量或名为 index 的全局变量。

    -in bar 表示以下内容:

  • 进入函数 bar() 时自动启用断点。

  • 在执行 bar()(包括所调用的任何函数)期间,断点保持启用状态。

  • bar() 返回时自动禁用断点。

某些其他函数的其他局部变量可能会重用与 index 对应的堆栈位置。-in 用于确保仅当访问 bar`index 时触发断点。