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
数据通过 ctfconvert
和 ctfmerge
构建工具添加到二进制库中。ctfconvert
工具解析由编译器创建的 DWARFELF
调试部分,ctfmerge
将 CTFELF
部分从对象合并到可执行文件或共享库。
一些 provider 程序是为 FreeBSD 而非 Solaris™ 提供的。最显著的是 dtmalloc
provider 程序,它允许在 FreeBSD 内核中通过类型跟踪 malloc()
。Solaris™ 中的一些 provider 程序,比如 cpc
和 mib
并不存在于 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
许可证。