11

如果我在跑步

sudo iosnoop | grep "gem"

然后在另一个终端运行

gem env

在 iosnoop 终端中,我看到:

dtrace: error on enabled probe ID 4 (ID 1106: io:mach_kernel:buf_strategy:start): illegal operation in action #3 at DIF offset 0
dtrace: error on enabled probe ID 4 (ID 1106: io:mach_kernel:buf_strategy:start): illegal operation in action #3 at DIF offset 0
dtrace: error on enabled probe ID 4 (ID 1106: io:mach_kernel:buf_strategy:start): illegal operation in action #3 at DIF offset 0
dtrace: error on enabled probe ID 4 (ID 1106: io:mach_kernel:buf_strategy:start): illegal operation in action #3 at DIF offset 0
dtrace: error on enabled probe ID 4 (ID 1106: io:mach_kernel:buf_strategy:start): illegal operation in action #3 at DIF offset 0
...
dtrace: error on enabled probe ID 4 (ID 1106: io:mach_kernel:buf_strategy:start): illegal operation in action #3 at DIF offset 0
  501 54406 R 21523616    512       bash ??/bin/gem
  501 94092 R 141320288   4096       bash ??/bin/gem
  501 94092 R 141320168   4096       ruby ??/1.8/rubygems.rb
  501 94092 R 141320208   4096       ruby ??/1.8/rubygems.rb
  501 94092 R 141319208   4096       ruby ??/rubygems/errors.rb
  501 94092 R 141319856   4096       ruby ??/rubygems/specification.rb
  501 94092 R 141319864   4096       ruby ??/rubygems/specification.rb
  501 94092 R 141319872   4096       ruby ??/rubygems/specification.rb
  501 94092 R 141319888   4096       ruby ??/rubygems/specification.rb
  501 94092 R 141319896   4096       ruby ??/rubygems/specification.rb
  501 94092 R 141319904   4096       ruby ??/rubygems/specification.rb
  501 94092 R 141319928   4096       ruby ??/rubygems/specification.rb
  501 94092 R 141319936   4096       ruby ??/rubygems/specification.rb
  501 94092 R 141319944   4096       ruby ??/rubygems/specification.rb
  501 94092 R 141320176   4096       ruby ??/1.8/rubygems.rb
  501 94092 R 141320184   4096       ruby ??/1.8/rubygems.rb
  ...

处理文件路径中 ruby​​ 附近的问号是什么:

ruby ??/1.8/rubygems.rb

? 我怎样才能找到所有这些文件的绝对路径?

附加问题 - 为什么这里有错误:

dtrace: error on enabled probe ID 4 (ID 1106: io:mach_kernel:buf_strategy:start): illegal operation in action #3 at DIF offset 0

?

4

2 回答 2

10

简短的答案是:

  1. 这 ??表示剩余路径名未知,
  2. 你不能提取绝对路径和
  3. 这是 OS X 上 DTrace 的一项功能,而不是错误。

对这些点的解释需要对 DTrace 有一定的了解;如果合适,那么从介绍 Solaris 版本开始。

iosnoop是一个利用 DTrace 可观察性框架的脚本。特别是,它使用io提供者startdone探测器;开始探测公开请求bufinfo_t、目标设备devinfo_t和相应文件的 fileinfo_t. 不是原生的fileinfo_tDarwin 类型:它是 dtrace(1) 提供的一种结构,为用户提供方便的文件抽象。例如,在它的成员中是fi_pathname,它应该给出文件的完整路径名。

有一个抽象的描述可以保护用户和他们的脚本免受操作系统底层实现的知识和改变。理论上,它还允许单个脚本完全在不同的操作系统上运行。

fileinfo_t使用/usr/lib/dtrace/io.d. 这显示了从特定于操作系统的类型到抽象的转换。在 Snow Leopard 的情况下,我看到它 fi_pathname是由字符串“??/”构造的,后跟 IO 缓冲区的一些衍生物。我不是达尔文专家,但我推断它根本没有在其 vnode 中记录完整路径名。因此,这就是“??”的由来。在脚本的输出中,也是我假设绝对路径名不可用的原因。

最后,您的 DTrace 错误。无论出于何种原因,Apple 的 DTrace 端口被巧妙地削弱了,因为它排除了对各种进程的跟踪,并且您看到的错误消息是一个特征症状。具体来说,投诉是关于线路的

start_uid[this->dev, this->blk] = (int)uid;

事实证明(再次在 Snow Leopard 上),尝试评估 uid任何launchd,diskimages-helpkernel_task 进程都会导致这个错误。我认为这些过程“越界”,您看到的错误是 Apple 修改的后果。

于 2013-08-13T00:59:50.657 回答
6

虽然上面的答案提供了良好的技术背景,但如果您只想获取打开文件的完整路径名,我可以通过以下方式在 OS X 上使用原始 DTrace 来做到这一点:

sudo dtrace -n 'syscall::open*:entry { printf("%s %s",execname,copyinstr(arg0)); }'

这将显示文件打开,但不显示读取或写入。我从 Brendan Gregg 方便的 DTrace one liner 页面得到这个: http ://www.brendangregg.com/DTrace/dtrace_oneliners.txt

可悲的是,我仍然不明白为什么 iosnoop 没有给出完整的路径,而理论上它似乎是可行的。

于 2013-12-04T23:35:52.460 回答