Автоматизация проверки Process Monitor
Я регулярно использую to для отладки приложения, которое очень часто работает неправильно. Я не занимаюсь разработкой приложения, поэтому исправлять исходный код не вариант. На изображении ниже показан тип вывода, к которому я привык:
Теперь я хочу сделать этот процесс автоматическим. В идеале я хочу иметь сценарий или программу, которая принимает два аргумента: PID процесса и временной интервал (например, 2 секунды). Затем сценарий/программа должен фиксировать события для этого PID в течение этого интервала времени и сохранять их в файле.
Но я не могу найти способ сделать это. После некоторых исследований я пришел к следующим выводам (для меня это все в новинку, поэтому, пожалуйста, поправьте меня, если я ошибаюсь):
- использует платформу трассировки событий для Windows (ETW) для регистрации событий. В частности, он использует
NT Kernel Logger
сеанс, который (по умолчанию?) отслеживает события, предоставляемыеWindows Kernel Trace
провайдер. - Платформа ETW предлагает API, и его можно использовать, разработав программу на C++/C#. Это может быть вариант, но он кажется довольно сложным. С другой стороны, есть несколько инструментов командной строки, которые можно использовать для захвата событий ETW: и . поставляется по умолчанию с Windows при использовании
tracelog
вам нужно сначала установить Visual Studio, но для меня это не вариант.
Так что это кажется хорошим вариантом. Я попробовал следующее:
C:\Windows\system32>logman start "NT Kernel Logger" -p "Windows Kernel Trace" -ets -nb 16 256 -bs 64 -o C:\trlog.etl -rt
The command completed successfully.
C:\Windows\system32>logman stop "NT Kernel Logger" -ets
The command completed successfully.
C:\Windows\system32>tracerpt C:\trlog.etl -o C:\trlog.xml -of XML -summary C:\trlog-summary.txt -report C:\trlog-report.xml
Input
----------------
File(s):
C:\trlog.etl
100.00%
Output
----------------
DumpFile: C:\trlog.xml
Summary: C:\trlog-summary.txt
Report: C:\trlog-report.xml
The command completed successfully.
C:\Windows\system32>
Но выводC:\trlog.xml
похоже, не соответствует ожидаемому результату. Я ожидаю список событий, как показано на рисунке выше, где вы можете различать события реестра, события ввода-вывода и события потоков. Но вместо этого я получаю список событий, подобных этому (я не могу сказать, что это за событие и какие поля соответствуют полям, показанным ):
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
<System>
<Provider Guid="{9e814aad-3204-11d2-9a82-006008a86939}" />
<EventID>0</EventID>
<Version>3</Version>
<Level>0</Level>
<Task>0</Task>
<Opcode>15</Opcode>
<Keywords>0x0</Keywords>
<TimeCreated SystemTime="2021-02-19T11:33:47.360274700+00:59" />
<Correlation ActivityID="{00000000-0000-0000-0000-000000000000}" />
<Execution ProcessID="10936" ThreadID="5500" ProcessorID="0" KernelTime="90" UserTime="30" />
<Channel />
<Computer />
</System>
<EventData>
<Data Name="ProcessId">0x0</Data>
<Data Name="ServiceState">0x1</Data>
<Data Name="SubProcessTag">0x80</Data>
<Data Name="ServiceName">PNRPsvc</Data>
<Data Name="DisplayName">Peer Name Resolution Protocol</Data>
<Data Name="ProcessName"></Data>
<Data Name="LoadOrderGroup"></Data>
<Data Name="SvchostGroup"></Data>
</EventData>
<RenderingInfo Culture="en-DE">
<Opcode>Services</Opcode>
<Provider>MSNT_SystemTrace</Provider>
<EventName xmlns="http://schemas.microsoft.com/win/2004/08/events/trace">SystemConfig</EventName>
</RenderingInfo>
<ExtendedTracingInfo xmlns="http://schemas.microsoft.com/win/2004/08/events/trace">
<EventGuid>{01853a65-418f-4f36-aefc-dc0f1d2fd235}</EventGuid>
</ExtendedTracingInfo>
</Event>
Мои вопросы:
- Подходит ли инструмент для того, чего я пытаюсь достичь? Есть ли лучший инструмент/способ сделать это?
- Если
logman
действительно правильный инструмент, как я могу его использовать? Я запрашиваю правильный сеанс/провайдера. Я разбираю.etl
файл правильно, используяtracerpt
? Почему я не вижу того же результата или, по крайней мере, похожего результата на то, чтоProcess Monitor
шоу?