27.2.实现上的差异 ================= 虽然在 FreeBSD 的 DTrace 与 Solaris™ 的类似,但仍有一些区别。主要区别是 FreeBSD 中的 DTrace 是由一组内核模块实现的,在模块加载之前无法使用 DTrace。要加载所有必须的模块,请执行: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # 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`` 许可证。