2013-08-12 28 views
8

Se sto correndoPerché iosnoop (file di snooping IO su disco) restituisce percorsi con punti interrogativi?

sudo iosnoop | grep "gem" 

e poi in un altro terminale eseguire

gem env 

nel terminale iosnoop vedo:

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

Quali sono i punti interrogativi dintorni di Ruby nel percorso per i file sono trattati:

ruby ??/1.8/rubygems.rb 

? E come posso trovare il percorso assoluto in tutti questi file?

domanda supplementare - il motivo per cui sono gli errori qui:

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

?

risposta

9

Le brevi risposte sono:

  1. Il ?? significa che il percorso rimanente è sconosciuto,
  2. non è possibile estrarre il percorso assoluto e
  3. questa è una caratteristica, non è un bug, di DTrace su OS X.

Una spiegazione di questi punti richiede qualche familiarità con DTrace; se appropriato, quindi iniziare con introduction to the Solaris version.

iosnoop è uno script che sfrutta l'osservabilità DTrace framework. In particolare, utilizza i probe io del provider start e done; la sonda di avvio espone la richiesta bufinfo_t, del dispositivo di destinazione devinfo_t e il file corrispondente fileinfo_t. fileinfo_t non è un tipo Darwin nativo: è una struttura fornita da dtrace (1) che fornisce un'astrazione conveniente di un file a beneficio degli utenti. Ad esempio, tra i suoi membri è fi_pathname, che dovrebbe fornire il percorso completo di un file.

Avere una descrizione astratta protegge gli utenti e i relativi script dalla conoscenza e dalle modifiche all'implementazione sottostante del sistema operativo. In teoria, consente anche a un singolo script di essere eseguito su diversi sistemi operativi del tutto.

Un fileinfo_t viene creato e popolato in modo dinamico utilizzando un DTrace translator descritto in /usr/lib/dtrace/io.d. Mostra la trasformazione dai tipi specifici del sistema operativo all'astrazione. Nel caso di Snow Leopard vedo che fi_pathname è costruito dalla stringa "?? /" seguita da alcuni derivati ​​del buffer IO.Non sono un esperto di Darwin ma Suppongo che semplicemente non registri i percorsi completi nei suoi vnodi . Questo, quindi, è l'origine del "??" nell'output del tuo script e anche il motivo per cui presumo che i nomi assoluti di non siano disponibili.

Infine, gli errori di DTrace. Per qualsiasi ragione, la porta di DTrace di Apple è sottilmente crippled in quanto preclude la tracciatura di di vari processi e il messaggio di errore che si vede è un sintomo caratteristico. In particolare, la denuncia è di circa la linea

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

e si scopre che (ancora una volta, su Snow Leopard), cercando di valutare uid su uno qualsiasi dei launchd, diskimages-help e kernel_task processi risultati esattamente questo errore . Presumo che questi processi siano "fuori limite" e gli errori che vedi sono le conseguenze delle modifiche di Apple.

5

Mentre la risposta di cui sopra dà una buona base tecnica, se si desidera ottenere il percorso completo del file aperti sono in grado di farlo usando DTrace crudo su OS X tramite:

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

Questa volontà mostra il file si apre, ma non legge o scrive. Ho ricevuto questo da a portata di mano DTrace una pagina fodere di Brendan Gregg: http://www.brendangregg.com/DTrace/dtrace_oneliners.txt

Purtroppo, io ancora non capisco perché iosnoop non sta dando il percorso completo, quando sembra che sia teoricamente possibile.