Мониторинг ввода-вывода с низкими издержками в Windows - PullRequest
3 голосов
/ 19 мая 2009

Я бы хотел, чтобы при контроле ввода-вывода процесса Windows использовался метод с минимальными издержками.

Я получил несколько полезных ответов на Отслеживание определенных системных вызовов, выполняемых процессом в Windows . Наиболее многообещающим было использование Windows Performance Toolkit для получения трассировки событий ядра. Вся необходимая информация действительно может быть получена оттуда, но WPT является огромным перебором для того, что мне нужно, и впоследствии имеет чрезмерные накладные расходы.

Моя идея состояла в том, чтобы реализовать альтернативный подход к обнаружению графов зависимостей C / C ++. Обычно это делается путем передачи опции компилятору (например, -M). Это прекрасно работает для компиляторов и инструментов, у которых есть такая опция, но не у всех, и у тех, кто часто реализует их по-разному. Итак, я реализовал альтернативный способ сделать это в Linux, используя strace, чтобы определить, какие файлы открыты. Запуск gcc (например) таким образом приводит к накладным расходам в 50% (приблизительный показатель), и я надеялся найти способ сделать это на окнах с аналогичными издержками.

У набора инструментов xperf есть две проблемы, которые мешают мне использовать их в этом случае:

  • Нет способа отслеживать события ввода-вывода для отдельного процесса; Я должен использовать трассировку событий ядра, которая отслеживает каждый отдельный процесс и таким образом генерирует огромные объемы данных (15 МБ за время, необходимое для запуска gcc, YMMV).
  • В результате необходимости использовать трассировку событий ядра я должен работать от имени администратора.

Мне действительно не нужны события на уровне ядра; Полагаю, я мог бы справиться так же хорошо, если бы мог просто отслеживать, скажем, вызов Win32 API CreateFile () и, возможно, CreateProcess (), если я хочу перехватывать разветвленные процессы.

Какие-нибудь умные идеи?

Ответы [ 3 ]

3 голосов
/ 19 мая 2009

Использовать перехват API. Достаточно перехватить NtCreateFile и несколько других вызовов в ntdll. У меня был хороший опыт использования easyhook в качестве основы для самостоятельного подключения - с открытым исходным кодом. Даже поддерживает управляемый перехват (c # и т. Д.), Если вы хотите это сделать. Это довольно легко настроить.

Это находится в http://easyhook.codeplex.com

Редактировать: кстати, объезды не позволяют перехватить 64 бит (если вы не покупаете лицензию по номинальной цене 10 000 долларов США) EasyHook не допускает использование собственных перехватчиков через границу WOW64. Это позволяет управлять перехватом через границы WOW64.

0 голосов
/ 03 апреля 2014

Кажется, что Доктор. Память System Call Tracer для Windows это именно то, что я искал. В основном это strace реализация для Windows.

0 голосов
/ 19 мая 2009

В прошлом я использовал Microsoft Detours для отслеживания распределения памяти путем перехвата определенных вызовов API. Вы можете использовать его для отслеживания CreateFile и CreateProcess.

...