2013-08-12 9 views
8

मैंक्यों iosnoop (डिस्क पर फ़ाइलों को snooping) प्रश्न चिह्न के साथ पथ देता है?

sudo iosnoop | grep "gem" 

और फिर चल रहा हूँ तो iosnoop टर्मिनल में एक और टर्मिनल रन

gem env 

में मैं देख रहा हूँ:

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 ??/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 

?

उत्तर

9

कम जवाब हैं:

  1. ?? दर्शाता है कि शेष पथ नाम अज्ञात है,
  2. आप निरपेक्ष पथ और
  3. अलग नहीं कर सकता यह एक ऐसी सुविधा है, नहीं OS X पर एक बग, DTrace की है

इन बातों की एक व्याख्या की आवश्यकता है डीटी्रेस के साथ कुछ परिचितता; यदि उपयुक्त हो तो introduction to the Solaris version से शुरू करें।

iosnoop एक ऐसी स्क्रिप्ट है जो डीटीआरएस अवलोकनता ढांचे का शोषण करती है। विशेष रूप से, यह io प्रदाता के start और done जांच का उपयोग करता है; प्रारंभ जांच एक अनुरोध के bufinfo_t, लक्ष्य डिवाइस के devinfo_t और संबंधित फ़ाइल के fileinfo_t का खुलासा करती है। fileinfo_t मूल डार्विन प्रकार नहीं है: यह एक संरचना है जो dtrace (1) द्वारा प्रदान की गई है जो उपयोगकर्ताओं के लाभ के लिए फ़ाइल के सुविधाजनक अबास्ट्रक्शन प्रदान करती है। उदाहरण के लिए, इसके सदस्यों में fi_pathname है, जो को फ़ाइल का पूरा पथनाम देना चाहिए।

एक पृथक वर्णन करने के बाद ऑपरेटिंग सिस्टम के अंतर्निहित कार्यान्वयन के ज्ञान और परिवर्तन से उन ढालें, और उनके लिपियों,। सिद्धांत रूप में, यह विभिन्न ऑपरेटिंग सिस्टम पर पूरी तरह चलाने के लिए एकल स्क्रिप्ट के लिए भी अनुमति देता है।

/usr/lib/dtrace/io.d में वर्णित डीटीआर translator का उपयोग कर एक fileinfo_t का निर्माण और गतिशील रूप से पॉप्युलेट किया गया है। यह ओएस-विशिष्ट प्रकार से अमूर्तता में परिवर्तन दिखाता है। हिम तेंदुए के मामले में मुझे लगता है कि fi_pathname स्ट्रिंग "??" से बनाया गया है, इसके बाद आईओ बफर के कुछ व्युत्पन्न हैं।मैं कोई डार्विन विशेषज्ञ नहीं हूं लेकिन मैं अनुमान लगाता हूं कि यह vnodes में पूर्ण पथनाम रिकॉर्ड नहीं करता है। यह, इसलिए, "??" की उत्पत्ति है आपकी स्क्रिप्ट के आउटपुट में और कारण यह भी है कि मुझे लगता है कि पूर्ण पथनाम अनुपलब्ध हैं।

अंत में, आपकी डीटीआरएस त्रुटियां। किसी भी कारण से, ऐप्पल के डीटीआरएस का बंदरगाह crippled है जिसमें यह विभिन्न प्रक्रियाओं के का पता लगाने को रोकता है, और आपके द्वारा देखे गए त्रुटि संदेश एक विशिष्ट लक्षण है। विशेष रूप से, शिकायत के बारे में लाइन

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

है और यह वास्तव में ऐसा गलती से हुआ (फिर से, हिमपात तेंदुए पर) है कि पता चला है, launchd, diskimages-help और kernel_task प्रक्रियाओं परिणाम में से किसी पर uid मूल्यांकन करने के लिए कोशिश कर रहा है । मुझे लगता है कि ये प्रक्रियाएं "सीमा से बाहर" हैं और आप जो त्रुटियां देखते हैं वे ऐप्पल के संशोधनों के परिणाम हैं।

5

जबकि जवाब से ऊपर, एक अच्छा तकनीकी पृष्ठभूमि देता है अगर आप अभी खोला फ़ाइलें मैं के माध्यम से ओएस एक्स पर इस का उपयोग करते हुए कच्चे DTrace ऐसा करने में सक्षम हूँ से भरा पथ नाम प्राप्त करना चाहते हैं:

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

हो जाएगा ताकि शो फ़ाइल खुलती है, लेकिन पढ़ या लिखती नहीं है। मैं ब्रेंडन ग्रेग का काम DTrace एक लाइनर्स पेज से मिला: http://www.brendangregg.com/DTrace/dtrace_oneliners.txt

दुख की बात है, मैं अभी भी समझ में नहीं आता क्यों iosnoop, पूर्ण पथ दे नहीं है जब ऐसा लगता है कि यह सैद्धांतिक रूप से संभव है।

संबंधित मुद्दे