我有一台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上安装开发人员命令行工具。但这对我来说毫无意义,只是在黑暗中拍摄。

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

============ [启用的根帐户] ====================

所以我启用了根帐户并重新运行了命令
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上也注意到了这一点。

如果sudo产生了dtrace,则Ctrl-C无效。

如果您使用sudo -i来获取根shell,然后调用dtrace,则它会起作用。

关于macos - DTrace END探针永不触发,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11166477/

10-11 22:54