dotnet / dotnet/msbuild

MSBuild throws thousands of first-chance exceptions evaluating projects with certain types of property functions

Open
#2,217 18 comments 4 reactions 0 assignees View on GitHub
Area: Performance Priority:2 triaged
Dominant language
C#
Stars
5.5k
Forks
1.5k
Avg merge
1d 8h
Merged PRs (30d)
141

Description

MSBuild is throwing thousands of exceptions opening certain solutions which this makes debugging VS extremely painful and might affect the loading time of these solutions.

Opening Roslyn.sln, MSBuild threw over > 21,000 first chance exceptions with stacks similar to:

MissingMethodException: Attempted to access a missing member.
mscorlib.dll!System.DefaultBinder.BindToMethod(System.Reflection.BindingFlags bindingAttr, System.Reflection.MethodBase[] match, ref object[] args, System.Reflection.ParameterModifier[] modifiers, System.Globalization.CultureInfo cultureInfo, string[] names, out object state) Unknown
Microsoft.Build.dll!Microsoft.Build.Evaluation.Expander.Function.Execute(object objectInstance, Microsoft.Build.Evaluation.IPropertyProvider properties, Microsoft.Build.Evaluation.ExpanderOptions options, Microsoft.Build.Shared.IElementLocation elementLocation) Unknown
Microsoft.Build.dll!Microsoft.Build.Evaluation.Expander.PropertyExpander.ExpandPropertyBody(string propertyBody, object propertyValue, Microsoft.Build.Evaluation.IPropertyProvider properties, Microsoft.Build.Evaluation.ExpanderOptions options, Microsoft.Build.Shared.IElementLocation elementLocation, Microsoft.Build.Evaluation.UsedUninitializedProperties usedUninitializedProperties) Unknown
Microsoft.Build.dll!Microsoft.Build.Evaluation.Expander.Function.Execute(object objectInstance, Microsoft.Build.Evaluation.IPropertyProvider properties, Microsoft.Build.Evaluation.ExpanderOptions options, Microsoft.Build.Shared.IElementLocation elementLocation) Unknown
Microsoft.Build.dll!Microsoft.Build.Evaluation.Expander.PropertyExpander.ExpandPropertyBody(string propertyBody, object propertyValue, Microsoft.Build.Evaluation.IPropertyProvider properties, Microsoft.Build.Evaluation.ExpanderOptions options, Microsoft.Build.Shared.IElementLocation elementLocation, Microsoft.Build.Evaluation.UsedUninitializedProperties usedUninitializedProperties) Unknown
Microsoft.Build.dll!Microsoft.Build.Evaluation.Expander.PropertyExpander.ExpandPropertiesLeaveTypedAndEscaped(string expression, Microsoft.Build.Evaluation.IPropertyProvider properties, Microsoft.Build.Evaluation.ExpanderOptions options, Microsoft.Build.Shared.IElementLocation elementLocation, Microsoft.Build.Evaluation.UsedUninitializedProperties usedUninitializedProperties) Unknown
Microsoft.Build.dll!Microsoft.Build.Evaluation.Expander.Function.Execute(object objectInstance, Microsoft.Build.Evaluation.IPropertyProvider properties, Microsoft.Build.Evaluation.ExpanderOptions options, Microsoft.Build.Shared.IElementLocation elementLocation) Unknown
Microsoft.Build.dll!Microsoft.Build.Evaluation.Expander.PropertyExpander.ExpandPropertyBody(string propertyBody, object propertyValue, Microsoft.Build.Evaluation.IPropertyProvider properties, Microsoft.Build.Evaluation.ExpanderOptions options, Microsoft.Build.Shared.IElementLocation elementLocation, Microsoft.Build.Evaluation.UsedUninitializedProperties usedUninitializedProperties) Unknown
Microsoft.Build.dll!Microsoft.Build.Evaluation.Expander.PropertyExpander.ExpandPropertiesLeaveTypedAndEscaped(string expression, Microsoft.Build.Evaluation.IPropertyProvider properties, Microsoft.Build.Evaluation.ExpanderOptions options, Microsoft.Build.Shared.IElementLocation elementLocation, Microsoft.Build.Evaluation.UsedUninitializedProperties usedUninitializedProperties) Unknown
Microsoft.Build.dll!Microsoft.Build.Evaluation.Expander.PropertyExpander.ExpandPropertiesLeaveEscaped(string expression, Microsoft.Build.Evaluation.IPropertyProvider properties, Microsoft.Build.Evaluation.ExpanderOptions options, Microsoft.Build.Shared.IElementLocation elementLocation, Microsoft.Build.Evaluation.UsedUninitializedProperties usedUninitializedProperties) Unknown
Microsoft.Build.dll!Microsoft.Build.Evaluation.Expander.ExpandIntoStringLeaveEscaped(string expression, Microsoft.Build.Evaluation.ExpanderOptions options, Microsoft.Build.Shared.IElementLocation elementLocation) Unknown
Microsoft.Build.dll!Microsoft.Build.Evaluation.Evaluator.EvaluatePropertyElement(Microsoft.Build.Construction.ProjectPropertyElement propertyElement) Unknown
Microsoft.Build.dll!Microsoft.Build.Evaluation.Evaluator.EvaluatePropertyGroupElement(Microsoft.Build.Construction.ProjectPropertyGroupElement propertyGroupElement) Unknown
Microsoft.Build.dll!Microsoft.Build.Evaluation.Evaluator.PerformDepthFirstPass(Microsoft.Build.Construction.ProjectRootElement currentProjectOrImport) Unknown
Microsoft.Build.dll!Microsoft.Build.Evaluation.Evaluator.EvaluateImportElement(string directoryOfImportingFile, Microsoft.Build.Construction.ProjectImportElement importElement) Unknown
Microsoft.Build.dll!Microsoft.Build.Evaluation.Evaluator.PerformDepthFirstPass(Microsoft.Build.Construction.ProjectRootElement currentProjectOrImport) Unknown
Microsoft.Build.dll!Microsoft.Build.Evaluation.Evaluator.EvaluateImportElement(string directoryOfImportingFile, Microsoft.Build.Construction.ProjectImportElement importElement) Unknown
Microsoft.Build.dll!Microsoft.Build.Evaluation.Evaluator.PerformDepthFirstPass(Microsoft.Build.Construction.ProjectRootElement currentProjectOrImport) Unknown
Microsoft.Build.dll!Microsoft.Build.Evaluation.Evaluator.EvaluateImportElement(string directoryOfImportingFile, Microsoft.Build.Construction.ProjectImportElement importElement) Unknown
Microsoft.Build.dll!Microsoft.Build.Evaluation.Evaluator.PerformDepthFirstPass(Microsoft.Build.Construction.ProjectRootElement currentProjectOrImport) Unknown
Microsoft.Build.dll!Microsoft.Build.Evaluation.Evaluator.Evaluate() Unknown
Microsoft.Build.dll!Microsoft.Build.Evaluation.Evaluator.Evaluate(Microsoft.Build.Evaluation.IEvaluatorData data, Microsoft.Build.Construction.ProjectRootElement root, Microsoft.Build.Evaluation.ProjectLoadSettings loadSettings, int maxNodeCount, Microsoft.Build.Collections.PropertyDictionary environmentProperties, Microsoft.Build.BackEnd.Logging.ILoggingService loggingService, Microsoft.Build.Evaluation.IItemFactory itemFactory, Microsoft.Build.Evaluation.IToolsetProvider toolsetProvider, Microsoft.Build.Evaluation.ProjectRootElementCache projectRootElementCache, Microsoft.Build.Framework.BuildEventContext buildEventContext, Microsoft.Build.Execution.ProjectInstance projectInstanceIfAnyForDebuggerOnly, Microsoft.Build.BackEnd.SdkResolution sdkResolution) Unknown
Microsoft.Build.dll!Microsoft.Build.Evaluation.Project.Reevaluate(Microsoft.Build.BackEnd.Logging.ILoggingService loggingServiceForEvaluation, Microsoft.Build.Evaluation.ProjectLoadSettings loadSettings) Unknown
Microsoft.Build.dll!Microsoft.Build.Evaluation.Project.ReevaluateIfNecessary(Microsoft.Build.BackEnd.Logging.ILoggingService loggingServiceForEvaluation, Microsoft.Build.Evaluation.ProjectLoadSettings loadSettings) Unknown
Microsoft.Build.dll!Microsoft.Build.Evaluation.Project.Initialize(System.Collections.Generic.IDictionary globalProperties, string toolsVersion, string subToolsetVersion, Microsoft.Build.Evaluation.ProjectLoadSettings loadSettings) Unknown
Microsoft.Build.dll!Microsoft.Build.Evaluation.Project.Project(Microsoft.Build.Construction.ProjectRootElement xml, System.Collections.Generic.IDictionary globalProperties, string toolsVersion, string subToolsetVersion, Microsoft.Build.Evaluation.ProjectCollection projectCollection, Microsoft.Build.Evaluation.ProjectLoadSettings loadSettings) Unknown
Microsoft.Build.dll!Microsoft.Build.Evaluation.Project.Project(Microsoft.Build.Construction.ProjectRootElement xml, System.Collections.Generic.IDictionary globalProperties, string toolsVersion, Microsoft.Build.Evaluation.ProjectCollection projectCollection, Microsoft.Build.Evaluation.ProjectLoadSettings loadSettings) Unknown

InvalidCastException: Invalid cast from 'System.String' to 'System.Int32[]'
Microsoft.Build.dll!Function`1.CoerceArguments(object[] args = {unknown}, System.Reflection.ParameterInfo[] parameters = {unknown}) C#
Microsoft.Build.dll!Function`1.LateBindExecute(System.Exception ex = {unknown}, System.Reflection.BindingFlags bindingFlags = {unknown}, object objectInstance = {unknown}, object[] args = {unknown}, bool isConstructor = {unknown}) C#
Microsoft.Build.dll!Function`1.Execute(object objectInstance = {unknown}, Microsoft.Build.Evaluation.IPropertyProvider properties = {unknown}, Microsoft.Build.Evaluation.ExpanderOptions options = {unknown}, Microsoft.Build.Shared.IElementLocation elementLocation = {unknown}) C#
Microsoft.Build.dll!PropertyExpander`1.ExpandPropertyBody(string propertyBody = {unknown}, object propertyValue = {unknown}, Microsoft.Build.Evaluation.IPropertyProvider properties = {unknown}, Microsoft.Build.Evaluation.ExpanderOptions options = {unknown}, Microsoft.Build.Shared.IElementLocation elementLocation = {unknown}, Microsoft.Build.Evaluation.UsedUninitializedProperties usedUninitializedProperties = {unknown}) C#
Microsoft.Build.dll!Function`1.Execute(object objectInstance = {unknown}, Microsoft.Build.Evaluation.IPropertyProvider properties = {unknown}, Microsoft.Build.Evaluation.ExpanderOptions options = {unknown}, Microsoft.Build.Shared.IElementLocation elementLocation = {unknown}) C#
Microsoft.Build.dll!PropertyExpander`1.ExpandPropertyBody(string propertyBody = {unknown}, object propertyValue = {unknown}, Microsoft.Build.Evaluation.IPropertyProvider properties = {unknown}, Microsoft.Build.Evaluation.ExpanderOptions options = {unknown}, Microsoft.Build.Shared.IElementLocation elementLocation = {unknown}, Microsoft.Build.Evaluation.UsedUninitializedProperties usedUninitializedProperties = {unknown}) C#
Microsoft.Build.dll!PropertyExpander`1.ExpandPropertiesLeaveTypedAndEscaped(string expression = {unknown}, Microsoft.Build.Evaluation.IPropertyProvider properties = {unknown}, Microsoft.Build.Evaluation.ExpanderOptions options = {unknown}, Microsoft.Build.Shared.IElementLocation elementLocation = {unknown}, Microsoft.Build.Evaluation.UsedUninitializedProperties usedUninitializedProperties = {unknown}) C#
Microsoft.Build.dll!PropertyExpander`1.ExpandPropertiesLeaveEscaped(string expression = {unknown}, Microsoft.Build.Evaluation.IPropertyProvider properties = {unknown}, Microsoft.Build.Evaluation.ExpanderOptions options = {unknown}, Microsoft.Build.Shared.IElementLocation elementLocation = {unknown}, Microsoft.Build.Evaluation.UsedUninitializedProperties usedUninitializedProperties = {unknown}) C#
Microsoft.Build.dll!Microsoft.Build.Evaluation.Expander`2.ExpandIntoStringLeaveEscaped(string expression = {unknown}, Microsoft.Build.Evaluation.ExpanderOptions options = {unknown}, Microsoft.Build.Shared.IElementLocation elementLocation = {unknown}) C#
Microsoft.Build.dll!Microsoft.Build.Evaluation.Evaluator`4.EvaluatePropertyElement(Microsoft.Build.Construction.ProjectPropertyElement propertyElement = {unknown}) C#
Microsoft.Build.dll!Microsoft.Build.Evaluation.Evaluator`4.EvaluatePropertyGroupElement(Microsoft.Build.Construction.ProjectPropertyGroupElement propertyGroupElement = {unknown}) C#
Microsoft.Build.dll!Microsoft.Build.Evaluation.Evaluator`4.PerformDepthFirstPass(Microsoft.Build.Construction.ProjectRootElement currentProjectOrImport = {unknown}) C#
Microsoft.Build.dll!Microsoft.Build.Evaluation.Evaluator`4.EvaluateImportElement(string directoryOfImportingFile = {unknown}, Microsoft.Build.Construction.ProjectImportElement importElement = {unknown}) C#
Microsoft.Build.dll!Microsoft.Build.Evaluation.Evaluator`4.PerformDepthFirstPass(Microsoft.Build.Construction.ProjectRootElement currentProjectOrImport = {unknown}) C#
Microsoft.Build.dll!Microsoft.Build.Evaluation.Evaluator`4.EvaluateImportElement(string directoryOfImportingFile = {unknown}, Microsoft.Build.Construction.ProjectImportElement importElement = {unknown}) C#
Microsoft.Build.dll!Microsoft.Build.Evaluation.Evaluator`4.PerformDepthFirstPass(Microsoft.Build.Construction.ProjectRootElement currentProjectOrImport = {unknown}) C#
Microsoft.Build.dll!Microsoft.Build.Evaluation.Evaluator`4.EvaluateImportElement(string directoryOfImportingFile = {unknown}, Microsoft.Build.Construction.ProjectImportElement importElement = {unknown}) C#
Microsoft.Build.dll!Microsoft.Build.Evaluation.Evaluator`4.PerformDepthFirstPass(Microsoft.Build.Construction.ProjectRootElement currentProjectOrImport = {unknown}) C#
Microsoft.Build.dll!Microsoft.Build.Evaluation.Evaluator`4.Evaluate() C#
Microsoft.Build.dll!Microsoft.Build.Evaluation.Evaluator`4.Evaluate(Microsoft.Build.Evaluation.IEvaluatorData data = {unknown}, Microsoft.Build.Construction.ProjectRootElement root = {unknown}, Microsoft.Build.Evaluation.ProjectLoadSettings loadSettings = {unknown}, int maxNodeCount = {unknown}, Microsoft.Build.Collections.PropertyDictionary environmentProperties = {unknown}, Microsoft.Build.BackEnd.Logging.ILoggingService loggingService = {unknown}, Microsoft.Build.Evaluation.IItemFactory itemFactory = {unknown}, Microsoft.Build.Evaluation.IToolsetProvider toolsetProvider = {unknown}, Microsoft.Build.Evaluation.ProjectRootElementCache projectRootElementCache = {unknown}, Microsoft.Build.Framework.BuildEventContext buildEventContext = {unknown}, Microsoft.Build.Execution.ProjectInstance projectInstanceIfAnyForDebuggerOnly = {unknown}, Microsoft.Build.BackEnd.SdkResolution sdkResolution = {unknown}) C#
Microsoft.Build.dll!Microsoft.Build.Evaluation.Project.Reevaluate(Microsoft.Build.BackEnd.Logging.ILoggingService loggingServiceForEvaluation = {unknown}, Microsoft.Build.Evaluation.ProjectLoadSettings loadSettings = {unknown}) C#
Microsoft.Build.dll!Microsoft.Build.Evaluation.Project.ReevaluateIfNecessary(Microsoft.Build.BackEnd.Logging.ILoggingService loggingServiceForEvaluation = {unknown}, Microsoft.Build.Evaluation.ProjectLoadSettings loadSettings = {unknown}) C#
Microsoft.Build.dll!Microsoft.Build.Evaluation.Project.Initialize(System.Collections.Generic.IDictionary globalProperties = {unknown}, string toolsVersion = {unknown}, string subToolsetVersion = {unknown}, Microsoft.Build.Evaluation.ProjectLoadSettings loadSettings = {unknown}) C#
Microsoft.Build.dll!Microsoft.Build.Evaluation.Project..ctor(Microsoft.Build.Construction.ProjectRootElement xml = {unknown}, System.Collections.Generic.IDictionary globalProperties = {unknown}, string toolsVersion = {unknown}, string subToolsetVersion = {unknown}, Microsoft.Build.Evaluation.ProjectCollection projectCollection = {unknown}, Microsoft.Build.Evaluation.ProjectLoadSettings loadSettings = {unknown}) C#
Microsoft.Build.dll!Microsoft.Build.Evaluation.Project..ctor(Microsoft.Build.Construction.ProjectRootElement xml = {unknown}, System.Collections.Generic.IDictionary globalProperties = {unknown}, string toolsVersion = {unknown}, Microsoft.Build.Evaluation.ProjectCollection projectCollection = {unknown}, Microsoft.Build.Evaluation.ProjectLoadSettings loadSettings = {unknown}) C#

The following shows the timeline of loading the Roslyn solution:

![image](https://user-images.githubusercontent.com/1103906/27118376-59ecb146-511e-11e7-8c85-404282b792d3.png)

Almost all of thrown exceptions above originate from and get handled in MSBuild.

The expressions that seem be causing these exceptions live in https://github.com/dotnet/roslyn/blob/master/build/Targets/Versions.props:

``` XML
$([MSBuild]::Subtract($(BuildNumber.Split('.')[0].Substring(3).Trim()), 8800))
$(BuildNumber.Split('.')[1].PadLeft(2,'0'))**
```

Can we please implement a way to avoid these exceptional paths?

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.