使用单个提供程序名称为插件创建 dtrace 探针

Posted

技术标签:

【中文标题】使用单个提供程序名称为插件创建 dtrace 探针【英文标题】:Creating dtrace probes for plugins using single provider name 【发布时间】:2009-02-27 18:37:39 【问题描述】:

请注意,这是针对 Mac OS X 的,尽管我认为我的问题在任何支持 dtrace 的操作系统上都会存在。

我有一个使用很多插件的应用程序。我在核心应用程序和插件本身中都添加了用户态探测器。问题是,如果我在主应用程序使用的插件中使用相同的提供程序名称,当我尝试创建可用探针列表时,这些探针不会显示。看来谁的代码先加载谁就赢了。

我的主应用程序中的 .d 文件:

provider MyApp 
    probe doSomething();
;

在我的插件中:

provider MyApp 
    probe plugin_doSomethingPluginish();
;

将提供程序的名称更改为其他名称(例如 MyAppPlugin)可以正常工作,但随后提供程序的列表将变得疯狂(MyAppPlugin1、MyAppPlugin2 等)。我想有一种方法可以在与主应用程序相同的提供程序名称下添加新的插件定义探针,但我要么没有看到它,要么它不存在。

那么有没有办法做到这一点?如果不是,即使模块名称已经是唯一的,为每个插件提供不同的提供程序是否正常?似乎这就是模块名称的含义......

【问题讨论】:

【参考方案1】:

您应该只定义一个 provider.d 文件,然后使用任何这些探针将 .h 文件导入每个类,实际上没有理由创建多个 .d 文件,每个文件都列出相同的提供者。我刚刚检查了有关此的 DTrace 文档,并没有立即看到任何有关它的信息,但是是的,我认为多个 .d 文件每个都定义相同的提供程序会产生某种冲突,或者加载相同的探针列表provider 就像重新定义探测列表,而不是按照您的预期扩展它。

【讨论】:

这个问题是每个插件都是它自己的项目。无法创建从插件项目到主应用程序项目的依赖项。我想我可以为主项目构建 .h 文件,然后将其复制到每个插件,但是在进行更改时更新会很痛苦。 真的,至少如果你定义了不同的提供者,你可以为不同的提供者保持相同的前缀,这样你就可以做 dtrace -l -n MyApp*:::entry 等方式将列出与该前缀匹配的所有提供者

以上是关于使用单个提供程序名称为插件创建 dtrace 探针的主要内容,如果未能解决你的问题,请参考以下文章

优胜美地系统红宝石上缺少 dtrace 探针

从 C 程序访问 dtrace 探针

在 C++ 中使用 Dtrace 设置我自己的探针

如何在 SmartOS 上使用 HotSpot DTrace 探针?

DTrace `pid` 提供程序不会触发一些 `return` 探测

请问dtrace启用了哪些探针?