From 38b50ac4998829481726237558fcd350178caada Mon Sep 17 00:00:00 2001 From: David Mason Date: Thu, 23 Apr 2020 15:16:00 -0700 Subject: [PATCH] Make EventSource log errors to eventpipe --- .../Diagnostics/Tracing/EventPipeEventProvider.cs | 26 ++++++++++++++++++++++ .../Tracing/EventPipeMetadataGenerator.cs | 2 +- .../src/System/Diagnostics/Tracing/EventSource.cs | 12 +++++----- 3 files changed, 33 insertions(+), 7 deletions(-) diff --git a/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/EventPipeEventProvider.cs b/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/EventPipeEventProvider.cs index 52b9e4d..d2e33d5 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/EventPipeEventProvider.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/EventPipeEventProvider.cs @@ -8,6 +8,8 @@ namespace System.Diagnostics.Tracing { // The EventPipeProvider handle. private IntPtr m_provHandle = IntPtr.Zero; + private object m_createEventLock = new object(); + private IntPtr m_writeEventStringeEventHandle = IntPtr.Zero; // Register an event provider. unsafe uint IEventProvider.EventRegister( @@ -69,6 +71,30 @@ namespace System.Diagnostics.Tracing } EventPipeInternal.WriteEventData(eventHandle, userData, (uint)userDataCount, activityId, relatedActivityId); } + else + { + if (m_writeEventStringeEventHandle == IntPtr.Zero) + { + lock (m_createEventLock) + { + if (m_writeEventStringeEventHandle == IntPtr.Zero) + { + string eventName = "WriteEventString"; + EventParameterInfo paramInfo = default(EventParameterInfo); + paramInfo.SetInfo("message", typeof(string)); + byte[]? metadata = EventPipeMetadataGenerator.Instance.GenerateMetadata(0, eventName, 0, (uint)EventLevel.LogAlways, 0, new EventParameterInfo[] { paramInfo }); + uint metadataLength = (metadata != null) ? (uint)metadata.Length : 0; + + fixed (byte* pMetadata = metadata) + { + m_writeEventStringeEventHandle = ((IEventProvider)this).DefineEventHandle(0, eventName, 0, 0, (uint)EventLevel.LogAlways, pMetadata, metadataLength); + } + } + } + } + + EventPipeInternal.WriteEventData(m_writeEventStringeEventHandle, userData, (uint)userDataCount, activityId, relatedActivityId); + } return EventProvider.WriteEventErrorCode.NoError; } diff --git a/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/EventPipeMetadataGenerator.cs b/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/EventPipeMetadataGenerator.cs index 428543c..fd81d05 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/EventPipeMetadataGenerator.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/EventPipeMetadataGenerator.cs @@ -55,7 +55,7 @@ namespace System.Diagnostics.Tracing return GenerateMetadata(eventId, eventName, (long)keywords, (uint)level, version, eventParams); } - private unsafe byte[]? GenerateMetadata( + internal unsafe byte[]? GenerateMetadata( int eventId, string eventName, long keywords, diff --git a/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/EventSource.cs b/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/EventSource.cs index f59c2be..7ffb21c 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/EventSource.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Diagnostics/Tracing/EventSource.cs @@ -2152,18 +2152,18 @@ namespace System.Diagnostics.Tracing private unsafe void WriteEventString(EventLevel level, long keywords, string msgString) { #if FEATURE_MANAGED_ETW || FEATURE_PERFTRACING + bool allAreNull = true; #if FEATURE_MANAGED_ETW - if (m_etwProvider == null) - { - return; - } + allAreNull &= (m_etwProvider == null); #endif // FEATURE_MANAGED_ETW #if FEATURE_PERFTRACING - if (m_eventPipeProvider == null) + allAreNull &= (m_eventPipeProvider == null); +#endif // FEATURE_PERFTRACING + if (allAreNull) { return; } -#endif // FEATURE_PERFTRACING + const string EventName = "EventSourceMessage"; if (SelfDescribingEvents) { -- 2.7.4