25.2. 实现上的差异

虽然在 FreeBSD 中的 DTrace 与 Solaris™ DTrace 类似,但仍有一些区别。主要区别是 FreeBSD 中的 DTrace 是由一组内核模块实现实现的,在模块加载之前无法使用 DTrace。要加载所有必须的模块,请执行:

  1. # kldload dtraceall

自 FreeBSD 10.0-RELEASE 起,运行 dtrace 会自动加载这些模块。

FreeBSD 使用 DDB_CTF 内核选项启用内核模块和内核自身对 CTF 加载的支持。CTF 是 Solaris™ Compact C Type Format,这种格式能够压缩调试信息,类似于 DWARF 和 stabs。CTF 数据通过 ctfconvertctfmerge 构建工具添加到二进制中。ctfconvert 工具解析由编译器创建的 DWARF``ELF 调试部分,ctfmerge 将对象中的 CTF``ELF 部分合并到可执行程序或共享库中。

一些提供程序是为 FreeBSD 而非 Solaris™ 提供的。最显著的是 dtmalloc 提供程序,它允许在 FreeBSD 内核中通过类型追踪 malloc()。Solaris™ 中的一些提供程序,比如 cpcmib 并不存在于 FreeBSD 中,虽然日后可能提供。此外,一些同时存在于两种操作系统中的提供程序互不兼容,比如它们探测器有不同的参数。所以,在 Solaris™ 中编写的 D 语言脚本在 FreeBSD 中不做修改就可能无法运行,反之亦然。

由于安全措施的差异,在 FreeBSD 上只有 root 能够使用 DTrace。Solaris™ 拥有一些在 FreeBSD 中还不存在的底层安全校验,因此 /dev/dtrace/dtrace 仅限 root 使用。

DTrace 受到 Common Development and Distribution License(CDDL)许可证保护。要在 FreeBSD 中查看此许可证,见 /usr/src/cddl/contrib/opensolaris/OPENSOLARIS.LICENSE 或者在 http://opensource.org/licenses/CDDL-1.0 在线查看。虽然 FreeBSD 内核对于 DTrace 的实现采用 BSD 许可证,但是当模块以二进制形式分发或加载时会使用 CDDL 许可证。