For the complete documentation index, see llms.txt. This page is also available as Markdown.

27.2.实现上的差异

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

# kldload dtraceall

从 FreeBSD 10.0-RELEASE 开始,当运行 dtrace(1) 时,这些模块会自动加载。

FreeBSD 使用 DDB_CTF 内核选项来支持从内核模块及内核本身加载 ctf(5) 数据。CTF 是 Solaris™ 的 Compact C Type Format,用于封装简化的调试信息,类似于 DWARF 和传统的 stabs。CTF 数据由 ctfconvert(1)ctfmerge(1) 构建工具添加到二进制文件中。ctfconvert 工具解析编译器生成的 DWARF ELF 调试段,而 ctfmerge 将对象文件中的 CTF ELF 段合并到可执行文件或共享库中。

FreeBSD 中存在一些与 Solaris™ 不同的 provider。其中最值得注意的是 dtmalloc provider,它允许在 FreeBSD 内核中按类型跟踪 malloc(9)。某些 Solaris™ 中的 provider(如 cpc)在 FreeBSD 中不存在,但可能会出现在未来版本中。此外,两者均存在的 provider 可能不兼容,其探针的参数类型不同。因此,在 Solaris™ 上编写的 D 脚本在 FreeBSD 上可能无需修改就能运行,也可能需要修改,反之亦然。

由于安全机制的不同,FreeBSD 上只有 root 用户可以使用 DTrace。Solaris™ 中存在一些低级安全检查,而 FreeBSD 尚未实现。因此,/dev/dtrace/dtrace 严格限制为 root 使用。

DTrace 采用通用开发与分发许可证(CDDL)。在 FreeBSD 上查看该许可,请参阅 /usr/src/cddl/contrib/opensolaris/OPENSOLARIS.LICENSE,或在线查看 http://opensource.org/licenses/CDDL-1.0。虽然支持 DTrace 的 FreeBSD 内核采用 BSD 许可,但当模块以二进制形式分发或加载二进制文件时,会使用 CDDL 许可。

最后更新于