Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,12 @@ public string GetDbiFilePath()
private ClrRuntime CreateRuntime()
{
CDacLoadPolicy policy = _settingsService.CDacLoadPolicy;
if (policy == CDacLoadPolicy.OnlyUseCDacForCoreClr)
{
policy = RuntimeType is RuntimeType.NetCore or RuntimeType.SingleFile
? CDacLoadPolicy.OnlyUseCDac
: CDacLoadPolicy.PreferCDac;
}
Trace.TraceInformation($"Runtime #{Id} data-access: begin (cDAC policy={policy})");

if (policy != CDacLoadPolicy.UseLegacyDac)
Expand Down
5 changes: 5 additions & 0 deletions src/Microsoft.Diagnostics.DebugServices/CDacLoadPolicy.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,9 @@ public enum CDacLoadPolicy
/// </summary>
UseLegacyDac = 2,

/// <summary>
/// Require cDAC activation for CoreCLR runtimes and allow DAC fallback for other runtimes.
/// </summary>
OnlyUseCDacForCoreClr = 3,

}
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public static void DisplaySettingService(this CommandBase command)
{
ISettingsService settingsService = command.Services.GetService<ISettingsService>() ?? throw new DiagnosticsException("Settings service required");
command.Console.WriteLine("Settings:");
command.Console.WriteLine($"-> Use cDAC: {settingsService.CDacLoadPolicy switch { CDacLoadPolicy.OnlyUseCDac => "true", CDacLoadPolicy.UseLegacyDac => "false", _ => "prefer" }}");
command.Console.WriteLine($"-> Use cDAC: {settingsService.CDacLoadPolicy switch { CDacLoadPolicy.OnlyUseCDac => "true", CDacLoadPolicy.UseLegacyDac => "false", CDacLoadPolicy.OnlyUseCDacForCoreClr => "coreclr", _ => "prefer" }}");
command.Console.WriteLine($"-> DAC signature verification check enabled: {settingsService.DacSignatureVerificationEnabled}");
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ public class RuntimesCommand : CommandBase
[Option(Name = "--all", Aliases = new string[] { "-a" }, Help = "Forces all runtimes to be enumerated.")]
public bool All { get; set; }

[Option(Name = "--usecdac", Help = "Controls cDAC usage: true (required), false (disabled), prefer (allow DAC fallback).")]
[Option(Name = "--usecdac", Help = "Controls cDAC usage: true (required), false (disabled), prefer (allow DAC fallback), coreclr (required for CoreCLR, allow DAC fallback otherwise).")]
public string UseCDac { get; set; }

[Option(Name = "--DacSignatureVerification", Aliases = new string[] { "-v" }, Help = "Enforce the proper DAC certificate signing when loaded (true/false).")]
Expand All @@ -57,7 +57,8 @@ public override void Invoke()
"true" => CDacLoadPolicy.OnlyUseCDac,
"false" => CDacLoadPolicy.UseLegacyDac,
"prefer" => CDacLoadPolicy.PreferCDac,
_ => throw new DiagnosticsException($"Invalid --usecdac value '{UseCDac}'. Expected true, false, or prefer."),
"coreclr" => CDacLoadPolicy.OnlyUseCDacForCoreClr,
_ => throw new DiagnosticsException($"Invalid --usecdac value '{UseCDac}'. Expected true, false, prefer, or coreclr."),
};
flush = true;
}
Expand Down
13 changes: 10 additions & 3 deletions src/SOS/SOS.Hosting/RuntimeWrapper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -264,7 +264,7 @@ private int GetClrDataProcess(

private CDacLoadPolicy GetCDacLoadPolicy(IntPtr self)
{
return _services.GetService<ISettingsService>()?.CDacLoadPolicy ?? CDacLoadPolicy.PreferCDac;
return EffectiveCDacLoadPolicy;
}

private int GetCorDebugInterface(
Expand Down Expand Up @@ -377,8 +377,7 @@ private IntPtr CreateClrDataProcessFromDac(IntPtr dacHandle)
private int CreateCorDebugProcess(out IntPtr corDebugProcess)
{
corDebugProcess = IntPtr.Zero;
CDacLoadPolicy policy =
_services.GetService<ISettingsService>()?.CDacLoadPolicy ?? CDacLoadPolicy.PreferCDac;
CDacLoadPolicy policy = EffectiveCDacLoadPolicy;
if (_runtime.RuntimeType == RuntimeType.Desktop)
{
return policy == CDacLoadPolicy.OnlyUseCDac
Expand All @@ -404,6 +403,14 @@ private int CreateCorDebugProcess(out IntPtr corDebugProcess)
out corDebugProcess);
}

private CDacLoadPolicy EffectiveCDacLoadPolicy =>
(_services.GetService<ISettingsService>()?.CDacLoadPolicy ?? CDacLoadPolicy.PreferCDac) switch
{
CDacLoadPolicy.OnlyUseCDacForCoreClr when _runtime.RuntimeType is RuntimeType.NetCore or RuntimeType.SingleFile => CDacLoadPolicy.OnlyUseCDac,
CDacLoadPolicy.OnlyUseCDacForCoreClr => CDacLoadPolicy.PreferCDac,
CDacLoadPolicy policy => policy,
};

private int CreateDesktopCorDebugProcess(out IntPtr corDebugProcess)
{
corDebugProcess = IntPtr.Zero;
Expand Down
9 changes: 8 additions & 1 deletion src/SOS/Strike/platform/runtimeimpl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -595,7 +595,14 @@ CDacLoadPolicy Runtime::GetConfiguredCDacLoadPolicy()

CDacLoadPolicy Runtime::GetCDacLoadPolicy() const
{
return GetConfiguredCDacLoadPolicy();
CDacLoadPolicy policy = GetConfiguredCDacLoadPolicy();
if (policy == CDacLoadPolicy::OnlyUseCDacForCoreClr)
{
return GetRuntimeConfiguration() == IRuntime::WindowsDesktop
? CDacLoadPolicy::PreferCDac
: CDacLoadPolicy::OnlyUseCDac;
}
return policy;
Comment on lines +598 to +605
}

void Runtime::SetCDacLoadPolicy(CDacLoadPolicy policy)
Expand Down
9 changes: 8 additions & 1 deletion src/SOS/Strike/strike.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13501,6 +13501,9 @@ static void DisplayCDacLoadPolicy()
case CDacLoadPolicy::PreferCDac:
cdacPolicy = "prefer";
break;
case CDacLoadPolicy::OnlyUseCDacForCoreClr:
cdacPolicy = "coreclr";
break;
default:
break;
}
Expand Down Expand Up @@ -13540,9 +13543,13 @@ DECLARE_API(runtimes)
{
policy = CDacLoadPolicy::PreferCDac;
}
else if (_stricmp(useCDac.data, "coreclr") == 0)
{
policy = CDacLoadPolicy::OnlyUseCDacForCoreClr;
}
else
{
ExtErr("Invalid --usecdac value '%s'. Expected true, false, or prefer.\n", useCDac.data);
ExtErr("Invalid --usecdac value '%s'. Expected true, false, prefer, or coreclr.\n", useCDac.data);
return E_INVALIDARG;
}
Runtime::SetCDacLoadPolicy(policy);
Expand Down
1 change: 1 addition & 0 deletions src/SOS/inc/runtime.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ IRuntime : public IUnknown
PreferCDac = 0,
OnlyUseCDac = 1,
UseLegacyDac = 2,
OnlyUseCDacForCoreClr = 3,
};

/// <summary>
Expand Down
2 changes: 1 addition & 1 deletion src/tests/SOS.UnitTests/SOSRunner.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1159,7 +1159,7 @@ public async Task LoadSosExtension()
// selects the legacy DAC so DOTNET_ENABLE_CDAC affects only the DAC-hosted contract reader.
string cdacPolicyCommand = _config.DacMode switch
{
DacMode.CDac => "runtimes --usecdac true", // Force the standalone cDAC next to sos.dll.
DacMode.CDac => "runtimes --usecdac coreclr", // Require the standalone cDAC for CoreCLR and allow DAC fallback for other runtimes.
DacMode.CDacVerify or DacMode.Dac => "runtimes --usecdac false", // Force the legacy in-box DAC.
_ => null,
};
Expand Down
Loading