Solaris 模块调试器指南

附录 B 注意事项

警告

以下警告信息适用于使用 MDB 的情况。

使用错误恢复机制

调试器及其 dmod 在同一地址空间中执行,因此错误的 dmod 很可能会导致 MDB 转储核心或行为异常。信号处理中介绍的 MDB resume 功能针对这些情况提供了一种受限制的恢复机制。但是,MDB 无法明确知道相关的 dmod 是仅损坏了自己的状态还是损坏了调试器的全局状态。因此,无法保证 resume 操作是安全的或可防止调试器将来崩溃。执行 resume 之后最安全的做法保存所有重要的调试信息,然后退出并重新启动调试器。

使用调试器修改实时操作系统

使用调试器修改(即写入)实时运行的操作系统的地址空间是极其危险的,如果用户损坏了内核数据结构,可能会导致系统崩溃。

使用 kmdb 停止实时操作系统

使用 kmdb 停止实时操作系统(使用 mdb -K 或通过在实时操作系统中设置断点)适用于开发者,而不适用于生产系统。如果通过 kmdb 停止操作系统内核,则操作系统服务和联网将不会执行,并且网络中与目标系统相关的其他系统将无法访问目标系统。

注意事项

进程核心转储文件的检查限制

对于 Solaris 2.6 之前的 Solaris 操作系统发行版生成的进程核心转储文件,MDB 不会为对其进行检查提供支持。如果在一种操作系统发行版上检查其他操作系统发行版中的核心转储文件,则运行时链接编辑器调试接口 (librtld_db) 可能无法初始化。在这种情况下,共享库的符号信息将不可用。 此外,由于用户核心转储文件中不存在共享映射,因此共享库的文本部分和只读数据可能与转储核心时进程中存在的数据不匹配。不能在 Solaris SPARC 系统上检查 Solaris Intel 系统中的核心转储文件,反之亦然。

崩溃转储文件的检查限制

Solaris 7 和早期发行版中的崩溃转储只能借助对应操作系统发行版中的 libkvm 进行检查。 如果一种操作系统发行版中的崩溃转储是使用其他操作系统发行版中的 dmod 检查的,则内核实现中的更改可能会使一些 dcmd 或 walker 无法正常工作。如果 MDB 检测到此情况,将会发出一条警告消息。不能在 Solaris SPARC 系统上检查 Solaris Intel 系统中的崩溃转储,反之亦然。

32 位调试器和 64 位调试器之间的关系

MDB 支持对 32 位程序和 64 位程序进行调试。MDB 在检查目标并确定其数据模型后,将自动重新执行具有与目标相同的数据模型的 mdb 二进制代码(如有必要)。此方法简化了编写调试器模块的任务,因为装入的模块将使用与主要目标相同的数据模型。只能使用 64 位调试器调试 64 位目标程序。64 位调试器只能在运行 64 位操作环境的系统上使用。

kmdb 可用内存的限制

可供 kmdb 使用的内存是在装入调试器时分配的,在此之后无法进行扩展。如果调试器命令尝试分配的内存多于可用内存,这些命令将无法执行。调试器会尝试从内存不足的情况正常恢复,但是在紧急情况下可能会强制终止系统。在使用 32位操作系统内核的 x86 平台上,系统内存约束尤其苛刻。

开发者信息

mdb(1) 手册页详细介绍了内置 mdb 功能,以便于开发者参考。头文件 <sys/mdb_modapi.h> 包含 MDB 模块 API 中函数的原型,SUNWmdbdm 软件包用于为目录 /usr/demo/mdb 中的示例模块提供源代码。