为什么我记录到内存缓冲区后仍会丢失事件?
对我来说这没有意义。没有单个缓冲区会丢弃任何缓冲区的情况如何发生?我已将问题追溯到CLR Rundown会话,该会话始终会丢失一些事件。问题似乎是我有大量托管进程(大约60个),所有这些进程同时尝试将其事件发送给ETW。
我可以用
C>xperf -start ClrRundown -on "Microsoft-Windows-DotNETRuntime":0x118:5+"Microsoft-Windows-DotNETRuntimeRundown":0x118:5 -buffersize 512 -minbuffers 512 -maxbuffers 1024 -Buffering
C>xperf -Loggers ClrRundown
Logger Name : ClrRundown
Logger Id : 1e
Logger Thread Id : 0000000000000000
Buffer Size : 512
Maximum Buffers : 512
Minimum Buffers : 512
Number of Buffers : 512
Free Buffers : 504
Buffers Written : 0
Events Lost : **29**
Log Buffers Lost : 0
Real Time Buffers Lost: 0
Flush Timer : 0
Age Limit : 0
Log File Mode : Buffered StopOnHybridShutdown IndependentSession
Maximum File Size : 0
Log Filename :
Trace Flags : ".NET Common Language Runtime":0x118:0x5+"Microsoft-Windows-DotNETRuntimeRundown":0x118:0x5
我不在乎一些丢失的事件,但是打开此类跟踪时,我总是会收到WPA的警告。这使WPA的非常规用户感到困惑,他们担心他们做错了什么,并且阻止了加载跟踪文件。 有没有办法防止事件丢失?我唯一找到的其他标志是xperf的-NoPerProcessorBuffering,它也没有帮助。将缓冲区大小增加到8MB也没有任何改变。
如果没有办法记录数据而不会丢失事件,是否有便宜又快速的方法来重置未合并的ETL文件的丢失事件计数?
答案 0 :(得分:0)
由于有办法摆脱这些虚假的丢弃事件,所以我决定直接重置ETL文件的丢失事件计数器:
如果调用该方法,则可以重置为整数的LostEvents计数:
// Lost event offset is taken from _TRACE_LOGFILE_HEADER32/64 which is the same for x64 and x86
const int LostEventOffset = 0x98;
private static void ResetLostEvents(string etlFile)
{
using (var file = File.OpenWrite(etlFile))
{
file.Seek(LostEventOffset, SeekOrigin.Begin);
using (BinaryWriter overwriter = new BinaryWriter(file))
{
overwriter.Write((int)0);
}
}
}
这已在Win7和10 x86,x64上进行了测试,该版本适用于我到目前为止获得的所有ETL文件。