Closed
Description
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);
}
}
}
- Fiddle with .NET 8: https://dotnetfiddle.net/lRCBot
- Fiddle with .NET 7: https://dotnetfiddle.net/Xs26kT
Activity
akozmic commentedon Dec 29, 2023
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 thesplitOn
column my Integration Tests are crashing with Exit Code 139.While playing around with it, it seemed related the use of
struct
sIf you go to the provided .NET 8 fiddle and change the DTOs to the following, it runs correctly:
What I found in local testing was that I could use a
struct
for the first generic parameter TFirst, but using astruct
for the 2nd would crash. I assume that it would fail for TThird through TSeventh as well.mgravell commentedon Dec 29, 2023
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.
repro for #2005 (and lib updates)
mgravell commentedon Jan 2, 2024
cause identified
fix codegen error in value-type multimap #2005 (#2022)
akozmic commentedon Jan 2, 2024
Awesome! Thanks @mgravell
mgravell commentedon Jan 2, 2024
https://github.com/DapperLib/Dapper/releases/tag/2.1.28