记忆中记录丢失事件

时间:2019-01-16 16:03:22

标签: etw

为什么我记录到内存缓冲区后仍会丢失事件?

enter image description here

对我来说这没有意义。没有单个缓冲区会丢弃任何缓冲区的情况如何发生?我已将问题追溯到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文件的丢失事件计数?

1 个答案:

答案 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文件。