Solaris 模块调试器指南

mdb_layered_walk()

int mdb_layered_walk(const char *name, mdb_walk_state_t *wsp);

在使用指定 walker name 启动的 walk 的顶部,对由 wsp 表示的 walk 进行分层。如果存在命名冲突,则可以使用反引号 (`) 运算符限定名称的作用域。例如,可以使用分层的 walk,以便协助为在其他数据结构中嵌入的数据结构构造 walker。

例如,假定内核中的每个 CPU 结构都包含一个指向嵌入式结构的指针。要为嵌入式结构类型编写 walker,您可以复制代码以迭代 CPU 结构和取消引用每个 CPU 结构的相应成员,或者可以在现有 CPU walker 的顶部对嵌入式结构的 walker 进行分层。

mdb_layered_walk() 函数从 walker 的 init 例程内使用,用于将新层添加到当前 walk。 基础层是在调用 mdb_layered_walk() 的过程中初始化的。调用 walk 例程会传入指向其当前 walk 状态的指针;此状态用于构造分层 walk。在调用调用方的 walk fini 函数后,将清除每个分层 walk。 如果将多个层添加到 walk,则调用方的 walk step 函数将逐步通过第一层返回的每个元素,然后是第二层返回的每个元素,依此类推。

如果成功,mdb_layered_walk() 函数返回 0;如果出错,mdb_layered_walk() 函数返回 -1。如果调试器无法识别指定的 walker 名称,如果 wsp 指针不是有效的、处于活动 walk 状态的指针,如果分层 walker 本身无法初始化,或者如果调用方尝试在其自身的顶部对 walker 进行分层,则该函数失败。