代码之家  ›  专栏  ›  技术社区  ›  Alois Kraus

带内存记录的丢失事件

etw
  •  0
  • Alois Kraus  · 技术社区  · 6 年前

    enter image description here

    那对我来说毫无意义。怎么可能没有缓冲区被丢弃,而是单个事件被丢弃?我已经追踪到了CLR Rundown会话的问题,该会话总是丢失一些事件。问题似乎是我有大量的托管进程(ca.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的非常规用户感到困惑,他们担心自己做错了什么,从而阻碍了跟踪文件的加载。 有什么方法可以防止失去比赛机会吗?我唯一找到的另一个标志是-NoPerProcessorBuffering from xperf,这也没有帮助。将buffersize增加到8MB也没有改变任何事情。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Alois Kraus    6 年前

    由于有办法消除这些虚假的丢弃事件,我决定直接重置ETL文件的丢失事件计数器:

    如果调用该方法,则可以重置LostEvents计数(int):

    // 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);
            }
        }
    }