Solaris 模块调试器指南

mdb_readvar()mdb_writevar()

ssize_t mdb_readvar(void *buf, const char *name);

ssize_t mdb_writevar(const void *buf, const char *name);

mdb_readvar()mdb_vread() 类似,只不过读取开始的虚拟地址和要读取的字节数是根据 name 指定的符号的值和大小获取的。 如果找不到该名称的符号,则返回 -1。成功时返回符号大小(读取的字节数);出错时返回 -1。对于读取具有固定大小的已知变量,这是很有用的。例如:

				int hz; 	/* system clock rate */

				mdb_readvar(&hz, "hz");

如果需要区分符号查找失败和读取失败,则调用方可以首先单独查找符号。 调用方还必须仔细检查相关符号的定义,以便确保局部声明的类型与目标定义的类型完全相同。例如,如果调用方声明 int,相关符号实际上是 long,而且调试器检查的是 64 位内核目标,则 mdb_readvar() 会将 8 个字节复制回调用方的缓冲区,在存储 int 后损坏 4 个字节。

mdb_writevar()mdb_vwrite() 相同,只不过写入开始的虚拟地址和要写入的字节数是根据按名称指定的符号的值和大小获取的。 如果找不到该名称的符号,则返回 -1。否则,在成功时返回成功写入的字节数,出错时返回 -1。

对于这两个函数,主要可执行文件的符号表用于符号查找;如果符号驻留在其他符号表中,则必须首先应用 mdb_lookup_by_obj(),然后应用 mdb_vread()mdb_vwrite()