From 9c173ce1e6db36c61364bbf901b92f9b7b3a2ab2 Mon Sep 17 00:00:00 2001 From: rcj1 Date: Fri, 18 Jul 2025 14:12:01 -0700 Subject: [PATCH 1/7] temp --- docs/design/datacontracts/Loader.md | 11 ++++ .../debug/runtimeinfo/datadescriptor.h | 1 + src/coreclr/vm/appdomain.hpp | 1 + .../Contracts/ILoader.cs | 1 + .../Contracts/Loader_1.cs | 10 ++++ .../Data/AppDomain.cs | 2 + .../Legacy/SOSDacImpl.cs | 59 ++++++++++++++++++- 7 files changed, 84 insertions(+), 1 deletion(-) diff --git a/docs/design/datacontracts/Loader.md b/docs/design/datacontracts/Loader.md index 9964998eb51172..4b2147cb3d7da8 100644 --- a/docs/design/datacontracts/Loader.md +++ b/docs/design/datacontracts/Loader.md @@ -56,6 +56,7 @@ ModuleHandle GetModuleHandleFromModulePtr(TargetPointer module); ModuleHandle GetModuleHandleFromAssemblyPtr(TargetPointer assemblyPointer); IEnumerable GetModuleHandles(TargetPointer appDomain, AssemblyIterationFlags iterationFlags); TargetPointer GetRootAssembly(); +string GetFriendlyName(); TargetPointer GetModule(ModuleHandle handle); TargetPointer GetAssembly(ModuleHandle handle); TargetPointer GetPEAssembly(ModuleHandle handle); @@ -114,6 +115,7 @@ bool IsAssemblyLoaded(ModuleHandle handle); | `CGrowableSymbolStream` | `Size` | Size of the raw symbol stream buffer | | `AppDomain` | `RootAssembly` | Pointer to the root assembly | | `AppDomain` | `DomainAssemblyList` | ArrayListBase of assemblies in the AppDomain | +| `AppDomain` | `FriendlyName` | Friendly name of the AppDomain | | `LoaderAllocator` | `ReferenceCount` | Reference count of LoaderAllocator | | `ArrayListBase` | `Count` | Total number of elements in the ArrayListBase | | `ArrayListBase` | `FirstBlock` | First ArrayListBlock | @@ -263,6 +265,15 @@ TargetPointer GetRootAssembly() return appDomain.RootAssembly; } +string ILoader.GetFriendlyName() +{ + TargetPointer appDomainPointer = _target.ReadGlobalPointer(Constants.Globals.AppDomain); + Data.AppDomain appDomain = // read AppDomain object starting at appDomainPointer + TargetPointer pathStart = target.ReadPointer(handle.Address + /* AppDomain::FriendlyName offset */); + char[] name = // Read from target starting at pathStart until null terminator + return new string(name); +} + TargetPointer ILoader.GetModule(ModuleHandle handle) { return handle.Address; diff --git a/src/coreclr/debug/runtimeinfo/datadescriptor.h b/src/coreclr/debug/runtimeinfo/datadescriptor.h index 647583b0e87fe5..848e21a7d7d8a8 100644 --- a/src/coreclr/debug/runtimeinfo/datadescriptor.h +++ b/src/coreclr/debug/runtimeinfo/datadescriptor.h @@ -292,6 +292,7 @@ CDAC_TYPE_BEGIN(AppDomain) CDAC_TYPE_INDETERMINATE(AppDomain) CDAC_TYPE_FIELD(AppDomain, /*pointer*/, RootAssembly, cdac_data::RootAssembly) CDAC_TYPE_FIELD(AppDomain, /*DomainAssemblyList*/, DomainAssemblyList, cdac_data::DomainAssemblyList) +CDAC_TYPE_FIELD(AppDomain, /*pointer*/, FriendlyName, cdac_data::FriendlyName) CDAC_TYPE_END(AppDomain) CDAC_TYPE_BEGIN(ArrayListBase) diff --git a/src/coreclr/vm/appdomain.hpp b/src/coreclr/vm/appdomain.hpp index 85a87d4ff82e9a..dd5c68782c5ea6 100644 --- a/src/coreclr/vm/appdomain.hpp +++ b/src/coreclr/vm/appdomain.hpp @@ -1627,6 +1627,7 @@ struct cdac_data { static constexpr size_t RootAssembly = offsetof(AppDomain, m_pRootAssembly); static constexpr size_t DomainAssemblyList = offsetof(AppDomain, m_Assemblies) + offsetof(AppDomain::DomainAssemblyList, m_array); + static constexpr size_t FriendlyName = offsetof(AppDomain, m_friendlyName); }; typedef DPTR(class SystemDomain) PTR_SystemDomain; diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Contracts/ILoader.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Contracts/ILoader.cs index ea748dffda1cc2..fc01b83c90a1d1 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Contracts/ILoader.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Contracts/ILoader.cs @@ -79,6 +79,7 @@ public interface ILoader : IContract ModuleHandle GetModuleHandleFromAssemblyPtr(TargetPointer assemblyPointer) => throw new NotImplementedException(); IEnumerable GetModuleHandles(TargetPointer appDomain, AssemblyIterationFlags iterationFlags) => throw new NotImplementedException(); TargetPointer GetRootAssembly() => throw new NotImplementedException(); + string GetFriendlyName() => throw new NotImplementedException(); TargetPointer GetModule(ModuleHandle handle) => throw new NotImplementedException(); TargetPointer GetAssembly(ModuleHandle handle) => throw new NotImplementedException(); TargetPointer GetPEAssembly(ModuleHandle handle) => throw new NotImplementedException(); diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Loader_1.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Loader_1.cs index c03a42e840c5e7..19d18e7b7a8dce 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Loader_1.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Loader_1.cs @@ -139,10 +139,20 @@ TargetPointer ILoader.GetRootAssembly() Data.AppDomain appDomain = _target.ProcessedData.GetOrAdd(_target.ReadPointer(appDomainPointer)); return appDomain.RootAssembly; } + + string ILoader.GetFriendlyName() + { + TargetPointer appDomainPointer = _target.ReadGlobalPointer(Constants.Globals.AppDomain); + Data.AppDomain appDomain = _target.ProcessedData.GetOrAdd(_target.ReadPointer(appDomainPointer)); + return appDomain.FriendlyName != TargetPointer.Null + ? _target.ReadUtf16String(appDomain.FriendlyName) + : string.Empty; + } TargetPointer ILoader.GetModule(ModuleHandle handle) { return handle.Address; } + TargetPointer ILoader.GetAssembly(ModuleHandle handle) { Data.Module module = _target.ProcessedData.GetOrAdd(handle.Address); diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/AppDomain.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/AppDomain.cs index a0df88ed1faa28..cd21ff7172abce 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/AppDomain.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/AppDomain.cs @@ -14,8 +14,10 @@ public AppDomain(Target target, TargetPointer address) RootAssembly = target.ReadPointer(address + (ulong)type.Fields[nameof(RootAssembly)].Offset); DomainAssemblyList = address + (ulong)type.Fields[nameof(DomainAssemblyList)].Offset; + FriendlyName = target.ReadPointer(address + (ulong)type.Fields[nameof(FriendlyName)].Offset); } public TargetPointer RootAssembly { get; init; } public TargetPointer DomainAssemblyList { get; init; } + public TargetPointer FriendlyName { get; init; } } diff --git a/src/native/managed/cdac/mscordaccore_universal/Legacy/SOSDacImpl.cs b/src/native/managed/cdac/mscordaccore_universal/Legacy/SOSDacImpl.cs index 1e67b1a01bebd3..2fa9870d9d2621 100644 --- a/src/native/managed/cdac/mscordaccore_universal/Legacy/SOSDacImpl.cs +++ b/src/native/managed/cdac/mscordaccore_universal/Legacy/SOSDacImpl.cs @@ -115,7 +115,64 @@ int ISOSDacInterface.GetAppDomainData(ClrDataAddress addr, void* data) int ISOSDacInterface.GetAppDomainList(uint count, [In, MarshalUsing(CountElementName = "count"), Out] ClrDataAddress[] values, uint* pNeeded) => _legacyImpl is not null ? _legacyImpl.GetAppDomainList(count, values, pNeeded) : HResults.E_NOTIMPL; int ISOSDacInterface.GetAppDomainName(ClrDataAddress addr, uint count, char* name, uint* pNeeded) - => _legacyImpl is not null ? _legacyImpl.GetAppDomainName(addr, count, name, pNeeded) : HResults.E_NOTIMPL; + { + int hr = HResults.S_OK; + try + { + ILoader loader = _target.Contracts.Loader; + string friendlyName = loader.GetFriendlyName(); + TargetPointer systemDomainPtr = _target.ReadGlobalPointer(Constants.Globals.SystemDomain); + ClrDataAddress systemDomain = _target.ReadPointer(systemDomainPtr).ToClrDataAddress(_target); + if (addr == systemDomain || friendlyName == string.Empty) + { + if (pNeeded is not null) + { + *pNeeded = 1; + } + if (name is not null & count > 0) + { + name[0] = '\0'; // Set the first character to null terminator + } + } + else + { + uint needed = (uint)(friendlyName.Length + 1); // +1 for null terminator + if (pNeeded is not null) + { + *pNeeded = needed; + } + + if (name is not null && count > 0) + { + OutputBufferHelpers.CopyStringToBuffer(name, count, pNeeded, friendlyName); + name[needed - 1] = '\0'; // Ensure null termination + } + } + } + catch (System.Exception ex) + { + hr = ex.HResult; + } +#if DEBUG + if (_legacyImpl is not null) + { + uint neededLocal; + char[] nameLocal = new char[count]; + int hrLocal; + fixed (char* ptr = nameLocal) + { + hrLocal = _legacyImpl.GetAppDomainName(addr, count, ptr, &neededLocal); + } + Debug.Assert(hrLocal == hr, $"cDAC: {hr:x}, DAC: {hrLocal:x}"); + if (hr == HResults.S_OK) + { + Debug.Assert(pNeeded == null || *pNeeded == neededLocal); + Debug.Assert(name == null || new ReadOnlySpan(nameLocal, 0, (int)neededLocal - 1).SequenceEqual(new string(name))); + } + } +#endif + return hr; + } int ISOSDacInterface.GetAppDomainStoreData(void* data) => _legacyImpl is not null ? _legacyImpl.GetAppDomainStoreData(data) : HResults.E_NOTIMPL; int ISOSDacInterface.GetApplicationBase(ClrDataAddress appDomain, int count, char* appBase, uint* pNeeded) From a603c4c0425d19750eaaf6b67a64341676c8f485 Mon Sep 17 00:00:00 2001 From: rcj1 Date: Fri, 18 Jul 2025 15:11:59 -0700 Subject: [PATCH 2/7] whitespace --- .../Contracts/Loader_1.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Loader_1.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Loader_1.cs index 19d18e7b7a8dce..9ba4a10afedbe2 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Loader_1.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Loader_1.cs @@ -148,6 +148,7 @@ string ILoader.GetFriendlyName() ? _target.ReadUtf16String(appDomain.FriendlyName) : string.Empty; } + TargetPointer ILoader.GetModule(ModuleHandle handle) { return handle.Address; From 44f4d3973c351d434ea4252ec88f94f32342b8d5 Mon Sep 17 00:00:00 2001 From: Rachel Date: Fri, 18 Jul 2025 15:13:27 -0700 Subject: [PATCH 3/7] Update src/native/managed/cdac/mscordaccore_universal/Legacy/SOSDacImpl.cs Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../managed/cdac/mscordaccore_universal/Legacy/SOSDacImpl.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/native/managed/cdac/mscordaccore_universal/Legacy/SOSDacImpl.cs b/src/native/managed/cdac/mscordaccore_universal/Legacy/SOSDacImpl.cs index 2fa9870d9d2621..e1e3bb4e0cc6cb 100644 --- a/src/native/managed/cdac/mscordaccore_universal/Legacy/SOSDacImpl.cs +++ b/src/native/managed/cdac/mscordaccore_universal/Legacy/SOSDacImpl.cs @@ -129,7 +129,7 @@ int ISOSDacInterface.GetAppDomainName(ClrDataAddress addr, uint count, char* nam { *pNeeded = 1; } - if (name is not null & count > 0) + if (name is not null && count > 0) { name[0] = '\0'; // Set the first character to null terminator } From aa6ec22b407b31ee04ee4e18dfacf43587b599c2 Mon Sep 17 00:00:00 2001 From: rcj1 Date: Fri, 18 Jul 2025 15:26:38 -0700 Subject: [PATCH 4/7] simplifying string handling --- .../cdac/mscordaccore_universal/Legacy/SOSDacImpl.cs | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/native/managed/cdac/mscordaccore_universal/Legacy/SOSDacImpl.cs b/src/native/managed/cdac/mscordaccore_universal/Legacy/SOSDacImpl.cs index 2fa9870d9d2621..9bbbb1941e7e67 100644 --- a/src/native/managed/cdac/mscordaccore_universal/Legacy/SOSDacImpl.cs +++ b/src/native/managed/cdac/mscordaccore_universal/Legacy/SOSDacImpl.cs @@ -136,16 +136,9 @@ int ISOSDacInterface.GetAppDomainName(ClrDataAddress addr, uint count, char* nam } else { - uint needed = (uint)(friendlyName.Length + 1); // +1 for null terminator - if (pNeeded is not null) - { - *pNeeded = needed; - } - if (name is not null && count > 0) { OutputBufferHelpers.CopyStringToBuffer(name, count, pNeeded, friendlyName); - name[needed - 1] = '\0'; // Ensure null termination } } } From 4364d2ad4db76060ebde05236728342622b30793 Mon Sep 17 00:00:00 2001 From: rcj1 Date: Mon, 21 Jul 2025 13:39:19 -0700 Subject: [PATCH 5/7] fix --- .../managed/cdac/mscordaccore_universal/Legacy/SOSDacImpl.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/native/managed/cdac/mscordaccore_universal/Legacy/SOSDacImpl.cs b/src/native/managed/cdac/mscordaccore_universal/Legacy/SOSDacImpl.cs index c9e37077146d12..50df41d89882bf 100644 --- a/src/native/managed/cdac/mscordaccore_universal/Legacy/SOSDacImpl.cs +++ b/src/native/managed/cdac/mscordaccore_universal/Legacy/SOSDacImpl.cs @@ -136,6 +136,11 @@ int ISOSDacInterface.GetAppDomainName(ClrDataAddress addr, uint count, char* nam } else { + if (pNeeded is not null) + { + *pNeeded = (uint)(friendlyName.Length + 1); // +1 for null terminator + } + if (name is not null && count > 0) { OutputBufferHelpers.CopyStringToBuffer(name, count, pNeeded, friendlyName); From 2d650741d9827a3980151bab8ec3919b5f2875dc Mon Sep 17 00:00:00 2001 From: rcj1 Date: Mon, 21 Jul 2025 13:44:37 -0700 Subject: [PATCH 6/7] _target target --- docs/design/datacontracts/Loader.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/docs/design/datacontracts/Loader.md b/docs/design/datacontracts/Loader.md index 4b2147cb3d7da8..1c2a19b6841a96 100644 --- a/docs/design/datacontracts/Loader.md +++ b/docs/design/datacontracts/Loader.md @@ -267,7 +267,7 @@ TargetPointer GetRootAssembly() string ILoader.GetFriendlyName() { - TargetPointer appDomainPointer = _target.ReadGlobalPointer(Constants.Globals.AppDomain); + TargetPointer appDomainPointer = target.ReadGlobalPointer(Constants.Globals.AppDomain); Data.AppDomain appDomain = // read AppDomain object starting at appDomainPointer TargetPointer pathStart = target.ReadPointer(handle.Address + /* AppDomain::FriendlyName offset */); char[] name = // Read from target starting at pathStart until null terminator @@ -404,20 +404,20 @@ TargetPointer GetModuleLookupMapElement(TargetPointer table, uint token, out Tar uint index = rid; // have to read lookupMap an extra time upfront because only the first map // has valid supportedFlagsMask - TargetNUInt supportedFlagsMask = _target.ReadNUInt(table + /* ModuleLookupMap::SupportedFlagsMask */); + TargetNUInt supportedFlagsMask = target.ReadNUInt(table + /* ModuleLookupMap::SupportedFlagsMask */); do { - if (index < _target.Read(table + /*ModuleLookupMap::Count*/)) + if (index < target.Read(table + /*ModuleLookupMap::Count*/)) { - TargetPointer entryAddress = _target.ReadPointer(lookupMap + /*ModuleLookupMap::TableData*/) + (ulong)(index * _target.PointerSize); - TargetPointer rawValue = _target.ReadPointer(entryAddress); + TargetPointer entryAddress = target.ReadPointer(lookupMap + /*ModuleLookupMap::TableData*/) + (ulong)(index * target.PointerSize); + TargetPointer rawValue = target.ReadPointer(entryAddress); flags = rawValue & supportedFlagsMask; return rawValue & ~(supportedFlagsMask.Value); } else { - table = _target.ReadPointer(lookupMap + /*ModuleLookupMap::Next*/); - index -= _target.Read(lookupMap + /*ModuleLookupMap::Count*/); + table = target.ReadPointer(lookupMap + /*ModuleLookupMap::Next*/); + index -= target.Read(lookupMap + /*ModuleLookupMap::Count*/); } } while (table != TargetPointer.Null); return TargetPointer.Null; @@ -427,15 +427,15 @@ TargetPointer GetModuleLookupMapElement(TargetPointer table, uint token, out Tar ```csharp bool ILoader.IsCollectible(ModuleHandle handle) { - TargetPointer assembly = _target.ReadPointer(handle.Address + /*Module::Assembly*/); - byte isCollectible = _target.Read(assembly + /* Assembly::IsCollectible*/); + TargetPointer assembly = target.ReadPointer(handle.Address + /*Module::Assembly*/); + byte isCollectible = target.Read(assembly + /* Assembly::IsCollectible*/); return isCollectible != 0; } bool ILoader.IsAssemblyLoaded(ModuleHandle handle) { - TargetPointer assembly = _target.ReadPointer(handle.Address + /*Module::Assembly*/); - uint loadLevel = _target.Read(assembly + /* Assembly::Level*/); + TargetPointer assembly = target.ReadPointer(handle.Address + /*Module::Assembly*/); + uint loadLevel = target.Read(assembly + /* Assembly::Level*/); return assembly.Level >= ASSEMBLY_LEVEL_LOADED; } ``` From 5711c15d3cecb0e3b557077232fd1de256d0ace7 Mon Sep 17 00:00:00 2001 From: rcj1 Date: Thu, 24 Jul 2025 11:55:29 -0700 Subject: [PATCH 7/7] docs and renaming --- docs/design/datacontracts/Loader.md | 8 ++++---- .../Contracts/ILoader.cs | 2 +- .../Contracts/Loader_1.cs | 2 +- .../cdac/mscordaccore_universal/Legacy/SOSDacImpl.cs | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/design/datacontracts/Loader.md b/docs/design/datacontracts/Loader.md index 1c2a19b6841a96..8bc3a5ff288435 100644 --- a/docs/design/datacontracts/Loader.md +++ b/docs/design/datacontracts/Loader.md @@ -56,7 +56,7 @@ ModuleHandle GetModuleHandleFromModulePtr(TargetPointer module); ModuleHandle GetModuleHandleFromAssemblyPtr(TargetPointer assemblyPointer); IEnumerable GetModuleHandles(TargetPointer appDomain, AssemblyIterationFlags iterationFlags); TargetPointer GetRootAssembly(); -string GetFriendlyName(); +string GetAppDomainFriendlyName(); TargetPointer GetModule(ModuleHandle handle); TargetPointer GetAssembly(ModuleHandle handle); TargetPointer GetPEAssembly(ModuleHandle handle); @@ -265,11 +265,11 @@ TargetPointer GetRootAssembly() return appDomain.RootAssembly; } -string ILoader.GetFriendlyName() +string ILoader.GetAppDomainFriendlyName() { TargetPointer appDomainPointer = target.ReadGlobalPointer(Constants.Globals.AppDomain); - Data.AppDomain appDomain = // read AppDomain object starting at appDomainPointer - TargetPointer pathStart = target.ReadPointer(handle.Address + /* AppDomain::FriendlyName offset */); + TargetPointer appDomain = target.ReadPointer(appDomainPointer) + TargetPointer pathStart = appDomain + /* AppDomain::FriendlyName offset */; char[] name = // Read from target starting at pathStart until null terminator return new string(name); } diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Contracts/ILoader.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Contracts/ILoader.cs index fc01b83c90a1d1..45d5a6e86c1a8f 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Contracts/ILoader.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Contracts/ILoader.cs @@ -79,7 +79,7 @@ public interface ILoader : IContract ModuleHandle GetModuleHandleFromAssemblyPtr(TargetPointer assemblyPointer) => throw new NotImplementedException(); IEnumerable GetModuleHandles(TargetPointer appDomain, AssemblyIterationFlags iterationFlags) => throw new NotImplementedException(); TargetPointer GetRootAssembly() => throw new NotImplementedException(); - string GetFriendlyName() => throw new NotImplementedException(); + string GetAppDomainFriendlyName() => throw new NotImplementedException(); TargetPointer GetModule(ModuleHandle handle) => throw new NotImplementedException(); TargetPointer GetAssembly(ModuleHandle handle) => throw new NotImplementedException(); TargetPointer GetPEAssembly(ModuleHandle handle) => throw new NotImplementedException(); diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Loader_1.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Loader_1.cs index 9ba4a10afedbe2..100373d30c1ddf 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Loader_1.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Loader_1.cs @@ -140,7 +140,7 @@ TargetPointer ILoader.GetRootAssembly() return appDomain.RootAssembly; } - string ILoader.GetFriendlyName() + string ILoader.GetAppDomainFriendlyName() { TargetPointer appDomainPointer = _target.ReadGlobalPointer(Constants.Globals.AppDomain); Data.AppDomain appDomain = _target.ProcessedData.GetOrAdd(_target.ReadPointer(appDomainPointer)); diff --git a/src/native/managed/cdac/mscordaccore_universal/Legacy/SOSDacImpl.cs b/src/native/managed/cdac/mscordaccore_universal/Legacy/SOSDacImpl.cs index 50df41d89882bf..524101e03400db 100644 --- a/src/native/managed/cdac/mscordaccore_universal/Legacy/SOSDacImpl.cs +++ b/src/native/managed/cdac/mscordaccore_universal/Legacy/SOSDacImpl.cs @@ -120,7 +120,7 @@ int ISOSDacInterface.GetAppDomainName(ClrDataAddress addr, uint count, char* nam try { ILoader loader = _target.Contracts.Loader; - string friendlyName = loader.GetFriendlyName(); + string friendlyName = loader.GetAppDomainFriendlyName(); TargetPointer systemDomainPtr = _target.ReadGlobalPointer(Constants.Globals.SystemDomain); ClrDataAddress systemDomain = _target.ReadPointer(systemDomainPtr).ToClrDataAddress(_target); if (addr == systemDomain || friendlyName == string.Empty)