Skip to content

Netcore 2.0.0, Type Providers, FSC Stack Overflow - Assembly Load Infinite Loop #3654

@ghost

Description

When compiling using dotnet, I am running into a stack overflow exception. It appears to be related to the FSharp.Data.SqlProvider package, but regardless of what a 3rd party library does, I see this as a bug in fsc.exe

I understand that fsharp does not quite yet support type providers in netcore, I hope that this issue can help to work towards it working. Side note, could someone provide instructions to getting netcore fsc working on 2.0.0? I would attempt to troubleshoot further and PR this if I could compile the compiler.

Repro steps

  1. Download FSharp.Data.SqlProvider.dll from nuget, and place it in an accessible location.
  2. Create a file named test.fs that just has module x\rlet x = "" or some such.

Run the following command:
dotnet /usr/share/dotnet/sdk/2.0.0/FSharp/fsc.exe --noframework -r:/usr/share/dotnet/sdk/NuGetFallbackFolder/netstandard.library/2.0.0/build/netstandard2.0/ref/mscorlib.dll -r:/usr/share/dotnet/sdk/NuGetFallbackFolder/netstandard.library/2.0.0/build/netstandard2.0/ref/System.Runtime.dll -r:/usr/share/dotnet/sdk/NuGetFallbackFolder/netstandard.library/2.0.0/build/netstandard2.0/ref/netstandard.dll -r:/home/xenocons/.nuget/packages/sqlprovider/1.1.11/lib/FSharp.Data.SqlProvider.dll test.fs

Related information

Provide any related information

  • Debian 9
  • .NET Core 2.0.0

Stacktrace

FSC doesnt seem to produce a stacktrace, so I used lldb to get the below, this seems to repeat constantly and chew up the stack, it looks like perhaps assembly resolution is occurring in an endless loop.

00007FFFFFFEAC58 00007ffff6344f07 [HelperMethodFrame_PROTECTOBJ: 00007ffffffeac58] System.Reflection.RuntimeAssembly._nLoad(System.Reflection.AssemblyName, System.String, System.Security.Policy.Evidence, System.Reflection.RuntimeAssembly, System.Threading.StackCrawlMark ByRef, IntPtr, Boolean, Boolean, Boolean, IntPtr)
00007FFFFFFEAD90 00007FFF7CB2606E System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(System.Reflection.AssemblyName, System.Security.Policy.Evidence, System.Reflection.RuntimeAssembly, System.Threading.StackCrawlMark ByRef, IntPtr, Boolean, Boolean, IntPtr)
00007FFFFFFEADF0 00007FFF7CB52B48 System.Reflection.Assembly.Load(System.Reflection.AssemblyName, IntPtr)
00007FFFFFFEAE30 00007FFF7CBB14A4 System.Runtime.Loader.AssemblyLoadContext.LoadFromAssemblyName(System.Reflection.AssemblyName)
00007FFFFFFEAE40 00007FFF7E6C0091 Microsoft.FSharp.Core.ReflectionAdapters+CustomAssemblyResolver.Load(System.Reflection.AssemblyName)
00007FFFFFFEAE50 00007FFF7CBB1400 System.Runtime.Loader.AssemblyLoadContext.ResolveUsingLoad(System.Reflection.AssemblyName)
00007FFFFFFEAE80 00007FFF7CBB123C System.Runtime.Loader.AssemblyLoadContext.Resolve(IntPtr, System.Reflection.AssemblyName)
00007FFFFFFEB3C0 00007ffff6344f07 [GCFrame: 00007ffffffeb3c0] 

Before the endless loop we see this:

00007FFFFFFFBD78 00007ffff6344f07 [InlinedCallFrame: 00007fffffffbd78] System.Reflection.RuntimeAssembly.GetExportedTypes(System.Reflection.RuntimeAssembly, System.Runtime.CompilerServices.ObjectHandleOnStack)
00007FFFFFFFBD78 00007fff7cc54b22 [InlinedCallFrame: 00007fffffffbd78] System.Reflection.RuntimeAssembly.GetExportedTypes(System.Reflection.RuntimeAssembly, System.Runtime.CompilerServices.ObjectHandleOnStack)
00007FFFFFFFBD70 00007FFF7CC54B22 DomainNeutralILStubClass.IL_STUB_PInvoke(System.Reflection.RuntimeModule, System.Runtime.CompilerServices.ObjectHandleOnStack)
00007FFFFFFFBE00 00007FFF7CB25BDA System.Reflection.RuntimeAssembly.GetExportedTypes()
00007FFFFFFFBE20 00007FFF7E4E874E Microsoft.FSharp.Compiler.ExtensionTyping.GetTypeProviderImplementationTypes(System.String, System.String, range)
00007FFFFFFFBE80 00007FFF7E4EED87 Microsoft.FSharp.Compiler.ExtensionTyping+GetTypeProvidersOfAssembly@160.GenerateNext(System.Collections.Generic.IEnumerable`1<System.Tuple`2<Microsoft.FSharp.Core.CompilerServices.ITypeProvider,ILScopeRef>> ByRef)
00007FFFFFFFBEF0 00007FFF7EE86025 Microsoft.FSharp.Core.CompilerServices.GeneratedSequenceBase`1[[System.__Canon, System.Private.CoreLib]].MoveNextImpl()
00007FFFFFFFBF40 00007FFF7EE861AD Microsoft.FSharp.Core.CompilerServices.GeneratedSequenceBase`1[[System.__Canon, System.Private.CoreLib]].System-Collections-IEnumerator-MoveNext()
00007FFFFFFFBF50 00007FFF7EF2807C Microsoft.FSharp.Collections.SeqModule.ToList[[System.__Canon, System.Private.CoreLib]](System.Collections.Generic.IEnumerable`1<System.__Canon>)
00007FFFFFFFBFA0 00007FFF7E4E8C9F Microsoft.FSharp.Compiler.ExtensionTyping.GetTypeProvidersOfAssembly(System.String, ILScopeRef, System.String, ResolutionEnvironment, Boolean, Boolean, Microsoft.FSharp.Core.FSharpFunc`2<System.String,Boolean>, System.Version, range)
00007FFFFFFFC050 00007FFF7E1F83FF [email protected](System.Collections.Generic.IEnumerable`1<Microsoft.FSharp.Collections.FSharpList`1<Microsoft.FSharp.Compiler.Tainted`1<Microsoft.FSharp.Core.CompilerServices.ITypeProvider>>> ByRef)

Which the plot thickens.. GetTypeProviderImplementationTypes, which leads us to https://github.com/Microsoft/visualfsharp/blob/master/src/fsharp/ExtensionTyping.fs#L41 however I cannot actually see any source for an infinite recursion.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions