Skip to content

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

Closed
@nicolascotton

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

akozmic

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.

mgravell

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.

self-assigned this
on Dec 29, 2023
added a commit that references this issue on Jan 2, 2024

repro for #2005 (and lib updates)

mgravell

mgravell commented on Jan 2, 2024

@mgravell
Member
added a commit that references this issue on Jan 2, 2024
akozmic

akozmic commented on Jan 2, 2024

@akozmic

Awesome! Thanks @mgravell

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

    .NET 8 - Fatal error - Attempted to read or write protected memory · Issue #2005 · DapperLib/Dapper