in src/Microsoft.Diagnostics.Runtime/ClrRuntime.cs [418:479]
private DomainAndModules InitAppDomainData()
{
Dictionary<ulong, ClrModule> modules = new();
string bclName = ClrInfo.Flavor == ClrFlavor.Core ? "SYSTEM.PRIVATE.CORELIB" : "MSCORLIB";
ClrAppDomain? system = null, shared = null;
ClrModule? bcl = null;
ImmutableArray<ClrAppDomain>.Builder builder = ImmutableArray.CreateBuilder<ClrAppDomain>();
foreach (AppDomainInfo domainInfo in GetDacRuntime().EnumerateAppDomains())
{
ClrAppDomain domain = new(this, domainInfo, GetService<IAbstractClrNativeHeaps>());
switch (domainInfo.Kind)
{
case AppDomainKind.Normal:
builder.Add(domain);
break;
case AppDomainKind.System:
system = domain;
break;
case AppDomainKind.Shared:
shared = domain;
break;
default:
throw new InvalidDataException($"Unknown domain kind: {domainInfo.Kind}");
}
IAbstractModuleHelpers moduleHelpers = GetServiceOrThrow<IAbstractModuleHelpers>();
IAbstractClrNativeHeaps? nativeHeaps = GetService<IAbstractClrNativeHeaps>();
ImmutableArray<ClrModule>.Builder moduleBuilder = ImmutableArray.CreateBuilder<ClrModule>();
foreach (ulong moduleAddress in GetDacRuntime().GetModuleList(domain.Address))
{
if (!modules.TryGetValue(moduleAddress, out ClrModule? module))
{
module = new(domain, moduleAddress, moduleHelpers, nativeHeaps, DataTarget.DataReader);
modules.Add(moduleAddress, module);
}
moduleBuilder.Add(module);
if (bcl is null && module.Name is not null)
{
try
{
string fileName = Path.GetFileNameWithoutExtension(module.Name);
if (fileName.Equals(bclName, StringComparison.OrdinalIgnoreCase))
bcl = module;
}
catch
{
}
}
}
domain.Modules = moduleBuilder.MoveOrCopyToImmutable();
}
return new(system, shared, builder.MoveOrCopyToImmutable(), modules.Values.ToArray(), bcl);
}