Отслеживание определенных системных вызовов, выполняемых процессом в Windows - PullRequest
34 голосов
/ 14 мая 2009

Я хотел бы иметь возможность отслеживать определенные системные вызовы, выполняемые процессом, в первую очередь вызовы файлового ввода-вывода. В Linux я, вероятно, могу обойтись без использования strace с подходящими параметрами, но как я могу это сделать в Windows?

Меня в первую очередь интересует запуск процесса и выяснение, какие файлы он прочитал и записал.

РЕДАКТИРОВАТЬ: я хочу сделать это программно из другого процесса. Мне известен ProcessMonitor, но я хотел бы получить данные в форме, которую я могу импортировать в другую программу для дальнейшего анализа.

РЕДАКТИРОВАТЬ: Если я сужу свои требования еще больше, вероятно, достаточно будет иметь возможность отслеживать вызовы CreateFile (). Меня действительно интересует только то, какие файлы открываются и открываются ли они для чтения / записи или просто для чтения. Другое требование, которое я на самом деле не утверждал, это то, что скорость довольно важна; Я планировал сделать это для таких вещей, как компиляция C ++-файла, и создание полного графического интерфейса, который генерирует 20-мегабайтный лог-файл, будет иметь чрезмерные накладные расходы.

РЕДАКТИРОВАТЬ: Было бы также хорошо, если бы он не требовал административных привилегий.

Ответы [ 7 ]

25 голосов
/ 14 мая 2009

В Windows есть несколько опций.

Windows Performance Toolkit может использоваться для включения трассировки различных системных событий, включая файловый ввод-вывод, и включает инструменты для обработки и просмотра этих событий. Вы можете использовать xperf, чтобы начать трассировать различные классы событий и сохранить их в файле ETL, который вы затем сможете обрабатывать или просматривать с помощью тех же инструментов позже.

Process Monitor от SysInternals - это еще одна, очень простая в использовании опция, позволяющая вам быстро увидеть все обращения к файлам и реестру, которые выполняет любой процесс в системе. http://blogs.msdn.com/carloc/archive/2008/10/31/how-to-automate-process-monitor.aspx также показывает, как запустить Process Monitor в автоматическом режиме.

Если вы хотите сделать это полностью программно, вы можете использовать функции ETW (StartTrace, EnableTrace и т. Д.), Чтобы привязать события ввода-вывода к файлу и сохранить их в файле ETL. Пример кода здесь .

5 голосов
/ 14 мая 2009

В Windows вы можете использовать монитор процесса для мониторинга активности процесса (io и реестр). Я полагаю, что это соответствует вашим потребностям, если вы на самом деле не хотите знать системные вызовы.

И вы можете использовать winapioverride32 для мониторинга вызовов API.

4 голосов
/ 03 июля 2013

API Monitor от rohitab очень хорош для системных вызовов

http://www.rohitab.com/apimonitor

2 голосов
/ 26 июня 2013

Другой способ - использовать Deviare API Hook для перехвата всех системных вызовов в пользовательском режиме, которые вы хотите. Используя эту платформу, вы можете кодировать универсальный обработчик для всех вызовов, поскольку параметры могут быть прочитаны с использованием интерфейсов COM (например, каждый параметр является INktParam, и вы можете получить значение с помощью INktParam.Value).

Другая альтернатива, но это будет стоить немного денег, это использовать SpyStudio от той же компании. Этот продукт имеет параметр командной строки, который полезен для сбора журналов без графического интерфейса.

2 голосов
/ 14 мая 2009

Другой инструмент трассировки Windows API: logexts.dll (часть Средства отладки для Windows ), который можно запустить из WinDbg / ntsd / cdb или через автономный logger.exe программа.

2 голосов
/ 14 мая 2009

Может быть FileMon ?

Существует также NtTrace , похожий на strace.

0 голосов
/ 14 сентября 2010

Как никто не упомянул strace? Пример вывода:

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