作用域是按变量或函数的可见性定义的程序子集。如果某个符号的名称在给定执行点是可见的,则称该符号“在作用域内”。在 C 语言中,函数可以具有全局或文件静态作用域;变量可以具有全局、文件静态、函数或块作用域。
以下变量总是反映当前线程或 LWP 的当前程序计数器,而且不受更改访问作用域的各种命令的影响:
当前程序计数器的作用域
当前行号
当前函数
$func 所属的类
当前源文件
当前装入对象
使用 dbx 检查程序的各种元素时,需要修改访问作用域。dbx 在表达式求值期间使用访问作用域来实现解析二义符号等目的。例如,如果键入以下命令,dbx 会使用访问作用域来确定要输出哪个 i。
(dbx) print i
每个线程和 LWP 都有自己的访问作用域。在线程间切换时,每个线程都会记住其访问作用域。
访问作用域的某些组件在以下预定义的 ksh 变量中是可见的:
当前访问作用域
当前访问装入对象
当前访问文件
当前访问行号
$vfunc 所属的类
当前访问函数
当前访问作用域的所有组件相互间保持兼容。例如,如果您访问不包含函数的文件,则当前访问源文件会更新为新的文件名,并且当前访问函数会更新为 NULL。
下列命令是更改访问作用域的最常用方法:
func
file
up
down
frame
list procedure
debug 命令和 attach 命令可设置初始访问作用域。
遇到断点时,dbx 会将访问作用域设置为当前位置。如果将 stack_find_source 环境变量(请参见设置 dbx 环境变量)设置为 ON,则 dbx 会尝试查找并激活有源代码的栈帧。
使用 up 命令(请参见up 命令)、down 命令(请参见down 命令)、frame number 命令(请参见frame 命令)或 pop 命令(请参见pop 命令)更改当前栈帧时,dbx 根据新的栈帧中的程序计数设置访问作用域。
仅当使用 list function 或 list file 命令时,list 命令(请参见list 命令)使用的行号位置才会更改访问作用域。在设置访问作用域后,list 命令的行号位置会设置为访问作用域的第一个行号。以后使用 list 命令时,list 命令的当前行号位置会更新,但只要是列出当前文件中的代码行,访问作用域就不会更改。例如,如果键入以下内容,dbx 会列出 my_func 源的开头,并将访问作用域更改为 my_func。
(dbx) list my_func
如果键入以下内容,dbx 会列出当前源文件的第 127 行,但不会更改访问作用域。
(dbx) list 127