Oracle® Developer Studio 12.5:使用 dbx 调试程序

退出打印视图

更新时间: 2016 年 6 月
 
 

查找符号

在程序中,同一名称可能会引用不同类型的程序实体,并可能会在许多作用域中出现。dbx whereis 命令会列出全限定名称,即该名称的所有符号的位置。如果在表达式中给出该名称,则 dbx which 命令会告知 dbx 将使用符号的哪个具体值。

输出符号具体值列表

要输出指定符号的所有具体值的列表,请使用 whereis symbol,,其中 symbol 可以是用户定义的任何标识符。例如:

(dbx) whereis table
forward: `Blocks`block-draw.cc`table
function: `Blocks`block.cc`table::table(char*, int, int, const point&)
class: `Blocks`block.cc`table
class: `Blocks`main.cc`table
variable:       `libc.so.1`hsearch.c`table

输出内容包括程序在其中定义 symbol 的可装入对象的名称、及其实体类型:类、函数或变量。

由于 dbx 符号表中的信息是在需要时才读入,因此 whereis 命令只记录已装入符号的具体值。 随着调试会话越来越长,具体值列表也会增长。有关更多信息,请参见对象文件和可执行文件中的调试信息

确定 dbx 使用哪个符号

如果在表达式中指定了名称(没有完全限定),则 which 命令会告知 dbx 使用哪个具有给定名称的符号。例如:

(dbx) func
wedge::wedge(char*, int, int, const point&, load-bearing-block*)
(dbx) which draw
`block-draw.cc`wedge::draw(unsigned long)

如果指定的符号名不在局部作用域中,则 which 命令会沿着作用域转换搜索路径搜索该符号的第一个具体值。如果 which 找到该名称,则它会报告全限定名称。

如果搜索操作在搜索路径中的任何位置找到了 symbol 的处于同一作用域级别的多个具体值,则 dbx 会在命令窗格中输出一条消息,报告这种不明确情况。

(dbx) which fid
More than one identifier `fid’.
Select one of the following:
 0) Cancel
 1) `example`file1.c`fid
 2) `example`file2.c`fid

dbx 会显示重载信息,并列出二义符号名。在 which 命令的上下文中,从具体值列表中进行选择不会影响 dbx 或程序的状态。无论选择哪个具体值,dbx 都会回显名称。

如果使 symbol(本例中为 block)成为必须对 symbol 运行的某个命令(例如,print 命令)的参数,则 which 命令会让您预览将发生的事情。如果有二义名,重载显示列表会指明 dbx 尚未记录它会使用两个或更多名称中的哪一个具体值。dbx 会列出可能的值,等待您从中选择一个。

作用域转换搜索路径

    当您发出包含表达式的调试命令时,将按以下顺序查找表达式中的符号。dbx 会按编译器在当前访问作用域中进行操作的同样方式解析这些符号。

  1. 在使用当前访问作用域的当前函数的作用域内,如果程序在嵌套块中停止,则 dbx 会在该块内搜索,然后在所有封装块的作用域中搜索。

  2. 仅限于 C++: 当前函数的类及其基类的类成员。

  3. 仅限于 C++: 当前名字空间。

  4. 当前函数的参数。

  5. 立即封装模块,通常为包含当前函数的文件。

  6. 供此共享库或可执行文件专用的符号。可使用链接程序作用域来创建这些符号。

  7. 主程序的全局符号,然后为共享库的全局符号。

  8. 如果上述搜索都不成功,则 dbx 会假定您正在引用其他文件中的专用或文件静态变量或函数。dbx 可选择根据 dbxenv 设置 scope-look-aside 的值在每个编译单元中搜索文件静态符号。

无论 dbx 使用符号的哪个具体值,它都会先沿此搜索路径查找。如果 dbx 找不到符号,它会报告错误。

放宽作用域查找规则

要为静态符号和 C++ 成员函数放宽作用域查找规则,请将 dbxenv 变量 scope-look-aside 设置为 on

dbxenv scope-look-aside on

您还可以使用“双反引号”前缀:

stop in ``func4            func4 may be static and not in scope

    如果将 dbxenv 变量 scope-look-aside 设置为 on,则 dbx 查找以下内容:

  • 在其他文件中定义的静态变量(如果在当前作用域中没有找到)。不会搜索 /usr/lib 下的库中的文件。

  • 没有类限定的 C++ 成员函数。

  • 其他文件中的 C++ 内联成员函数实例(如果某个成员函数在当前文件中未实例化)。

which 命令会告知您 dbx 选择哪个符号。如果有二义名,重载显示列表会指明 dbx 尚未确定它会使用两个或更多名称中的哪一个具体值。dbx 会列出可能的值,等待您从中选择一个。