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); }
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"); } }
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); }
public void OnFinalizeProcessTrace(ITraceRelogger Relogger) { }