2009-05-14 13 views
31

Vorrei poter monitorare determinate chiamate di sistema eseguite da un processo, principalmente chiamate di I/O su file. Su Linux posso probabilmente andare via usando strace con parametri adatti, ma come posso farlo su Windows?Monitoraggio di determinate chiamate di sistema eseguite da un processo in Windows

Sono principalmente interessato all'esecuzione di un processo e alla determinazione di quali file ha letto e scritto.

MODIFICA: Voglio farlo a livello di codice da un altro processo. Sono a conoscenza di ProcessMonitor, ma vorrei ricevere i dati in un formato che posso importare in un altro programma per ulteriori analisi.

MODIFICA: Se si restringono ulteriormente le mie esigenze, è probabilmente sufficiente essere in grado di monitorare le chiamate a CreateFile(). Sono davvero interessato solo a quali file vengono aperti e se sono aperti per lettura/scrittura o solo lettura. Un altro requisito che non ho davvero affermato è che la velocità è abbastanza importante; Stavo pensando di farlo per cose come la compilazione di un file C++ e la creazione di un'interfaccia grafica completa che genera un file di log di 20 MB avrà un overhead proibitivo.

EDIT: Sarebbe anche bello se non richiedesse privilegi amministrativi.

+0

Interessante. Non c'è qualcosa di simile a Linux ptrace syscall in Windows? Tutte le risposte riguardano l'uso di altri programmi, ma con qualcosa come ptrace() potresti farlo tu stesso. – ktulur

+1

Nel caso in cui sei interessato ad un approccio diverso, ti ho chiesto una finestra equivalente a ptrace: http://stackoverflow.com/questions/865106/is-there-something-like-linux-ptrace-syscall-in- windows – ktulur

risposta

22

Ci sono diverse opzioni su Windows.

Windows Performance Toolkit può essere utilizzato per abilitare la traccia di vari eventi di sistema, incluso l'I/O di file e include strumenti per l'elaborazione e la visualizzazione di questi eventi. È possibile utilizzare xperf per iniziare a tracciare varie classi di eventi e salvare in un file ETL che è possibile elaborare o visualizzare successivamente utilizzando gli stessi strumenti.

Process Monitor da SysInternals è un'altra opzione molto semplice da utilizzare e consente di visualizzare rapidamente tutti gli accessi ai file e al Registro di sistema che qualsiasi processo sul sistema sta eseguendo. http://blogs.msdn.com/carloc/archive/2008/10/31/how-to-automate-process-monitor.aspx mostra anche come eseguire Process Monitor in modo automatico.

Se si desidera eseguire questa operazione completamente a livello di codice, è possibile utilizzare le funzioni ETW (StartTrace, EnableTrace, ecc.) Per eseguire lo snap degli eventi I/O e salvarli in un file ETL. Codice di esempio here.

+0

Grazie, esaminerò il WPT. ProcessMonitor ha qualche supporto per l'esecuzione senza una GUI? – JesperE

+0

Risposta aggiornata con un collegamento che mostra come automatizzare Process Monitor. – Michael

+0

C'è un modo per ottenere il set di strumenti xperf senza scaricare un'enorme immagine da 1,3 GB (!)? – JesperE

5

Su Windows, è possibile utilizzare process monitor per monitorare l'attività del processo (io e registro). Immagino che questo si adatta alle tue necessità se non vuoi veramente conoscere le chiamate di sistema.

E è possibile utilizzare winapioverride32 per monitorare le chiamate API.

2

Forse FileMon?

C'è anche NtTrace, simile a strace.

+1

Process Monitor è il successore di FileMon. Gli utenti di SysInternals hanno unito FileMon e RegMon insieme in Process Monitor. – Michael

+0

NtTrace ha esito negativo su Vista x64 con un sacco di "Impossibile intercettare ... firma errata". Non è stato aggiornato dal 2007, però. – JesperE

-4

In che modo nessuno ha menzionato lo strace? Uscita Esempio:

open(".", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = 3 
fstat64(3, {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 
fcntl64(3, F_GETFD)      = 0x1 (flags FD_CLOEXEC) 
getdents64(3, /* 18 entries */, 4096) = 496 
getdents64(3, /* 0 entries */, 4096) = 0 
close(3)        = 0 
fstat64(1, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0 
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f2c000 
write(1, "autofs\nbackups\ncache\nflexlm\ngames"..., 86autofsA
+6

La domanda dice "Su Linux, probabilmente posso andare via usando strace" ... – RichieHindle

+0

Oh oops :) non ho visto che –

+0

@matt comunque, c'è [strace in cygwin] (http://cygwin.com/cygwin -UG-net/con-utils.html). – artistoex

2

Un altro modo è quello di utilizzare Deviare API Hook un'intercettazione per tutti i sistemi in modalità utente chiama che si desidera. Utilizzando questo framework è possibile codificare un gestore generico per tutte le chiamate poiché i parametri possono essere letti utilizzando le interfacce COM (ad esempio, ciascun parametro è un INktParam e si può ottenere il valore utilizzando INktParam.Value).

Un'altra alternativa ma che costerà un po 'di soldi è di usare SpyStudio dalla stessa azienda. Questo prodotto ha un'opzione a riga di comando che è utile per raccogliere i log senza GUI.

Problemi correlati