2013-08-12 33 views
8

Nếu tôi chạyTại sao iosnoop (IO snooping tập tin trên đĩa) trả về đường dẫn với dấu hỏi?

sudo iosnoop | grep "gem" 

và sau đó trong một đợt tăng terminal

gem env 

tại nhà ga iosnoop tôi thấy:

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 
    ... 

là gì các dấu hỏi gần ruby ​​trong đường dẫn đến các tệp được xử lý:

ruby ??/1.8/rubygems.rb 

? Và làm thế nào tôi có thể tìm thấy đường dẫn tuyệt đối tuyệt đối cho tất cả các tệp này?

câu hỏi bổ sung - tại sao những lỗi ở đây:

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

?

Trả lời

9

Những câu trả lời ngắn là:

  1. Các ?? biểu thị rằng tên đường dẫn còn lại là không rõ,
  2. bạn không thể trích xuất các đường dẫn tuyệt đối và
  3. đây là một tính năng, không phải là một lỗi, của DTrace trên OS X.

Giải thích về những điểm này đòi hỏi một số quen thuộc với DTrace; nếu thích hợp, sau đó bắt đầu với introduction to the Solaris version.

iosnoop là tập lệnh khai thác khung quan sát DTrace . Cụ thể, nó sử dụng các đầu dò startdone của nhà cung cấp io của nhà cung cấp; đầu dò khởi động hiển thị yêu cầu bufinfo_t, thiết bị mục tiêu devinfo_t và tệp tương ứng fileinfo_t. fileinfo_t không phải là kiểu gốc Darwin: là cấu trúc được cung cấp bởi dtrace (1) cung cấp sự trừu tượng hóa tiện lợi của một tệp vì lợi ích của người dùng. Ví dụ: Ví dụ, trong số các thành viên là fi_pathname, trong đó phải cung cấp tên đường dẫn đầy đủ của một tệp.

Có mô tả tóm tắt bảo vệ người dùng và các tập lệnh của họ, từ kiến ​​thức và thay đổi về triển khai thực hiện cơ bản của hệ điều hành. Về lý thuyết, nó cũng cho phép một tập lệnh đơn chạy trên các hệ điều hành khác nhau hoàn toàn.

Một tệpinfo_t được tạo và điền động bằng cách sử dụng DTrace translator được mô tả trong /usr/lib/dtrace/io.d. Điều này cho thấy sự chuyển đổi từ các kiểu hệ điều hành cụ thể thành trừu tượng. Trong trường hợp của Snow Leopard tôi thấy rằng fi_pathname được tạo từ chuỗi "?? /" theo sau là một số dẫn xuất của bộ đệm IO.Tôi không phải là chuyên gia Darwin nhưng Tôi suy ra rằng nó chỉ đơn giản là không ghi lại tên đầy đủ trong các mã vnodes của nó. Điều này, do đó, là nguồn gốc của "??" ở đầu ra của tập lệnh của bạn và cũng là lý do tại sao tôi giả định rằng các tên đường dẫn tuyệt đối không khả dụng.

Cuối cùng, lỗi DTrace của bạn. Vì bất kỳ lý do gì, cổng của Apple của DTrace tinh tế crippled ở chỗ nó ngăn cản truy tìm các quy trình khác nhau và thông báo lỗi mà bạn thấy là một triệu chứng đặc trưng. Cụ thể, đơn khiếu nại là về dòng

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

và nó chỉ ra rằng (một lần nữa, trên Snow Leopard), cố gắng để đánh giá uid trên bất kỳ kết quả launchd, diskimages-helpkernel_task quá trình chính xác lỗi này . Tôi cho rằng các quy trình này là "ngoài giới hạn" và các lỗi mà bạn thấy là hậu quả của các sửa đổi của Apple.

5

Trong khi câu trả lời ở trên đưa ra một nền tảng kỹ thuật tốt, nếu bạn chỉ muốn để có được tên đường dẫn đầy đủ của tập tin đã mở Tôi có thể làm bằng DTrace liệu này trên OS X thông qua:

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

chí này hiển thị tệp mở, nhưng không đọc hoặc viết. Tôi nhận được điều này từ trang DTrace một lớp lót tiện dụng của Brendan Gregg: http://www.brendangregg.com/DTrace/dtrace_oneliners.txt

Đáng buồn thay, tôi vẫn không hiểu tại sao iosnoop không đưa ra đường dẫn đầy đủ, khi nó xuất hiện về mặt lý thuyết.

Các vấn đề liên quan