我经常使用Process Monitor
它来调试经常出现故障的应用程序。我没有开发该应用程序,因此修复源代码不是一个选择。下图显示了我习惯的输出类型:
现在我想让这个过程自动化。理想情况下,我希望有一个脚本或程序接受两个参数,即进程的 PID 和时间间隔(例如 2 秒)。然后,脚本/程序应捕获该时间间隔内该 PID 的事件并将其存储在文件中。
但我一直没能找到方法。经过一番研究,我得出了以下结论(这对我来说都是新东西,如果我错了,请纠正我):
Process Monitor
使用 Windows 事件跟踪 (ETW) 框架来捕获事件。具体来说,它使用会话NT Kernel Logger
(默认情况下?)来跟踪提供程序提供的事件Windows Kernel Trace
。- ETW 框架提供了一个 API,可以通过用 C++/C# 开发程序来使用它。这可能是一个选项,但似乎相当复杂。另一方面,有一些命令行工具可用于捕获 ETW 事件:
logman
和tracelog
。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
显示内容相同的输出,或者至少看不到类似的输出?