模块调试器 (Modular Debugger, MDB) 是用于 Solaris 的通用调试工具,其主要特性是可扩展性。 本书介绍如何使用 MDB 调试复杂的软件系统,尤其着重介绍了可用于调试 Solaris 内核以及关联的设备驱动程序和模块的工具。 本书还提供了 MDB 语言语法、调试器功能和 MDB 模块编程 API 的完整参考并对它们进行了讨论。
调试是分析软件程序的执行过程和状态以便去除缺陷的过程。 传统的调试工具提供了执行控制功能,以便程序员可以在受控环境中重新执行程序,并显示程序数据的当前状态或以用于开发程序的源语言计算表达式。遗憾的是,这些方法通常不适合用于调试复杂的软件系统,例如:
可能无法重现错误且具有大量相对分散的程序状态的操作系统
已高度优化的程序或已删除其调试信息的程序
本身就是底层调试工具的程序
开发者只能访问事后信息的客户情况
MDB 是一种工具,它可为调试这些程序和方案提供完全可自定义环境,其中包括程序员用来实现其自己的调试命令以执行程序特定的分析的动态模块工具。每个 MDB 模块都可用于在几种不同的上下文(包括实时的和事后的)中检查程序。Solaris 操作系统包含一组 MDB 模块,旨在帮助程序员调试 Solaris 内核以及相关的设备驱动程序和内核模块。第三方开发者可能会发现,为监控程序或用户软件开发和提供自定义的调试模块是很有用的。
MDB 可提供范围广泛的功能集合,用于分析 Solaris 内核和其他目标程序。您可以:
执行 Solaris 内核崩溃转储和用户进程核心转储的事后分析: 除标准数据显示和格式设置功能外,MDB 还包含用于简化复杂的内核和进程状态分析过程的调试器模块集合。 使用调试器模块可以实现复杂查询的公式化,以便:
查找特定线程分配的所有内存
列显内核 STREAM 的直观图
确定特定地址所引用的结构类型
在内核中查找已泄漏的内存块
分析内存以查找栈跟踪
使用高级编程 API 实现自己的调试器命令和分析工具,而不必重新编译或修改调试器本身:在 MDB 中,调试支持的实现形式为一组可装入模块(调试器可以 dlopen(3C) 的共享库),其中每个可装入模块都提供一组扩展调试器本身功能的命令。相应地,调试器提供核心服务的 API,例如读写内存和访问符号表信息的功能。MDB 为开发者提供一个用于针对其自身的驱动程序和模块实现调试支持的框架;然后使这些模块可供所有人使用。
了解如何使用 MDB(如果您已熟悉传统的调试工具 adb 和 crash): MDB 为这些现有调试解决方案提供向后兼容性。MDB 语言本身是 adb 语言的超集;所有现有 adb 宏和命令都在 MDB 内工作,因此使用 adb 的开发者可以立即使用 MDB,而无需了解任何 MDB 特定的命令。 MDB 还提供了功能比 crash 实用程序更强大的命令。
增强的可用性功能可带来许多益处。 MDB 提供了许多可用性功能,其中包括:
命令行编辑
命令历史记录
内置输出页面调度程序
语法错误检查和处理
联机帮助
交互式会话日志记录
在 Solaris 系统中,以共享通用功能的两个命令提供 MDB:mdb 和 kmdb。可以使用 mdb 命令以交互方式或在脚本中调试实时用户进程、用户进程核心转储文件、内核崩溃转储、实时操作系统、目标文件和其他文件。在还需要控制和停止内核执行时,可以使用 kmdb 命令调试实时操作系统内核和设备驱动程序。要启动 mdb,请执行 mdb(1) 命令。要启动 kmdb,请引导系统(如 kmdb(1) 手册页中所述)或执行带 -K 选项的 mdb 命令。
MDB 为开发高级事后分析工具打下了稳定的基础。每个 Solaris 操作系统发行版都包括提供更复杂功能的附加 MDB 模块,用于调试内核和其他软件程序。可以使用 MDB 调试现有的软件程序,以及开发自定义的模块以提高调试自己的 Solaris 驱动程序和应用程序的能力。