From 6612facf8e732997cd794b50c08e8465d286a214 Mon Sep 17 00:00:00 2001 From: rcj1 Date: Fri, 24 Apr 2026 11:51:40 -0700 Subject: [PATCH 1/8] TEST --- .../SOSDacImpl.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs index d67adff3ab3489..9d571821b0365f 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs @@ -2995,7 +2995,7 @@ int ISOSDacInterface.GetMethodTableName(ClrDataAddress mt, uint count, char* mtN Debug.ValidateHResult(hr, hrLocal); if (hr == HResults.S_OK) { - Debug.Assert(pNeeded == null || *pNeeded == neededLocal); + Debug.Assert(pNeeded == null || *pNeeded == neededLocal, $"local name = {new string(mtNameLocal, 0, (int)neededLocal - 1)}, name = {new string(mtName, 0, (int)*pNeeded - 1)}"); Debug.Assert(mtName == null || new ReadOnlySpan(mtNameLocal, 0, (int)neededLocal - 1).SequenceEqual(new string(mtName))); } } From 7ad83320a0b77e082a279652c742aa7f25e321d9 Mon Sep 17 00:00:00 2001 From: Rachel Jarvi Date: Fri, 24 Apr 2026 12:03:20 -0700 Subject: [PATCH 2/8] Apply suggestion from @Copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../SOSDacImpl.cs | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs index 9d571821b0365f..ac880ec64803ad 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs @@ -2995,8 +2995,23 @@ int ISOSDacInterface.GetMethodTableName(ClrDataAddress mt, uint count, char* mtN Debug.ValidateHResult(hr, hrLocal); if (hr == HResults.S_OK) { - Debug.Assert(pNeeded == null || *pNeeded == neededLocal, $"local name = {new string(mtNameLocal, 0, (int)neededLocal - 1)}, name = {new string(mtName, 0, (int)*pNeeded - 1)}"); - Debug.Assert(mtName == null || new ReadOnlySpan(mtNameLocal, 0, (int)neededLocal - 1).SequenceEqual(new string(mtName))); + int localNameLength = neededLocal == 0 ? 0 : (int)Math.Min(neededLocal - 1, count); + int nameLength = 0; + if (mtName is not null && pNeeded is not null && *pNeeded != 0) + { + nameLength = (int)Math.Min(Math.Min(*pNeeded - 1, count), count); + } + + if (!(pNeeded is null || *pNeeded == neededLocal)) + { + string localNameString = new(mtNameLocal, 0, localNameLength); + string nameString = mtName is null ? string.Empty : new(mtName, 0, nameLength); + Debug.Fail($"local name = {localNameString}, name = {nameString}"); + } + + Debug.Assert( + mtName is null || + new ReadOnlySpan(mtNameLocal, 0, localNameLength).SequenceEqual(new ReadOnlySpan(mtName, nameLength))); } } #endif From 8b536d2b93b008fd85d1f3ae4974af07ac29db31 Mon Sep 17 00:00:00 2001 From: Rachel Jarvi Date: Fri, 24 Apr 2026 12:18:53 -0700 Subject: [PATCH 3/8] Update src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../SOSDacImpl.cs | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs index ac880ec64803ad..e74290fd962796 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs @@ -2995,11 +2995,23 @@ int ISOSDacInterface.GetMethodTableName(ClrDataAddress mt, uint count, char* mtN Debug.ValidateHResult(hr, hrLocal); if (hr == HResults.S_OK) { - int localNameLength = neededLocal == 0 ? 0 : (int)Math.Min(neededLocal - 1, count); + int maxComparableLength = count == 0 ? 0 : (int)count - 1; + ReadOnlySpan localComparableSpan = mtNameLocal.AsSpan(0, maxComparableLength); + int localNameLength = localComparableSpan.IndexOf('\0'); + if (localNameLength < 0) + { + localNameLength = maxComparableLength; + } + int nameLength = 0; - if (mtName is not null && pNeeded is not null && *pNeeded != 0) + if (mtName is not null) { - nameLength = (int)Math.Min(Math.Min(*pNeeded - 1, count), count); + ReadOnlySpan comparableSpan = new(mtName, maxComparableLength); + nameLength = comparableSpan.IndexOf('\0'); + if (nameLength < 0) + { + nameLength = maxComparableLength; + } } if (!(pNeeded is null || *pNeeded == neededLocal)) From d5622eaa8834be38caf0284115408a6a56b91d54 Mon Sep 17 00:00:00 2001 From: rcj1 Date: Fri, 24 Apr 2026 14:20:43 -0700 Subject: [PATCH 4/8] e --- .../SOSDacImpl.cs | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs index e74290fd962796..cf49aff71c7f5b 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs @@ -2937,6 +2937,8 @@ int ISOSDacInterface.GetMethodTableForEEClass(ClrDataAddress eeClassReallyCanonM int ISOSDacInterface.GetMethodTableName(ClrDataAddress mt, uint count, char* mtName, uint* pNeeded) { int hr = HResults.S_OK; + char[] mtNametest = new char[4096]; + int counttest = 4096; try { if (mt == 0) @@ -2946,6 +2948,10 @@ int ISOSDacInterface.GetMethodTableName(ClrDataAddress mt, uint count, char* mtN Contracts.TypeHandle methodTableHandle = typeSystemContract.GetTypeHandle(mt.ToTargetPointer(_target, overrideCheck: true)); if (typeSystemContract.IsFreeObjectMethodTable(methodTableHandle)) { + fixed (char* pMtNametest = mtNametest) + { + OutputBufferHelpers.CopyStringToBuffer(pMtNametest, counttest, pNeeded, "Free"); + } OutputBufferHelpers.CopyStringToBuffer(mtName, count, pNeeded, "Free"); } else @@ -2954,6 +2960,10 @@ int ISOSDacInterface.GetMethodTableName(ClrDataAddress mt, uint count, char* mtN Contracts.ModuleHandle moduleHandle = loader.GetModuleHandleFromModulePtr(modulePointer); if (!loader.TryGetLoadedImageContents(moduleHandle, out _, out _, out _)) { + fixed (char* pMtNametest = mtNametest) + { + OutputBufferHelpers.CopyStringToBuffer(pMtNametest, counttest, pNeeded, ""); + } OutputBufferHelpers.CopyStringToBuffer(mtName, count, pNeeded, ""); } else @@ -2972,6 +2982,10 @@ int ISOSDacInterface.GetMethodTableName(ClrDataAddress mt, uint count, char* mtN methodTableName.Append(fallbackName); } } + fixed (char* pMtNametest = mtNametest) + { + OutputBufferHelpers.CopyStringToBuffer(pMtNametest, counttest, pNeeded, methodTableName.ToString()); + } OutputBufferHelpers.CopyStringToBuffer(mtName, count, pNeeded, methodTableName.ToString()); } } @@ -2985,12 +2999,12 @@ int ISOSDacInterface.GetMethodTableName(ClrDataAddress mt, uint count, char* mtN #if DEBUG if (_legacyImpl is not null) { - char[] mtNameLocal = new char[count]; + char[] mtNameLocal = new char[counttest]; uint neededLocal; int hrLocal; fixed (char* ptr = mtNameLocal) { - hrLocal = _legacyImpl.GetMethodTableName(mt, count, ptr, &neededLocal); + hrLocal = _legacyImpl.GetMethodTableName(mt, counttest, ptr, &neededLocal); } Debug.ValidateHResult(hr, hrLocal); if (hr == HResults.S_OK) From a38618519b83ab0f88cbaf2d01371a74ef085b37 Mon Sep 17 00:00:00 2001 From: Rachel Jarvi Date: Fri, 24 Apr 2026 22:14:23 -0700 Subject: [PATCH 5/8] Fix maxComparableLength and update variable references --- .../SOSDacImpl.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs index cf49aff71c7f5b..bf577693451f9d 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs @@ -3009,7 +3009,7 @@ int ISOSDacInterface.GetMethodTableName(ClrDataAddress mt, uint count, char* mtN Debug.ValidateHResult(hr, hrLocal); if (hr == HResults.S_OK) { - int maxComparableLength = count == 0 ? 0 : (int)count - 1; + int maxComparableLength = 4095; ReadOnlySpan localComparableSpan = mtNameLocal.AsSpan(0, maxComparableLength); int localNameLength = localComparableSpan.IndexOf('\0'); if (localNameLength < 0) @@ -3020,7 +3020,7 @@ int ISOSDacInterface.GetMethodTableName(ClrDataAddress mt, uint count, char* mtN int nameLength = 0; if (mtName is not null) { - ReadOnlySpan comparableSpan = new(mtName, maxComparableLength); + ReadOnlySpan comparableSpan = new(mtNametest, maxComparableLength); nameLength = comparableSpan.IndexOf('\0'); if (nameLength < 0) { @@ -3031,8 +3031,8 @@ int ISOSDacInterface.GetMethodTableName(ClrDataAddress mt, uint count, char* mtN if (!(pNeeded is null || *pNeeded == neededLocal)) { string localNameString = new(mtNameLocal, 0, localNameLength); - string nameString = mtName is null ? string.Empty : new(mtName, 0, nameLength); - Debug.Fail($"local name = {localNameString}, name = {nameString}"); + string nameString = mtNametest is null ? string.Empty : new(mtNametest, 0, nameLength); + Debug.Fail($"local name = {localNameString}, name = {nameString}, neededlocal = {neededLocal}, pneeded = {pNeeded == null ? "null" : *pNeeded}"); } Debug.Assert( From 494e3a2a112212b145cecdb4fb1af646a01d4320 Mon Sep 17 00:00:00 2001 From: Rachel Jarvi Date: Fri, 24 Apr 2026 22:22:27 -0700 Subject: [PATCH 6/8] Update SOSDacImpl.cs --- .../SOSDacImpl.cs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs index bf577693451f9d..40772676ab6fa9 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs @@ -2938,7 +2938,7 @@ int ISOSDacInterface.GetMethodTableName(ClrDataAddress mt, uint count, char* mtN { int hr = HResults.S_OK; char[] mtNametest = new char[4096]; - int counttest = 4096; + uint counttest = 4096; try { if (mt == 0) @@ -3034,10 +3034,6 @@ int ISOSDacInterface.GetMethodTableName(ClrDataAddress mt, uint count, char* mtN string nameString = mtNametest is null ? string.Empty : new(mtNametest, 0, nameLength); Debug.Fail($"local name = {localNameString}, name = {nameString}, neededlocal = {neededLocal}, pneeded = {pNeeded == null ? "null" : *pNeeded}"); } - - Debug.Assert( - mtName is null || - new ReadOnlySpan(mtNameLocal, 0, localNameLength).SequenceEqual(new ReadOnlySpan(mtName, nameLength))); } } #endif From 1fc4110643974668e3f2e91503dfec0326b36031 Mon Sep 17 00:00:00 2001 From: Rachel Jarvi Date: Fri, 24 Apr 2026 23:03:41 -0700 Subject: [PATCH 7/8] Update SOSDacImpl.cs --- .../SOSDacImpl.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs index 40772676ab6fa9..0f83de76a3bbb4 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs @@ -3032,7 +3032,7 @@ int ISOSDacInterface.GetMethodTableName(ClrDataAddress mt, uint count, char* mtN { string localNameString = new(mtNameLocal, 0, localNameLength); string nameString = mtNametest is null ? string.Empty : new(mtNametest, 0, nameLength); - Debug.Fail($"local name = {localNameString}, name = {nameString}, neededlocal = {neededLocal}, pneeded = {pNeeded == null ? "null" : *pNeeded}"); + Debug.Fail($"local name = {localNameString}, name = {nameString}, neededlocal = {neededLocal}, pneeded = {(pNeeded == null ? "null" : *pNeeded)}"); } } } From d925fffd990721177ae94d82840b76bbedc8e7c7 Mon Sep 17 00:00:00 2001 From: Rachel Jarvi Date: Fri, 24 Apr 2026 23:10:38 -0700 Subject: [PATCH 8/8] Update src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../SOSDacImpl.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs index 0f83de76a3bbb4..c469ee4898f43e 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs @@ -3020,7 +3020,7 @@ int ISOSDacInterface.GetMethodTableName(ClrDataAddress mt, uint count, char* mtN int nameLength = 0; if (mtName is not null) { - ReadOnlySpan comparableSpan = new(mtNametest, maxComparableLength); + ReadOnlySpan comparableSpan = mtNametest.AsSpan(0, maxComparableLength); nameLength = comparableSpan.IndexOf('\0'); if (nameLength < 0) {