Sun Studio 12:使用 dbx 调试程序

查找符号

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

打印符号具体值列表

要打印指定符号的所有具体值的列表,请使用 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 命令只记录已装入符号的具体值。随着调试会话越来越长,具体值列表也会增长(请参见目标文件和可执行文件中的调试信息)。

有关更多信息,请参见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 会列出可能的值,等待您从中选择一个。有关 which 命令的更多信息,请参见which 命令

作用域转换搜索路径

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

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

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

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

  4. 当前函数的参数。

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

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

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

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

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

放宽作用域查找规则

要为静态符号和 C++ 成员函数放宽作用域查找规则,请将 dbx 环境变量 scope_look_aside 设置为 on:

dbxenv scope_look_aside on

或者,使用“双反引号”前缀:

stop in ``func4            func4 可以是静态的,也可以不在作用域中。

如果将 dbx 环境变量 scope_look_aside 设置为 on,则 dbx 会查找:

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

有关更多信息,请参见func 命令