在 Mac 中,执行 Dtrace,但控制台没有可显示的内容

Posted

技术标签:

【中文标题】在 Mac 中,执行 Dtrace,但控制台没有可显示的内容【英文标题】:In Mac ,exec Dtrace, but console has nothing to display 【发布时间】:2013-07-20 09:32:16 【问题描述】:

我是 dtrace 的新手

当我执行代码时sudo dtrace -n 'syscall::read:entry /execname != "dtrace"/ @reads[execname, fds[arg0].fi_pathname] = count(); 然后我在另一个控制台中执行 cat 文件名。 但控制台没有任何显示。

环境:OS x 10.8.4 dtrace:Sun D 1.6.2 需要配置一些吗? 如何解决?

【问题讨论】:

【参考方案1】:

尝试sudo bash 启动root shell,然后不使用sudo 直接运行dtrace。

这是一个值得思考的例子:

root@macbook:~> sudo dtrace -n 'syscall::read:entry /execname != "dtrace"/  @reads[execname, fds[arg0].fi_pathname] = count(); '
dtrace: description 'syscall::read:entry ' matched 1 probe
^C

root@macbook:~> dtrace -n 'syscall::read:entry /execname != "dtrace"/  @reads[execname, fds[arg0].fi_pathname] = count(); '
dtrace: description 'syscall::read:entry ' matched 1 probe
^C

  bash                                                ??/<unknown (NULL v_name)>/ttys022                                1
  fseventsd                                           <unknown (not a vnode)>                                           1
  mds                                                 <unknown (not a vnode)>                                           1
  Terminal                                            <unknown (not a vnode)>                                           2
  firefox                                             <unknown (not a vnode)>                                           2
  activitymonitor                                     <unknown (not a vnode)>                                           3
  Terminal                                            ??/<unknown (NULL v_name)>/ptmx                                   5
  Activity Monito                                     <unknown (not a vnode)>                                           8
  Google Chrome H                                     <unknown (not a vnode)>                                          13
  Google Chrome                                       <unknown (not a vnode)>                                          15
  Google Chrome                                       ??/<unknown (NULL v_name)>/urandom                               72

奇怪的是,使用 sudo 而已经是 root 会导致 DTrace 探测器无法触发。我猜 sudo 会干扰 DTrace 权限。这对我来说是新的(显然,我只从 Mac OS X 上的 root shell 运行dtrace 开始)。我相信其他人可以更好地解释这一点。

【讨论】:

【参考方案2】:

已经迟到了,但是你可以做的就是这样而不是产生一个 root shell。

由于在 Ctrl-c-ing sudo 时会丢失输出缓冲区(因此是输出),因此您可以重写脚本以使用 profile 提供程序转储结果。

配置文件提供程序提供与基于时间的中断相关联的探针,该中断触发每个固定的指定时间间隔。

dtrace -s /dev/stdin

syscall::read:entry /execname != "dtrace"/ 

    @reads[execname, fds[arg0].fi_pathname] = count();

profile:::tick-2sec

    printa(@read);
    trunc(@read);


Ctr-d

我同意 Brendan 的回答,但我总是尽量避免使用持久的 root shell,因为我是一个相当草率和健忘的家伙,迟早我会使用那个 root shell,即一个坏主意。

我希望 MacOS X 开发人员能尽快解决这个 sudo 问题。

此外,我想说的是,尽管有几个人声称,sudo 确实会干扰 dtrace 行为?除了使用 ctrl-c 生成的进程丢失文件描述符之外,我在这方面什么都没遇到。

【讨论】:

以上是关于在 Mac 中,执行 Dtrace,但控制台没有可显示的内容的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 Mac OS X 上通知 DTrace 动态生成的代码?

如何在 Mac OS X 上构建 DTrace?

如何在 Mac OS X Leopard 上的 dtrace 中使用热点探针?

无法在 Mac OS X 上通过 jinfo 启用 DTrace 探测

在 Node.js 程序上使用 DTrace 时没有函数名称

是否可以使用 DTrace 查看传递给 strncpy 的参数?