コード例 #1
0
            public void OnEvent(ITraceEvent Event, ITraceRelogger Relogger)
            {
                IntPtr recordPtr;

                Event.GetEventRecord(out recordPtr);
                EVENT_RECORD record = (EVENT_RECORD)Marshal.PtrToStructure(recordPtr, typeof(EVENT_RECORD));

                if (IsStackWalkRecord(ref record))
                {
                    // path the timestamp in the stack walk record.
                    Marshal.WriteInt64(record.UserData, _currentTimeStamp);
                    _currentTimeStamp += _ticksPerStack;
                    if (record.UserDataLength == EmptyStackWalkSize)
                    {
                        // this is an empty stack walk, which means that the CPU is actually idle.
                        // We inject these when writing the log, and then remove them when doing
                        // the rewrite.  This lets us keep the correct timing information but removing
                        // them gets us correct CPU information in the graph.
                        return;
                    }
                }

                var prevTimeStamp = record.EventHeader.TimeStamp;

                var newTimeStamp = _currentTimeStamp;

                Event.SetTimeStamp(ref newTimeStamp);

                if (IsStackWalkRecord(ref record))
                {
                }

                Relogger.Inject(Event);
            }
コード例 #2
0
        private void RelogTrace(TimeSpan executionTime, int stackWalkCount, string filename)
        {
            // if we're on Win8 or later we want to re-write the timestamps using the relogger
            ITraceRelogger traceRelogger = null;

            try {
                traceRelogger = (ITraceRelogger)Activator.CreateInstance(Type.GetTypeFromCLSID(EtlNativeMethods.CLSID_TraceRelogger));
            } catch (COMException) {
            }

            if (traceRelogger != null)
            {
                var   callback = new TraceReloggerCallback(executionTime, stackWalkCount);
                ulong newTraceHandle;

                traceRelogger.AddLogfileTraceStream(filename, IntPtr.Zero, out newTraceHandle);

                traceRelogger.SetOutputFilename(filename + ".tmp");
                traceRelogger.RegisterCallback(callback);
                traceRelogger.ProcessTrace();

                File.Copy(filename + ".tmp", filename, true);
            }
            else
            {
                Console.WriteLine("Failed to create relogger, timestamps will be incorrect");
            }
        }
コード例 #3
0
            public void OnBeginProcessTrace(ITraceEvent HeaderEvent, ITraceRelogger Relogger)
            {
                IntPtr recordPtr;

                HeaderEvent.GetEventRecord(out recordPtr);
                EVENT_RECORD record = (EVENT_RECORD)Marshal.PtrToStructure(recordPtr, typeof(EVENT_RECORD));

                EventTrace_Header props = (EventTrace_Header)Marshal.PtrToStructure(record.UserData, typeof(EventTrace_Header));

                var ticksPerMs = props.PerfFreq / 1000;// PerfFreq is frequence in # of ticks per second (same as Stopwatch.Frequency)
                var msPerStack = _executionTime.TotalMilliseconds / _stackWalkCount;

                _ticksPerStack = (long)(ticksPerMs * (ulong)msPerStack);
            }
コード例 #4
0
 public void OnFinalizeProcessTrace(ITraceRelogger Relogger)
 {
 }