Macos 为什么iosnoop(IO窥探磁盘上的文件)返回带有问号的路径?
如果我在跑步Macos 为什么iosnoop(IO窥探磁盘上的文件)返回带有问号的路径?,macos,path,io,trace,dtrace,Macos,Path,Io,Trace,Dtrace,如果我在跑步 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:m
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
?简短的答案是:
iosnoop
是一个利用DTrace可观察性的脚本
框架特别是,它使用io
提供程序的start
和done
probe;开始探测公开请求的bufinfo\u t
,
目标设备的devinfo\t
和相应文件的
. fileinfo\u t
不是本机达尔文类型:
它是由dtrace(1)提供的结构,提供
方便地抽象文件,以方便用户。
例如,其成员中有fi_pathname
,这
应该给出文件的完整路径名
具有抽象描述可以保护用户及其
脚本,从对底层的了解和更改
操作系统的实现。理论上,它还允许
在不同操作系统上运行的单个脚本
总共
文件信息是动态构造和填充的
使用/usr/lib/DTrace/io.d
中描述的DTrace。
这显示了操作系统特定类型的转换
抽象地说。就雪豹而言,我看到了
fi_路径名
由字符串“?/”后跟
IO缓冲区的一些衍生物。我不是达尔文的专家,但是
我推断它只是没有在它的目录中记录完整的路径名
vnodes。因此,这是输出中“?”的来源
还有我为什么认为
路径名不可用
最后,您的DTrace错误。不管出于什么原因,苹果的
DTrace端口的微妙之处在于它排除了跟踪
您看到的错误消息是
典型症状。具体来说,投诉是关于
线路
结果是(同样,在雪豹身上),试图评估
uid
在任何launchd
、磁盘映像帮助
和内核任务
过程恰恰导致了这个错误。我想这些
进程是“出界”的,您看到的错误是
苹果修改的后果。虽然上面的答案提供了良好的技术背景,但如果您只想获得打开文件的完整路径名,我可以通过以下方式使用OS X上的原始DTrace来实现:
sudo dtrace -n 'syscall::open*:entry { printf("%s %s",execname,copyinstr(arg0)); }'
这将显示文件打开,但不显示读取或写入。我从Brendan Gregg的handy DTrace one liners页面上得到:
可悲的是,我仍然不明白为什么iosnoop没有给出完整的路径,尽管它似乎在理论上是可能的
sudo dtrace -n 'syscall::open*:entry { printf("%s %s",execname,copyinstr(arg0)); }'