Solaris 模块调试器指南

_mdb_init()

const mdb_modinfo_t *_mdb_init(void);

为了达到链接和标识目的,要求每个调试器模块提供一个名为 _mdb_init() 的函数。此函数返回一个指向持久性(即,未声明为自动变量)mdb_modinfo_t 结构的指针,如 <sys/mdb_modapi.h> 中所定义:

typedef struct mdb_modinfo {

        ushort_t mi_dvers;               /* Debugger API version number */

        const mdb_dcmd_t *mi_dcmds;      /* NULL-terminated list of dcmds */

        const mdb_walker_t *mi_walkers;  /* NULL-terminated list of walks */

} mdb_modinfo_t;

mi_dvers 成员用于标识 API 版本号,应该始终设置为 MDB_API_VERSION。因此,当前的版本号会被编译到每个调试器模块中,这样调试器就可以识别和验证模块所使用的应用程序二进制接口。调试器不装入为比调试器本身更新的 API 版本编译的模块。

mi_dcmdsmi_walkers 成员(如果不为 NULL)分别指向 dcmd 和 walker 定义结构的数组。每个数组都必须以 NULL 元素结尾。这些 dcmd 和 walker 是在模块装入过程中安装并向调试器注册的。如果一个或多个 dcmd 或 walker 定义不正确,或者它们的名称相冲突或无效,则调试器将拒绝装入模块。Dcmd 和 walker 名称不得包含对调试器具有特殊含义的字符,如引号和圆括号。

模块也可以使用模块 API 执行 _mdb_init() 中的代码,以确定它是否适合装入。例如,在存在某些符号时模块只能适合于特定的目标。如果找不到这些符号,则模块可以从 _mdb_init() 函数返回 NULL。在这种情况下,调试器将拒绝装入模块,并列显相应的错误消息。