diff --git a/src/coreclr/src/vm/eventtrace.cpp b/src/coreclr/src/vm/eventtrace.cpp index ec5945c737871..ab5e27498b0c5 100644 --- a/src/coreclr/src/vm/eventtrace.cpp +++ b/src/coreclr/src/vm/eventtrace.cpp @@ -3560,7 +3560,7 @@ BOOL ETW::TypeSystemLog::AddTypeToGlobalCacheIfNotExists(TypeHandle th, BOOL * p { CrstHolder _crst(GetHashCrst()); // Like above, check if the type has been added from a different thread since we last looked it up. - if (pLoggedTypesFromModule->loggedTypesFromModuleHash.Lookup(th).th.IsNull()) + if (!pLoggedTypesFromModule->loggedTypesFromModuleHash.Lookup(th).th.IsNull()) { *pfCreatedNew = FALSE; return fSucceeded; diff --git a/src/coreclr/tests/issues.targets b/src/coreclr/tests/issues.targets index ec07afb575c5a..d8d3aff0f1857 100644 --- a/src/coreclr/tests/issues.targets +++ b/src/coreclr/tests/issues.targets @@ -1707,6 +1707,9 @@ needs triage + + needs triage + needs triage diff --git a/src/coreclr/tests/src/tracing/eventpipe/gcdump/gcdump.cs b/src/coreclr/tests/src/tracing/eventpipe/gcdump/gcdump.cs new file mode 100644 index 0000000000000..1ee96f83781c7 --- /dev/null +++ b/src/coreclr/tests/src/tracing/eventpipe/gcdump/gcdump.cs @@ -0,0 +1,111 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Diagnostics.Tracing; +using System.IO; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using System.Collections.Generic; +using Microsoft.Diagnostics.NETCore.Client; +using Microsoft.Diagnostics.Tools.RuntimeClient; +using Microsoft.Diagnostics.Tracing; +using Microsoft.Diagnostics.Tracing.Parsers; +using Tracing.Tests.Common; +using Microsoft.Diagnostics.Tracing.Parsers.Clr; + +namespace Tracing.Tests.EventSourceError +{ + // Regression test for https://github.com/dotnet/runtime/issues/38639 + public class GCDumpTest + { + private static int _bulkTypeCount = 0; + private static int _bulkNodeCount = 0; + private static int _bulkEdgeCount = 0; + private static int _bulkRootEdgeCount = 0; + private static int _bulkRootStaticVarCount = 0; + + private static readonly ulong GC_HeapDump_Keyword = 0x100000UL; + + public static int Main(string[] args) + { + // This test validates that if an EventSource generates an error + // during construction it gets emitted over EventPipe + + List providers = new List + { + new Provider("Microsoft-Windows-DotNETRuntime", eventLevel: EventLevel.Verbose, keywords: (ulong)ClrTraceEventParser.Keywords.GCHeapSnapshot) + }; + + var configuration = new SessionConfiguration(circularBufferSizeMB: 1024, format: EventPipeSerializationFormat.NetTrace, providers: providers); + return IpcTraceTest.RunAndValidateEventCounts(_expectedEventCounts, _eventGeneratingAction, configuration, _DoesRundownContainMethodEvents); + } + + private static Dictionary _expectedEventCounts = new Dictionary() + { + // This space intentionally left blank + }; + + private static Action _eventGeneratingAction = () => + { + // This space intentionally left blank + }; + + private static Func> _DoesRundownContainMethodEvents = (source) => + { + source.Clr.TypeBulkType += (GCBulkTypeTraceData data) => + { + _bulkTypeCount += data.Count; + }; + + source.Clr.GCBulkNode += delegate (GCBulkNodeTraceData data) + { + _bulkNodeCount += data.Count; + }; + + source.Clr.GCBulkEdge += (GCBulkEdgeTraceData data) => + { + _bulkEdgeCount += data.Count; + }; + + source.Clr.GCBulkRootEdge += (GCBulkRootEdgeTraceData data) => + { + _bulkRootEdgeCount += data.Count; + }; + + source.Clr.GCBulkRootStaticVar += (GCBulkRootStaticVarTraceData data) => + { + _bulkRootStaticVarCount += data.Count; + }; + + return () => + { + // These values are ~80% (rounded to nice whole numbers) of the values + // I saw when writing the test. The idea is that I want to catch + // any real deviation in the number of types, but don't want to have + // to maintain this test as the number of types varies. (And they will vary due to + // framework code changes). If this test needs any sort of ongoing maintenance + // just change all these values to a low number like 10 and move on. + if (_bulkTypeCount > 125 + && _bulkNodeCount > 600 + && _bulkEdgeCount > 850 + && _bulkRootEdgeCount > 250 + && _bulkRootStaticVarCount > 70) + { + return 100; + } + + + Console.WriteLine($"Test failed due to missing GC heap events."); + Console.WriteLine($"_bulkTypeCount = {_bulkTypeCount}"); + Console.WriteLine($"_bulkNodeCount = {_bulkNodeCount}"); + Console.WriteLine($"_bulkEdgeCount = {_bulkEdgeCount}"); + Console.WriteLine($"_bulkRootEdgeCount = {_bulkRootEdgeCount}"); + Console.WriteLine($"_bulkRootStaticVarCount = {_bulkRootStaticVarCount}"); + return -1; + }; + }; + } +} \ No newline at end of file diff --git a/src/coreclr/tests/src/tracing/eventpipe/gcdump/gcdump.csproj b/src/coreclr/tests/src/tracing/eventpipe/gcdump/gcdump.csproj new file mode 100644 index 0000000000000..a1915b163e35a --- /dev/null +++ b/src/coreclr/tests/src/tracing/eventpipe/gcdump/gcdump.csproj @@ -0,0 +1,14 @@ + + + .NETCoreApp + exe + BuildAndRun + true + true + 0 + + + + + +