Solaris 动态跟踪指南

编译和检测过程

在 Solaris 中编写传统程序时,可使用编译器将程序从源代码转换为可执行的目标代码。使用 dtrace 命令时,将调用先前用于编写 hello.d 程序的 D 语言的编译器。程序编译完毕后,随即发送到操作系统内核中以供 DTrace 执行。在操作系统内核中,将启用程序中指定的探测器,并且对应的提供器会执行激活探测器所需的任何检测过程。

DTrace 中的所有检测过程都是完全动态的:仅在需要使用时分别启用所需的探测器。对于未激活的探测器,不存在任何检测代码,因此在不使用 DTrace 时,系统的性能丝毫不会降低。一旦完成实验脚本并退出 dtrace 命令,便会自动禁用使用的所有探测器,并取消探测器检测过程,从而将系统彻底返回至初始状态。在未激活 DTrace 的系统和未安装 DTrace 软件的系统之间,差异并不明显。

每个探测器的检测过程都在实时运行的操作系统或所选的用户进程上动态地执行。该系统不会以任何方式停顿或暂停,并且仅为启用的探测器添加检测代码。因此,使用 DTrace 所产生的探测影响被准确限制在要求 DTrace 执行的操作上:不会跟踪任何无关的数据,也不会在系统中打开一个大型“跟踪开关”,所有 DTrace 检测过程的设计原则都是尽可能提高效率。通过这些功能,可在生产中使用 DTrace 来实时解决实际问题。

DTrace 框架还提供对任意数量的虚拟客户机的支持。在系统内存容量允许的情况下,您可以同时运行任意数目的 DTrace 实验脚本和命令,并且所有命令都使用同一基本检测过程独立运行。这一功能还可使系统中任意数目的用户同时使用 DTrace:使用 DTrace,开发者、管理员和服务人员可以在同一系统中合作,也可单独处理同一系统中的不同问题,而不会相互干扰。

DTrace D 程序会被编译成一种安全的中间格式,用于在触发探测器时执行,这一点与 C 和 C++ 编写的程序不同,但与 JavaTM 编程语言编写的程序类似。当 DTrace 内核软件对程序进行首次检查时,将会验证该中间格式是否安全。DTrace 执行环境还可处理在 D 程序执行期间可能发生的任何运行时错误,包括除数为零、取消引用无效内存等,并将这些错误向您报告。因此,您永远不会构造出可能使 DTrace 意外损坏 Solaris 内核或系统中运行的某个进程的不安全程序。通过这些安全功能,可在生产环境中使用 DTrace,而不用担心系统崩溃或损坏。如果出现编程错误,DTrace 将向您报告该错误并禁用检测过程。然后,您可以纠正相应错误并重试。有关 DTrace 错误报告和调试功能,请参见本书后续章节。

下图说明了 DTrace 体系结构的各个组件,包括提供器、探测器、DTrace 内核软件和 dtrace 命令。

图 1–1 DTrace 体系结构和组件概述

DTrace 体系结构:内核工具和提供器、从内核到库的驱动程序接口,以及支持一组命令的库。

至此,您已了解 DTrace 的工作方式,现在让我们返回来学习 D 编程语言,并开始编写一些更有趣的程序。