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

简短的答案是:

  • 这个??表示剩余的路径名未知
  • 您无法提取绝对路径和
  • 这是OSX上DTrace的一个特性,而不是bug
  • 对这些要点的解释需要对DTrace有一定的了解; 如果合适的话,那么从开始

    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)); }'