过程监控检查自动化

过程监控检查自动化

我经常使用Process Monitor它来调试经常出现故障的应用程序。我没有开发该应用程序,因此修复源代码不是一个选择。下图显示了我习惯的输出类型:

procmon_输出

现在我想让这个过程自动化。理想情况下,我希望有一个脚本或程序接受两个参数,即进程的 PID 和时间间隔(例如 2 秒)。然后,脚本/程序应捕获该时间间隔内该 PID 的事件并将其存储在文件中。

但我一直没能找到方法。经过一番研究,我得出了以下结论(这对我来说都是新东西,如果我错了,请纠正我):

  • Process Monitor使用 Windows 事件跟踪 (ETW) 框架来捕获事件。具体来说,它使用会话NT Kernel Logger(默认情况下?)来跟踪提供程序提供的事件Windows Kernel Trace
  • ETW 框架提供了一个 API,可以通过用 C++/C# 开发程序来使用它。这可能是一个选项,但似乎相当复杂。另一方面,有一些命令行工具可用于捕获 ETW 事件:logmantracelog。Windowslogman默认自带,但要使用,tracelog您必须先安装 Visual Studio,这对我来说不是一个选项。

logman似乎是一个不错的选择。我尝试了以下方法:

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似乎与我预期的输出不符。我期望得到如上图所示的事件列表,其中可以区分注册表事件、I/O 事件和线程事件。但我得到的是类似这样的事件列表(我无法分辨它是什么类型的事件,也不知道 中显示的字段与 对应的字段Process Monitor):

<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适合我想要实现的目标?有没有更好的工具/方法来实现这个目标?
  • 如果logman确实是正确的工具,我该如何使用它?我是否查询了正确的会话/提供程序。我是否.etl使用正确解析了文件tracerpt?为什么我看不到与Process Monitor显示内容相同的输出,或者至少看不到类似的输出?

相关内容