在程序中,同一名称可能会引用不同类型的程序实体,并可能会在许多作用域中出现。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 命令。
如果在表达式中指定了名称(没有完全限定),则 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 会按编译器在当前访问作用域中进行操作的同样方式解析这些符号。
在使用当前访问作用域的当前函数的作用域内(请参见访问作用域)。如果程序在嵌套块中停止,则 dbx 会在该块内搜索,然后在所有封装块的作用域中搜索。
仅限于 C++: 当前函数的类及其基类的类成员。
仅限于 C++: 当前名字空间。
当前函数的参数。
立即封装模块,通常为包含当前函数的文件。
供此共享库或可执行文件专用的符号。可使用链接程序作用域来创建这些符号。
主程序的全局符号,然后为共享库的全局符号。
如果上述搜索都不成功,则 dbx 会假定您正在引用其他文件中的专用或文件静态变量或函数。dbx 可选择根据 dbxenv 设置 scope_look_aside 的值在每个编译单元中搜索文件静态符号。
无论 dbx 使用符号的哪个具体值,它都会先沿此搜索路径查找。如果 dbx 找不到符号,它会报告错误。
要为静态符号和 C++ 成员函数放宽作用域查找规则,请将 dbx 环境变量 scope_look_aside 设置为 on:
dbxenv scope_look_aside on
或者,使用“双反引号”前缀:
stop in ``func4 func4 may be static and not in scope
如果将 dbx 环境变量 scope_look_aside 设置为 on,则 dbx 会查找:
在其他文件中定义的静态变量(如果在当前作用域中没有找到)。不会搜索 /usr/lib 下的库中的文件。
没有类限定的 C++ 成员函数。
其他文件中的 C++ 内联成员函数实例化(如果某个成员函数在当前文件中未实例化)。
which 命令会告知您 dbx 选择哪个符号。如果有二义名,重载显示列表会指明 dbx 尚未确定它会使用两个或更多名称中的哪一个具体值。dbx 会列出可能的值,等待您从中选择一个。
有关更多信息,请参见func 命令。