Я бы хотел, чтобы при контроле ввода-вывода процесса Windows использовался метод с минимальными издержками.
Я получил несколько полезных ответов на Отслеживание определенных системных вызовов, выполняемых процессом в Windows . Наиболее многообещающим было использование Windows Performance Toolkit для получения трассировки событий ядра. Вся необходимая информация действительно может быть получена оттуда, но WPT является огромным перебором для того, что мне нужно, и впоследствии имеет чрезмерные накладные расходы.
Моя идея состояла в том, чтобы реализовать альтернативный подход к обнаружению графов зависимостей C / C ++. Обычно это делается путем передачи опции компилятору (например, -M). Это прекрасно работает для компиляторов и инструментов, у которых есть такая опция, но не у всех, и у тех, кто часто реализует их по-разному. Итак, я реализовал альтернативный способ сделать это в Linux, используя strace, чтобы определить, какие файлы открыты. Запуск gcc (например) таким образом приводит к накладным расходам в 50% (приблизительный показатель), и я надеялся найти способ сделать это на окнах с аналогичными издержками.
У набора инструментов xperf есть две проблемы, которые мешают мне использовать их в этом случае:
- Нет способа отслеживать события ввода-вывода для отдельного процесса; Я должен использовать трассировку событий ядра, которая отслеживает каждый отдельный процесс и таким образом генерирует огромные объемы данных (15 МБ за время, необходимое для запуска gcc, YMMV).
- В результате необходимости использовать трассировку событий ядра я должен работать от имени администратора.
Мне действительно не нужны события на уровне ядра; Полагаю, я мог бы справиться так же хорошо, если бы мог просто отслеживать, скажем, вызов Win32 API CreateFile () и, возможно, CreateProcess (), если я хочу перехватывать разветвленные процессы.
Какие-нибудь умные идеи?