27.2.实现上的差异

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

# kldload dtraceall

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

FreeBSD 使用内核选项 DDB_CTF 启用内核模块和内核自身对 CTF 加载的支持。CTF 是 Solaris™ Compact C Type Format,它封装了一种类似于 DWARF 和古老的 stabs 的调试信息的简化形式。。CTF 数据通过 ctfconvertctfmerge 构建工具添加到二进制库中。ctfconvert 工具解析由编译器创建的 DWARFELF 调试部分,ctfmergeCTFELF 部分从对象合并到可执行文件或共享库。

一些 provider 程序是为 FreeBSD 而非 Solaris™ 提供的。最显著的是 dtmalloc provider 程序,它允许在 FreeBSD 内核中通过类型跟踪 malloc()。Solaris™ 中的一些 provider 程序,比如 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 许可证。