Set up an analyzer exception filter to make intermittent failures more actionable...
authorJeremy Koritzinsky <jekoritz@microsoft.com>
Sat, 5 Feb 2022 17:58:42 +0000 (09:58 -0800)
committerGitHub <noreply@github.com>
Sat, 5 Feb 2022 17:58:42 +0000 (09:58 -0800)
Update the Roslyn Testing SDK version and update the DllImportGenerator unit tests to crash in a way that produces a dump for some of our intermittent issues (https://github.com/dotnet/runtime/issues/60909, https://github.com/dotnet/runtime/issues/62223). This mechanism will crash the process during the "exception filter" phase, so it will still have the throwing frame on the stack (no unwinding). Hopefully this will enable us to get more actionable dumps to investigate these issues and determine if they're Roslyn bugs or GC holes.

eng/Versions.props
src/libraries/System.Runtime.InteropServices/tests/DllImportGenerator.UnitTests/Verifiers/CSharpCodeFixVerifier.cs

index aef6a22..133782f 100644 (file)
     <MoqVersion>4.12.0</MoqVersion>
     <FsCheckVersion>2.14.3</FsCheckVersion>
     <SdkVersionForWorkloadTesting>7.0.100-alpha.1.21528.1</SdkVersionForWorkloadTesting>
-    <CompilerPlatformTestingVersion>1.1.1-beta1.21467.5</CompilerPlatformTestingVersion>
+    <CompilerPlatformTestingVersion>1.1.1-beta1.22103.1</CompilerPlatformTestingVersion>
     <!-- Docs -->
     <MicrosoftPrivateIntellisenseVersion>6.0.0-preview-20220104.1</MicrosoftPrivateIntellisenseVersion>
     <!-- ILLink -->
index ae7fd89..e873716 100644 (file)
@@ -1,6 +1,7 @@
 // Licensed to the .NET Foundation under one or more agreements.
 // The .NET Foundation licenses this file to you under the MIT license.
 
+using System;
 using System.Collections.Immutable;
 using System.Threading;
 using System.Threading.Tasks;
@@ -115,6 +116,33 @@ namespace DllImportGenerator.UnitTests.Verifiers
                 });
             }
 
+            protected override CompilationWithAnalyzers CreateCompilationWithAnalyzers(Compilation compilation, ImmutableArray<DiagnosticAnalyzer> analyzers, AnalyzerOptions options, CancellationToken cancellationToken)
+            {
+                return new CompilationWithAnalyzers(
+                    compilation,
+                    analyzers,
+                    new CompilationWithAnalyzersOptions(
+                        options,
+                        onAnalyzerException: null,
+                        concurrentAnalysis: true,
+                        logAnalyzerExecutionTime: true,
+                        reportSuppressedDiagnostics: false,
+                        analyzerExceptionFilter: ex =>
+                        {
+                            // We're hunting down a intermittent issue that causes NullReferenceExceptions deep in Roslyn. To ensure that we get an actionable dump, we're going to FailFast here to force a process dump.
+                            if (ex is NullReferenceException)
+                            {
+                                // Break a debugger here so there's a chance to investigate if someone is already attached.
+                                if (System.Diagnostics.Debugger.IsAttached)
+                                {
+                                    System.Diagnostics.Debugger.Break();
+                                }
+                                Environment.FailFast($"Encountered a NullReferenceException while running an analyzer. Taking the process down to get an actionable crash dump. Exception information:{ex.ToString()}");
+                            }
+                            return true;
+                        }));
+            }
+
             protected override async Task RunImplAsync(CancellationToken cancellationToken)
             {
                 try