diff --git a/src/coverlet.core/Instrumentation/Instrumenter.cs b/src/coverlet.core/Instrumentation/Instrumenter.cs index 7422d34d8..0d708fc11 100644 --- a/src/coverlet.core/Instrumentation/Instrumenter.cs +++ b/src/coverlet.core/Instrumentation/Instrumenter.cs @@ -70,7 +70,8 @@ private void InstrumentModule() { resolver.AddSearchDirectory(Path.GetDirectoryName(_module)); var parameters = new ReaderParameters { ReadSymbols = true, AssemblyResolver = resolver }; - if (Path.GetFileNameWithoutExtension(_module) == "System.Private.CoreLib") + bool isCoreLib = Path.GetFileNameWithoutExtension(_module) == "System.Private.CoreLib"; + if (isCoreLib) { parameters.MetadataImporterProvider = new CoreLibMetadataImporterProvider(); } @@ -91,6 +92,8 @@ private void InstrumentModule() { var actualType = type.DeclaringType ?? type; if (!actualType.CustomAttributes.Any(IsExcludeAttribute) + // Instrumenting Interlocked which is used for recording hits would cause an infinite loop. + && (!isCoreLib || actualType.FullName != "System.Threading.Interlocked") && !InstrumentationHelper.IsTypeExcluded(_module, actualType.FullName, _excludeFilters) && InstrumentationHelper.IsTypeIncluded(_module, actualType.FullName, _includeFilters)) InstrumentType(type);