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..c469ee4898f43e 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]; + uint 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,18 +2999,41 @@ 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) { - Debug.Assert(pNeeded == null || *pNeeded == neededLocal); - Debug.Assert(mtName == null || new ReadOnlySpan(mtNameLocal, 0, (int)neededLocal - 1).SequenceEqual(new string(mtName))); + int maxComparableLength = 4095; + ReadOnlySpan localComparableSpan = mtNameLocal.AsSpan(0, maxComparableLength); + int localNameLength = localComparableSpan.IndexOf('\0'); + if (localNameLength < 0) + { + localNameLength = maxComparableLength; + } + + int nameLength = 0; + if (mtName is not null) + { + ReadOnlySpan comparableSpan = mtNametest.AsSpan(0, maxComparableLength); + nameLength = comparableSpan.IndexOf('\0'); + if (nameLength < 0) + { + nameLength = maxComparableLength; + } + } + + if (!(pNeeded is null || *pNeeded == neededLocal)) + { + 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)}"); + } } } #endif