dotnet / roslyn

The Roslyn .NET compiler provides C# and Visual Basic languages with rich code analysis APIs.
https://docs.microsoft.com/dotnet/csharp/roslyn-sdk/
MIT License
18.93k stars 4.02k forks source link

OutOfMemoryException thrown when compiling a project with a lot of source code on x86 #59240

Open adamsitnik opened 2 years ago

adamsitnik commented 2 years ago

BenchmarkDotNet generates a project with boilerplate code that takes care of all common benchmarking pitfalls. In dotnet/performance repository we have more than 4 thousand benchmarks and when we are using 32 bit SDK to build the auto-generated project, it fails with OOM in Roslyn. Initially, I thought that it was caused by the fact that the generated project contains a single source file with more than 3 million lines of code. So I've changed BDN implementation to don't store more than 100 generated types in a single source file: https://github.com/dotnet/BenchmarkDotNet/pull/1914. The problem is that it did not help, I am still getting OOM.

Any help (including workarounds) would be much appreciated as it's currently blocking us from ensuring that we are shipping .NET 7 preview 1 without performance regressions.

cc @danmoseley @AndyAyersMS who has hit this issue recently

Version Used: x86, 4.1.6.6811 part of the 7.0.100-preview.2.22102.6 SDK but it's reproducible with older versions as well (6.0)

Steps to Reproduce:

git clone https://github.com/dotnet/performance.git
py .\performance\scripts\benchmarks_ci.py -f net7.0 --filter * --architecture x86

Expected Behavior: It works fine.

Actual Behavior: It throws OOM.

Full stack trace:

```log Process terminated. System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown. [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at System.Collections.Immutable.ImmutableArray`1.Builder.GetEnumerator() [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at Microsoft.CodeAnalysis.PooledObjects.ArrayBuilder`1.System.Collections.Generic.IEnumerable.GetEnumerator() [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at System.Linq.Enumerable.SelectManyIterator[TSource,TCollection,TResult](IEnumerable`1 source, Func`2 collectionSelector, Func`3 resultSelector)+MoveNext() [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at System.Collections.Generic.EnumerableHelpers.ToArray[T](IEnumerable`1 source, Int32& length) [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at System.Linq.Buffer`1..ctor(IEnumerable`1 source) [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at System.Linq.OrderedEnumerable`1.GetEnumerator()+MoveNext() [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at System.Linq.Enumerable.SelectIPartitionIterator`2.MoveNext() [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at Microsoft.CodeAnalysis.CSharp.CodeGen.Optimizer.RemoveIntersectingLocals(Dictionary`2 info, ArrayBuilder`1 dummies) [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at Microsoft.CodeAnalysis.CSharp.CodeGen.Optimizer.FilterValidStackLocals(Dictionary`2 info) [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at Microsoft.CodeAnalysis.CSharp.CodeGen.Optimizer.Optimize(BoundStatement src, Boolean debugFriendly, HashSet`1& stackLocals) [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at Microsoft.CodeAnalysis.CSharp.CodeGen.CodeGenerator..ctor(MethodSymbol method, BoundStatement boundBody, ILBuilder builder, PEModuleBuilder moduleBuilder, DiagnosticBag diagnostics, OptimizationLevel optimizations, Boolean emittingPdb) [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at Microsoft.CodeAnalysis.CSharp.MethodCompiler.GenerateMethodBody(PEModuleBuilder moduleBuilder, MethodSymbol method, Int32 methodOrdinal, BoundStatement block, ImmutableArray`1 lambdaDebugInfo, ImmutableArray`1 closureDebugInfo, StateMachineTypeSymbol stateMachineTypeOpt, VariableSlotAllocator variableSlotAllocatorOpt, BindingDiagnosticBag diagnostics, DebugDocumentProvider debugDocumentProvider, ImportChain importChainOpt, Boolean emittingPdb, Boolean emitTestCoverageData, ImmutableArray`1 dynamicAnalysisSpans, AsyncForwardEntryPoint entryPointOpt) [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at Microsoft.CodeAnalysis.CSharp.MethodCompiler.CompileMethod(MethodSymbol methodSymbol, Int32 methodOrdinal, ProcessedFieldInitializers& processedInitializers, SynthesizedSubmissionFields previousSubmissionFields, TypeCompilationState compilationState) [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at Microsoft.CodeAnalysis.CSharp.MethodCompiler.CompileNamedType(NamedTypeSymbol containingType) [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at Microsoft.CodeAnalysis.CSharp.MethodCompiler.<>c__DisplayClass25_0.b__0() [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at System.Environment.FailFast(System.String, System.Exception) [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at Microsoft.CodeAnalysis.FailFast.OnFatalException(System.Exception) [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at Microsoft.CodeAnalysis.FailFast+<>c.<.cctor>b__5_0(System.Exception, Microsoft.CodeAnalysis.ErrorReporting.ErrorSeverity, Boolean) [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at Microsoft.CodeAnalysis.ErrorReporting.FatalError.Report(System.Exception, Microsoft.CodeAnalysis.ErrorReporting.ErrorSeverity, Boolean) [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at Microsoft.CodeAnalysis.ErrorReporting.FatalError.ReportAndPropagateUnlessCanceled(System.Exception, Microsoft.CodeAnalysis.ErrorReporting.ErrorSeverity) [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at Microsoft.CodeAnalysis.CSharp.MethodCompiler+<>c__DisplayClass25_0.b__0() [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at System.Collections.Immutable.ImmutableArray`1+Builder[[Microsoft.CodeAnalysis.CSharp.CodeGen.LocalDefUseSpan, Microsoft.CodeAnalysis.CSharp, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]].GetEnumerator() [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at Microsoft.CodeAnalysis.PooledObjects.ArrayBuilder`1[[Microsoft.CodeAnalysis.CSharp.CodeGen.LocalDefUseSpan, Microsoft.CodeAnalysis.CSharp, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]].System.Collections.Generic.IEnumerable.GetEnumerator() [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at System.Linq.Enumerable+d__210`3[[System.Collections.Generic.KeyValuePair`2[[System.__Canon, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.__Canon, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Microsoft.CodeAnalysis.CSharp.CodeGen.LocalDefUseSpan, Microsoft.CodeAnalysis.CSharp, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35],[System.__Canon, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].MoveNext() [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at System.Collections.Generic.EnumerableHelpers.ToArray[[System.__Canon, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]](System.Collections.Generic.IEnumerable`1, Int32 ByRef) [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at System.Linq.Buffer`1[[System.__Canon, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]]..ctor(System.Collections.Generic.IEnumerable`1) [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at System.Linq.OrderedEnumerable`1+d__17[[System.__Canon, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].MoveNext() [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at System.Linq.Enumerable+SelectIPartitionIterator`2[[System.__Canon, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.__Canon, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].MoveNext() [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at Microsoft.CodeAnalysis.CSharp.CodeGen.Optimizer.RemoveIntersectingLocals(System.Collections.Generic.Dictionary`2, Microsoft.CodeAnalysis.PooledObjects.ArrayBuilder`1) [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at Microsoft.CodeAnalysis.CSharp.CodeGen.Optimizer.FilterValidStackLocals(System.Collections.Generic.Dictionary`2) [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at Microsoft.CodeAnalysis.CSharp.CodeGen.Optimizer.Optimize(Microsoft.CodeAnalysis.CSharp.BoundStatement, Boolean, System.Collections.Generic.HashSet`1 ByRef) [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at Microsoft.CodeAnalysis.CSharp.CodeGen.CodeGenerator..ctor(Microsoft.CodeAnalysis.CSharp.Symbols.MethodSymbol, Microsoft.CodeAnalysis.CSharp.BoundStatement, Microsoft.CodeAnalysis.CodeGen.ILBuilder, Microsoft.CodeAnalysis.CSharp.Emit.PEModuleBuilder, Microsoft.CodeAnalysis.DiagnosticBag, Microsoft.CodeAnalysis.OptimizationLevel, Boolean) [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at Microsoft.CodeAnalysis.CSharp.MethodCompiler.GenerateMethodBody(Microsoft.CodeAnalysis.CSharp.Emit.PEModuleBuilder, Microsoft.CodeAnalysis.CSharp.Symbols.MethodSymbol, Int32, Microsoft.CodeAnalysis.CSharp.BoundStatement, System.Collections.Immutable.ImmutableArray`1, System.Collections.Immutable.ImmutableArray`1, Microsoft.CodeAnalysis.CSharp.StateMachineTypeSymbol, Microsoft.CodeAnalysis.CodeGen.VariableSlotAllocator, Microsoft.CodeAnalysis.CSharp.BindingDiagnosticBag, Microsoft.CodeAnalysis.CodeGen.DebugDocumentProvider, Microsoft.CodeAnalysis.CSharp.ImportChain, Boolean, Boolean, System.Collections.Immutable.ImmutableArray`1, AsyncForwardEntryPoint) [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at Microsoft.CodeAnalysis.CSharp.MethodCompiler.CompileMethod(Microsoft.CodeAnalysis.CSharp.Symbols.MethodSymbol, Int32, ProcessedFieldInitializers ByRef, Microsoft.CodeAnalysis.CSharp.SynthesizedSubmissionFields, Microsoft.CodeAnalysis.CSharp.TypeCompilationState) [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at Microsoft.CodeAnalysis.CSharp.MethodCompiler.CompileNamedType(Microsoft.CodeAnalysis.CSharp.Symbols.NamedTypeSymbol) [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at Microsoft.CodeAnalysis.CSharp.MethodCompiler+<>c__DisplayClass25_0.b__0() [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at Roslyn.Utilities.UICultureUtilities+<>c__DisplayClass5_0.b__0() [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at System.Threading.Tasks.Task.InnerInvoke() [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at System.Threading.Tasks.Task+<>c.<.cctor>b__272_0(System.Object) [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(System.Threading.Thread, System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object) [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at System.Threading.Tasks.Task.ExecuteWithThreadLocal(System.Threading.Tasks.Task ByRef, System.Threading.Thread) [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at System.Threading.ThreadPoolWorkQueue.Dispatch() [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at System.Threading.PortableThreadPool+WorkerThread.WorkerThreadStart() [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at System.Threading.Thread.StartCallback() [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown. [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at System.Collections.Immutable.ImmutableArray`1.Builder.GetEnumerator() [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at Microsoft.CodeAnalysis.PooledObjects.ArrayBuilder`1.System.Collections.Generic.IEnumerable.GetEnumerator() [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at System.Linq.Enumerable.SelectManyIterator[TSource,TCollection,TResult](IEnumerable`1 source, Func`2 collectionSelector, Func`3 resultSelector)+MoveNext() [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at System.Collections.Generic.EnumerableHelpers.ToArray[T](IEnumerable`1 source, Int32& length) [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at System.Linq.Buffer`1..ctor(IEnumerable`1 source) [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at System.Linq.OrderedEnumerable`1.GetEnumerator()+MoveNext() [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at System.Linq.Enumerable.SelectIPartitionIterator`2.MoveNext() [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at Microsoft.CodeAnalysis.CSharp.CodeGen.Optimizer.RemoveIntersectingLocals(Dictionary`2 info, ArrayBuilder`1 dummies) [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at Microsoft.CodeAnalysis.CSharp.CodeGen.Optimizer.FilterValidStackLocals(Dictionary`2 info) [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at Microsoft.CodeAnalysis.CSharp.CodeGen.Optimizer.Optimize(BoundStatement src, Boolean debugFriendly, HashSet`1& stackLocals) [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at Microsoft.CodeAnalysis.CSharp.CodeGen.CodeGenerator..ctor(MethodSymbol method, BoundStatement boundBody, ILBuilder builder, PEModuleBuilder moduleBuilder, DiagnosticBag diagnostics, OptimizationLevel optimizations, Boolean emittingPdb) [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at Microsoft.CodeAnalysis.CSharp.MethodCompiler.GenerateMethodBody(PEModuleBuilder moduleBuilder, MethodSymbol method, Int32 methodOrdinal, BoundStatement block, ImmutableArray`1 lambdaDebugInfo, ImmutableArray`1 closureDebugInfo, StateMachineTypeSymbol stateMachineTypeOpt, VariableSlotAllocator variableSlotAllocatorOpt, BindingDiagnosticBag diagnostics, DebugDocumentProvider debugDocumentProvider, ImportChain importChainOpt, Boolean emittingPdb, Boolean emitTestCoverageData, ImmutableArray`1 dynamicAnalysisSpans, AsyncForwardEntryPoint entryPointOpt) [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at Microsoft.CodeAnalysis.CSharp.MethodCompiler.CompileMethod(MethodSymbol methodSymbol, Int32 methodOrdinal, ProcessedFieldInitializers& processedInitializers, SynthesizedSubmissionFields previousSubmissionFields, TypeCompilationState compilationState) [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at Microsoft.CodeAnalysis.CSharp.MethodCompiler.CompileNamedType(NamedTypeSymbol containingType) [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] at Microsoft.CodeAnalysis.CSharp.MethodCompiler.<>c__DisplayClass25_0.b__0() [D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj] ```
adamsitnik commented 2 years ago

Using the python script mentioned above is great to quickly get a 32 bit version of the SDK, but once you get it you might want to experiment with some changes locally.

When python script fails, it's going to print the path to the folder with auto-generated project. In the example below it's D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491:

```log [2022/02/03 12:41:10][INFO] Dumping COMPlus environment: [2022/02/03 12:41:10][INFO] -------------------------------------------------- [2022/02/03 12:41:10][INFO] $ pushd "D:\projects\performance\src\benchmarks\micro" [2022/02/03 12:41:10][INFO] $ dotnet run --project D:\projects\performance\src\benchmarks\micro\MicroBenchmarks.csproj --configuration Release --framework net7.0 --no-restore --no-build -- --filter * --packages D:\projects\performance\artifacts\packages --buildTimeout 600 [2022/02/03 12:41:14][INFO] // Validating benchmarks: [2022/02/03 12:41:20][INFO] // ***** BenchmarkRunner: Start ***** [2022/02/03 12:41:20][INFO] // ***** Found 4506 benchmark(s) in total ***** [2022/02/03 12:41:20][INFO] // ***** Building 1 exe(s) in Parallel: Start ***** [2022/02/03 12:41:29][INFO] // start dotnet restore /p:DebugType=portable -bl:benchmarkdotnet.binlog /p:UseSharedCompilation=false /p:BuildInParallel=false /m:1 /p:Deterministic=true /p:Optimize=true in D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491 [2022/02/03 12:41:31][INFO] // command took 1.91s and exited with 0 [2022/02/03 12:41:31][INFO] // start dotnet build -c Release /p:DebugType=portable -bl:benchmarkdotnet.binlog --no-restore /p:UseSharedCompilation=false /p:BuildInParallel=false /m:1 /p:Deterministic=true /p:Optimize=true in D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491 [2022/02/03 12:41:55][INFO] // command took 24.11s and exited with 1 [2022/02/03 12:41:55][INFO] // start dotnet build -c Release /p:DebugType=portable -bl:benchmarkdotnet.binlog --no-restore --no-dependencies /p:UseSharedCompilation=false /p:BuildInParallel=false /m:1 /p:Deterministic=true /p:Optimize=true in D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491 [2022/02/03 12:42:11][INFO] // command took 16.47s and exited with 1 [2022/02/03 12:42:11][INFO] // ***** Done, took 00:00:51 (51.6 sec) ***** [2022/02/03 12:42:11][INFO] // Found 3 benchmarks: [2022/02/03 12:42:11][INFO] // BilinearTest.Interpol_Scalar: Job-RXFPWE(PowerPlanMode=00000000-0000-0000-0000-000000000000, Arguments=/p:DebugType=portable,-bl:benchmarkdotnet.binlog, IterationTime=250.0000 ms, MaxIterationCount=20, MinIterationCount=15, WarmupCount=1) [2022/02/03 12:42:11][INFO] // BilinearTest.Interpol_Vector: Job-RXFPWE(PowerPlanMode=00000000-0000-0000-0000-000000000000, Arguments=/p:DebugType=portable,-bl:benchmarkdotnet.binlog, IterationTime=250.0000 ms, MaxIterationCount=20, MinIterationCount=15, WarmupCount=1) [2022/02/03 12:42:11][INFO] // BilinearTest.Interpol_AVX: Job-RXFPWE(PowerPlanMode=00000000-0000-0000-0000-000000000000, Arguments=/p:DebugType=portable,-bl:benchmarkdotnet.binlog, IterationTime=250.0000 ms, MaxIterationCount=20, MinIterationCount=15, WarmupCount=1) [2022/02/03 12:42:11][INFO] [2022/02/03 12:42:11][INFO] // Build Error: Standard output: [2022/02/03 12:42:11][INFO] [2022/02/03 12:42:11][INFO] Standard error: [2022/02/03 12:42:11][INFO] Time Elapsed 00:00:16.16 [2022/02/03 12:42:11][INFO] 50 Error(s) [2022/02/03 12:42:11][INFO] 0 Warning(s) ```

You can modify the project (to apply some extra settings? use a local buld of Roslyn?) and build it using the downloaded SDK:

.\performance\tools\dotnet\x86\dotnet.exe build -c Release -f net7.0 D:\projects\performance\artifacts\bin\MicroBenchmarks\Release\net7.0\b5b91f91-ffea-42f8-b3c4-564a95dfa491\BenchmarkDotNet.Autogenerated.csproj

By doing that you get only the MSBuild output without BDN or python script noise.

cston commented 2 years ago

One potential work around is to disable analyzers. (That seems to allow compilation to succeed.)

adamsitnik commented 2 years ago

I've tried that by using the following settings for 6.0:

<RunAnalyzersDuringBuild>false</RunAnalyzersDuringBuild>
<RunAnalyzersDuringLiveAnalysis>false</RunAnalyzersDuringLiveAnalysis>
<RunAnalyzers>false</RunAnalyzers>

but it failed with:

\x86\sdk\6.0.103\Roslyn\Microsoft.CSharp.Core.targets(75,5): error MSB6006: "csc.dll" exited with code -107374079

-107374079 is STATUS_STACK_BUFFER_OVERRUN ?

will try with 7.0 next

adamsitnik commented 2 years ago

With 7.0 I get the same error:

x86\sdk\7.0.100-preview.1.22077.12\Roslyn\Microsoft.CSharp.Core.targets(75,5): error MSB6006: "csc.dll" exited with code -1073740791.
adamsitnik commented 2 years ago

Update: I was able to get it working, I needed to remove:

    <DebugType>pdbonly</DebugType>
    <DebugSymbols>true</DebugSymbols>
cston commented 2 years ago

I'm able to hit the OutOfMemoryException with -netcoreapp3.1, -net6.0 and -net7.0, with at least one analyzer assembly. With /skipanalyzers+, the compile succeeds.

/debug-
/debug:embedded
/filealign:512
/optimize+
/analyzerconfig:<root>\artifacts\obj\BenchmarkDotNet.Autogenerated\Release\netcoreapp3.1\BenchmarkDotNet.Autogenerated.GeneratedMSBuildEditorConfig.editorconfig
/analyzer:<packages>\microsoft.codeanalysis.analyzers\2.6.1\analyzers\dotnet\cs\Microsoft.CodeAnalysis.Analyzers.dll
adamsitnik commented 2 years ago

It happened again, so I've reduced the produced code size and we are again unblocked for a while: https://github.com/dotnet/BenchmarkDotNet/pull/1984