DTrace END 探测器永远不会触发



我有一台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 没有显示任何内容。

我在 BE 和 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 帐户并重新运行了命令

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 有什么区别?

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

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

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

相关内容

  • 没有找到相关文章

最新更新