Skip to content

.NET 8 - Fatal error - Attempted to read or write protected memory #2005

Closed

Description

@nicolascotton

Hi,

When I upgraded my projects to .NET 8, some of my queries were failing with a fatal error:

Fatal error. System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
   at DynamicClass.Deserialize1438ca86-58d3-4c26-a016-8aeb80aaf8ea(System.Data.Common.DbDataReader)
   at Dapper.SqlMapper+<>c__DisplayClass167_0`8[[One, ConsoleApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[Two, ConsoleApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[System.__Canon, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.__Canon, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.__Canon, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.__Canon, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.__Canon, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.ValueTuple`2[[One, ConsoleApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[Two, ConsoleApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].<GenerateMapper>b__0(System.Data.Common.DbDataReader)
   at Dapper.SqlMapper+<MultiMapImpl>d__164`8[[One, ConsoleApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[Two, ConsoleApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[System.__Canon, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.__Canon, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.__Canon, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.__Canon, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.__Canon, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.ValueTuple`2[[One, ConsoleApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[Two, ConsoleApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].MoveNext()
   at System.Collections.Generic.List`1[[System.ValueTuple`2[[One, ConsoleApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[Two, ConsoleApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]]..ctor(System.Collections.Generic.IEnumerable`1<System.ValueTuple`2<One,Two>>)
   at System.Linq.Enumerable.ToList[[System.ValueTuple`2[[One, ConsoleApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[Two, ConsoleApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]](System.Collections.Generic.IEnumerable`1<System.ValueTuple`2<One,Two>>)
   at Dapper.SqlMapper+<MultiMapAsync>d__52`8[[One, ConsoleApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[Two, ConsoleApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[System.__Canon, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.__Canon, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.__Canon, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.__Canon, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.__Canon, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.ValueTuple`2[[One, ConsoleApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[Two, ConsoleApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].MoveNext()
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1+AsyncStateMachineBox`1[[System.__Canon, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Dapper.SqlMapper+<MultiMapAsync>d__52`8[[One, ConsoleApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[Two, ConsoleApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[System.__Canon, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.__Canon, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.__Canon, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.__Canon, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.__Canon, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.ValueTuple`2[[One, ConsoleApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[Two, ConsoleApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], Dapper, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null]].ExecutionContextCallback(System.Object)
   at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1+AsyncStateMachineBox`1[[System.__Canon, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Dapper.SqlMapper+<MultiMapAsync>d__52`8[[One, ConsoleApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[Two, ConsoleApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[System.__Canon, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.__Canon, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.__Canon, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.__Canon, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.__Canon, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.ValueTuple`2[[One, ConsoleApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[Two, ConsoleApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], Dapper, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null]].MoveNext(System.Threading.Thread)
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1+AsyncStateMachineBox`1[[System.__Canon, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Dapper.SqlMapper+<MultiMapAsync>d__52`8[[One, ConsoleApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[Two, ConsoleApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[System.__Canon, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.__Canon, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.__Canon, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.__Canon, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.__Canon, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.ValueTuple`2[[One, ConsoleApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[Two, ConsoleApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], Dapper, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null]].MoveNext()
   at System.Runtime.CompilerServices.TaskAwaiter+<>c.<OutputWaitEtwEvents>b__12_0(System.Action, System.Threading.Tasks.Task)
   at System.Threading.Tasks.AwaitTaskContinuation.RunOrScheduleAction(System.Action, Boolean)
   at System.Threading.Tasks.Task.RunContinuations(System.Object)
   at System.Threading.Tasks.Task.ExecuteWithThreadLocal(System.Threading.Tasks.Task ByRef, System.Threading.Thread)
   at System.Threading.Tasks.ThreadPoolTaskScheduler.TryExecuteTaskInline(System.Threading.Tasks.Task, Boolean)
   at System.Threading.Tasks.TaskScheduler.TryRunInline(System.Threading.Tasks.Task, Boolean)
   at System.Threading.Tasks.TaskContinuation.InlineIfPossibleOrElseQueue(System.Threading.Tasks.Task, Boolean)
   at System.Threading.Tasks.ContinueWithTaskContinuation.Run(System.Threading.Tasks.Task, Boolean)
   at System.Threading.Tasks.Task.RunContinuations(System.Object)
   at System.Threading.Tasks.Task`1[[System.__Canon, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].TrySetResult(System.__Canon)
   at System.Threading.Tasks.UnwrapPromise`1[[System.__Canon, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].TrySetFromTask(System.Threading.Tasks.Task, Boolean)
   at System.Threading.Tasks.UnwrapPromise`1[[System.__Canon, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].ProcessInnerTask(System.Threading.Tasks.Task)
   at System.Threading.Tasks.Task.RunContinuations(System.Object)
   at System.Threading.Tasks.Task.ExecuteWithThreadLocal(System.Threading.Tasks.Task ByRef, System.Threading.Thread)
   at System.Threading.ThreadPoolWorkQueue.Dispatch()
   at System.Threading.PortableThreadPool+WorkerThread.WorkerThreadStart()

Using Dapper 2.1.24, the following program works with .NET 7, but fails with .NET 8:

using System;
using System.Threading.Tasks;
using Microsoft.Data.SqlClient;
using Dapper;

public class Program
{	
	internal record struct One( int OID );
	internal record struct Two( int OID, string Name );
	
	public static async Task Main()
	{
		using var cnn = new SqlConnection(FiddleHelper.GetConnectionStringSqlServer());
		var sql = @"SELECT 1 AS OID, 2 AS OID, 'Name' AS Name";
		var splitOn = "OID";
		var map = (One x1, Two x2) => (x1, x2);
		
		var results = await cnn.QueryAsync<One, Two, (One, Two)>(sql, map, splitOn: splitOn).ConfigureAwait(false);
		
		foreach(var result in results)
		{
			Console.WriteLine(result);
		}
	}
}

Activity

  1. akozmic commented on Dec 29, 2023

    @akozmic

    I ran into a very similar issue this morning. I don't get as good of a stack trace but I found that in .NET 8, when I use the QueryAsync with multiple generic parameters and the splitOn column my Integration Tests are crashing with Exit Code 139.

    While playing around with it, it seemed related the use of structs

    If you go to the provided .NET 8 fiddle and change the DTOs to the following, it runs correctly:

    internal record struct One( int OID );
    internal record Two( int OID, string Name );
    

    What I found in local testing was that I could use a struct for the first generic parameter TFirst, but using a struct for the 2nd would crash. I assume that it would fail for TThird through TSeventh as well.

  2. mgravell commented on Dec 29, 2023

    @mgravell
    Member

    Intriguing. Will prioritize, thanks for the reports. Sorry, I missed this the first time in November - too much email, and this isn't my day job.

  3. self-assigned this
    on Dec 29, 2023
  4. added a commit that references this issue on Jan 2, 2024
  5. mgravell commented on Jan 2, 2024

    @mgravell
    Member
  6. akozmic commented on Jan 2, 2024

    @akozmic

    Awesome! Thanks @mgravell

  7. mgravell commented on Jan 2, 2024

    @mgravell
    Member
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions