DTrace END 探针从不触发

Posted

技术标签:

【中文标题】DTrace END 探针从不触发【英文标题】:DTrace END probe never fires 【发布时间】:2012-06-23 03:05:38 【问题描述】:

我有一台 2009 年中期的 MacBook Pro 和一台新的 2012 MacBook Pro,我正在学习 DTrace(一个非常棒的工具)。当我在新的 2012 MBP 上计算聚合时,聚合不会打印出来。

sudo dtrace -n 'syscall:::entry  @[execname] = count() '

在我的 2009 年中期 MBP 中,它显示如下:

  usbmuxd                                                           1
  GrowlHelperApp                                                    2
  imklaunchagent                                                    2
  installd                                                          2
  stackshot                                                         2
  ...

2012 MBP 没有显示任何内容。

我在 BEING 和 END 探针中添加了一个 printf,以查看 END 探针是否会像这样触发:

BEGIN

    printf("Hi!");


syscall:::entry

   @[execname] = count();


END

    printf("Bye!")

在 2009 年中期的 MBP 上,两个探头都发射并打印,而在 2012 MBP 上,只有 BEGIN 探头发射。 END 从未触发过。

两个 MBP 都运行 Lion 10.7.3。我不确定下一步该尝试什么。现在想到的唯一区别是我没有在 2012 MBP 上安装开发人员命令行工具。但这对我来说没有意义,而且是在黑暗中开枪。

任何帮助或想法将不胜感激。谢谢。

=============[已启用的 Root 帐户]=====================

所以我启用了 root 帐户并重新运行了命令

sudo dtrace -n 'syscall:::entry  @[execname] = count() '

没有成功,但如果我成功了

su
dtrace -n 'syscall:::entry  @[execname] = count() '

有效!

=============[kill -s INT]============================ =

我做了更多的实验。如果我跑:

sudo kill -s INT [pid of dtrace]

一切正常并显示输出。

如果我跑:

sudo kill -s INT [pid of sudo running dtrace]

这也有效!

但如果我在终端中使用 control-c,它不会 显示输出。

control-c 和 kill -s INT 有什么区别?

【问题讨论】:

在您的系统上尝试to enable "root"。 【参考方案1】:

我在 linux 上也注意到了这一点。

如果 dtrace 由 sudo 生成,则 Ctrl-C 不起作用。

如果你 sudo -i 获得一个 root shell,然后调用 dtrace 它可以工作。

【讨论】:

我仍然不确定这两个 mac 之间发生了什么变化,但这确实有效,而且比试图终止进程更容易。我也尝试了 sudo -s 并且它有效。谢谢 可能是 sudo 的版本。我很好奇你的旧 macosx 中的 sudo 版本是什么? 这在 OSX 10.8 上帮助了我。谢谢!

以上是关于DTrace END 探针从不触发的主要内容,如果未能解决你的问题,请参考以下文章

DTrace - 如何在返回探针中正确检索初始参数

Dtrace 无效的探针说明符错误

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

请问dtrace启用了哪些探针?

从 C 程序访问 dtrace 探针

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