Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
043157d
cDAC: Add no-fallback mode via CDAC_NO_FALLBACK env var
max-charlamb Apr 14, 2026
ede7a70
cDAC: Always delegate ICLRDataEnumMemoryRegions to legacy DAC
max-charlamb Apr 15, 2026
5b89ccc
Revert crosscomp.h changes
max-charlamb Apr 15, 2026
cd48474
cDAC: Fix AuxiliarySymbolInfo.Address type to CodePointer
max-charlamb Apr 15, 2026
bf0cb57
Replace binary no-fallback switch with granular LegacyFallbackHelper
max-charlamb Apr 16, 2026
dc569ce
Fix allowlist to use nameof and correct method name
max-charlamb Apr 16, 2026
352cf06
Simplify CreateDacDbiInterface to match CreateSosInterface pattern
max-charlamb Apr 16, 2026
5172453
Gate IMetaDataImport QI fallback through LegacyFallbackHelper
max-charlamb Apr 16, 2026
b7f57b0
Track blocked fallback calls and log on process exit
max-charlamb Apr 16, 2026
3839a5d
Allowlist GetInterface QI, switch blocked fallback logging to stderr
max-charlamb Apr 16, 2026
8723a34
Log every fallback attempt (allowed and blocked) to stderr
max-charlamb Apr 16, 2026
dd401b3
Allowlist remaining blocked APIs and add file-level DBI allowlist
max-charlamb Apr 17, 2026
bee8db9
Use -noFallback flag in CI and remove unnecessary try/catch
max-charlamb Apr 17, 2026
f29fd2e
Address PR review feedback
max-charlamb Apr 17, 2026
8ec4bef
Remove unused _prevent_release field from DacDbiImpl
max-charlamb Apr 17, 2026
4884646
Revert datadescriptor.inc and restore CanFallback check ordering
max-charlamb Apr 17, 2026
38cf507
Fix AuxiliarySymbolInfo.Address type to CodePointer
max-charlamb Apr 17, 2026
17974c6
Remove AggressiveInlining from CanFallback
max-charlamb Apr 17, 2026
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
6 changes: 6 additions & 0 deletions eng/pipelines/diagnostics/runtime-diag-job.yml
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ parameters:
disableComponentGovernance: ''
liveRuntimeDir: ''
useCdac: false
noFallback: false
classFilter: ''

jobs:
Expand Down Expand Up @@ -89,6 +90,7 @@ jobs:
- _TestArgs: '-test'
- _Cross: ''
- _CdacArgs: ''
- _NoFallbackArgs: ''
- _ClassFilterArgs: ''

- _buildScript: $(Build.SourcesDirectory)$(dir)build$(scriptExt)
Expand All @@ -105,6 +107,9 @@ jobs:
- ${{ if eq(parameters.useCdac, 'true') }}:
- _CdacArgs: '-useCdac'

- ${{ if eq(parameters.noFallback, 'true') }}:
- _NoFallbackArgs: '-noFallback'

- ${{ if ne(parameters.classFilter, '') }}:
- _ClassFilterArgs: '-classfilter ${{ parameters.classFilter }}'

Expand Down Expand Up @@ -201,6 +206,7 @@ jobs:
-architecture ${{ parameters.archType }}
-privatebuild
$(_CdacArgs)
$(_NoFallbackArgs)
-liveRuntimeDir ${{ parameters.liveRuntimeDir }}
$(_TestArgs)
$(_Cross)
Expand Down
54 changes: 54 additions & 0 deletions eng/pipelines/runtime-diagnostics.yml
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,60 @@ extends:
displayName: 'Publish Test Results and SOS Logs'
continueOnError: true
condition: failed()
- template: /eng/pipelines/common/platform-matrix.yml
parameters:
jobTemplate: /eng/pipelines/diagnostics/runtime-diag-job.yml
buildConfig: release
platforms:
- windows_x64
# Workaround: microsoft/azure-pipelines-tasks#21871
variables:
- name: AllowPtrToDetectTestRunRetryFiles
value: false
jobParameters:
name: cDAC_no_fallback
useCdac: true
noFallback: true
classFilter: SOS
isOfficialBuild: ${{ variables.isOfficialBuild }}
liveRuntimeDir: $(Build.SourcesDirectory)/artifacts/runtime
timeoutInMinutes: 360
Comment thread
max-charlamb marked this conversation as resolved.
dependsOn:
- build_windows_x64_release_AllSubsets_CoreCLR
preBuildSteps:
- template: /eng/pipelines/common/download-artifact-step.yml
parameters:
artifactName: BuildArtifacts_$(osGroup)$(osSubgroup)_$(archType)_$(_BuildConfig)_coreclr
artifactFileName: BuildArtifacts_$(osGroup)$(osSubgroup)_$(archType)_$(_BuildConfig)_coreclr$(archiveExtension)
unpackFolder: $(Build.SourcesDirectory)/artifacts/runtime
displayName: 'Runtime Build Artifacts'
postBuildSteps:
- task: PublishTestResults@2
inputs:
testResultsFormat: xUnit
testResultsFiles: '**/*.xml'
searchFolder: '$(Build.SourcesDirectory)/artifacts/TestResults'
testRunTitle: 'Tests $(_PhaseName)'
failTaskOnFailedTests: true
publishRunAttachments: true
mergeTestResults: true
buildConfiguration: $(_BuildConfig)
continueOnError: true
condition: always()
- task: PublishPipelineArtifact@1
inputs:
targetPath: '$(Build.SourcesDirectory)/artifacts/tmp/$(_BuildConfig)/dumps'
artifactName: 'Dumps_cDAC_no_fallback_$(osGroup)$(osSubgroup)_$(archType)_$(_BuildConfig)_Attempt$(System.JobAttempt)'
displayName: 'Publish Crash Dumps'
continueOnError: true
condition: failed()
- task: PublishPipelineArtifact@1
inputs:
targetPath: '$(Build.SourcesDirectory)/artifacts/TestResults'
artifactName: 'TestResults_cDAC_no_fallback_$(osGroup)$(osSubgroup)_$(archType)_$(_BuildConfig)_Attempt$(System.JobAttempt)'
displayName: 'Publish Test Results and SOS Logs'
continueOnError: true
condition: failed()
- template: /eng/pipelines/common/platform-matrix.yml
parameters:
jobTemplate: /eng/pipelines/diagnostics/runtime-diag-job.yml
Expand Down
2 changes: 1 addition & 1 deletion src/coreclr/vm/datadescriptor/datadescriptor.inc
Original file line number Diff line number Diff line change
Expand Up @@ -1274,7 +1274,7 @@ CDAC_TYPE_END(SyncBlockCache)

CDAC_TYPE_BEGIN(AuxiliarySymbolInfo)
CDAC_TYPE_SIZE(sizeof(VMAUXILIARYSYMBOLDEF))
CDAC_TYPE_FIELD(AuxiliarySymbolInfo, T_POINTER, Address, offsetof(VMAUXILIARYSYMBOLDEF, pfnAuxiliarySymbol))
CDAC_TYPE_FIELD(AuxiliarySymbolInfo, TYPE(CodePointer), Address, offsetof(VMAUXILIARYSYMBOLDEF, pfnAuxiliarySymbol))
CDAC_TYPE_FIELD(AuxiliarySymbolInfo, T_POINTER, Name, offsetof(VMAUXILIARYSYMBOLDEF, name))
CDAC_TYPE_END(AuxiliarySymbolInfo)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public ClrDataAppDomain(Target target, TargetPointer appDomain, IXCLRDataAppDoma
}

int IXCLRDataAppDomain.GetProcess(DacComNullableByRef<IXCLRDataProcess> process)
=> _legacyImpl is not null ? _legacyImpl.GetProcess(process) : HResults.E_NOTIMPL;
=> LegacyFallbackHelper.CanFallback() && _legacyImpl is not null ? _legacyImpl.GetProcess(process) : HResults.E_NOTIMPL;

int IXCLRDataAppDomain.GetName(uint bufLen, uint* nameLen, char* name)
{
Expand Down Expand Up @@ -181,8 +181,8 @@ int IXCLRDataAppDomain.IsSameObject(IXCLRDataAppDomain* appDomain)
}

int IXCLRDataAppDomain.GetManagedObject(DacComNullableByRef<IXCLRDataValue> value)
=> _legacyImpl is not null ? _legacyImpl.GetManagedObject(value) : HResults.E_NOTIMPL;
=> LegacyFallbackHelper.CanFallback() && _legacyImpl is not null ? _legacyImpl.GetManagedObject(value) : HResults.E_NOTIMPL;

int IXCLRDataAppDomain.Request(uint reqCode, uint inBufferSize, byte* inBuffer, uint outBufferSize, byte* outBuffer)
=> _legacyImpl is not null ? _legacyImpl.Request(reqCode, inBufferSize, inBuffer, outBufferSize, outBuffer) : HResults.E_NOTIMPL;
=> LegacyFallbackHelper.CanFallback() && _legacyImpl is not null ? _legacyImpl.Request(reqCode, inBufferSize, inBuffer, outBufferSize, outBuffer) : HResults.E_NOTIMPL;
}
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ int IXCLRDataExceptionState.GetPrevious(DacComNullableByRef<IXCLRDataExceptionSt
}

int IXCLRDataExceptionState.GetManagedObject(DacComNullableByRef<IXCLRDataValue> value)
=> _legacyImpl is not null ? _legacyImpl.GetManagedObject(value) : HResults.E_NOTIMPL;
=> LegacyFallbackHelper.CanFallback() && _legacyImpl is not null ? _legacyImpl.GetManagedObject(value) : HResults.E_NOTIMPL;

int IXCLRDataExceptionState.GetBaseType(/*CLRDataBaseExceptionType*/ uint* type) => HResults.E_NOTIMPL;

Expand Down Expand Up @@ -213,9 +213,9 @@ int IXCLRDataExceptionState.Request(uint reqCode, uint inBufferSize, byte* inBuf
}

int IXCLRDataExceptionState.IsSameState(EXCEPTION_RECORD64* exRecord, uint contextSize, byte* cxRecord)
=> _legacyImpl is not null ? _legacyImpl.IsSameState(exRecord, contextSize, cxRecord) : HResults.E_NOTIMPL;
=> LegacyFallbackHelper.CanFallback() && _legacyImpl is not null ? _legacyImpl.IsSameState(exRecord, contextSize, cxRecord) : HResults.E_NOTIMPL;
int IXCLRDataExceptionState.IsSameState2(uint flags, EXCEPTION_RECORD64* exRecord, uint contextSize, byte* cxRecord)
=> _legacyImpl is not null ? _legacyImpl.IsSameState2(flags, exRecord, contextSize, cxRecord) : HResults.E_NOTIMPL;
=> LegacyFallbackHelper.CanFallback() && _legacyImpl is not null ? _legacyImpl.IsSameState2(flags, exRecord, contextSize, cxRecord) : HResults.E_NOTIMPL;
int IXCLRDataExceptionState.GetTask(DacComNullableByRef<IXCLRDataTask> task)
{
int hr = HResults.S_OK, hrLocal = HResults.S_OK;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ public ClrDataFrame(Target target, IStackDataFrameHandle dataFrame, IXCLRDataFra

// IXCLRDataFrame implementation
int IXCLRDataFrame.GetFrameType(uint* simpleType, uint* detailedType)
=> _legacyImpl is not null ? _legacyImpl.GetFrameType(simpleType, detailedType) : HResults.E_NOTIMPL;
=> LegacyFallbackHelper.CanFallback() && _legacyImpl is not null ? _legacyImpl.GetFrameType(simpleType, detailedType) : HResults.E_NOTIMPL;

int IXCLRDataFrame.GetContext(
uint contextFlags,
Expand Down Expand Up @@ -332,7 +332,7 @@ int IXCLRDataFrame.GetCodeName(
uint bufLen,
uint* nameLen,
char* nameBuf)
=> _legacyImpl is not null ? _legacyImpl.GetCodeName(flags, bufLen, nameLen, nameBuf) : HResults.E_NOTIMPL;
=> LegacyFallbackHelper.CanFallback() && _legacyImpl is not null ? _legacyImpl.GetCodeName(flags, bufLen, nameLen, nameBuf) : HResults.E_NOTIMPL;

int IXCLRDataFrame.GetMethodInstance(DacComNullableByRef<IXCLRDataMethodInstance> method)
{
Expand Down Expand Up @@ -384,17 +384,17 @@ int IXCLRDataFrame.Request(
byte* inBuffer,
uint outBufferSize,
byte* outBuffer)
=> _legacyImpl is not null ? _legacyImpl.Request(reqCode, inBufferSize, inBuffer, outBufferSize, outBuffer) : HResults.E_NOTIMPL;
=> LegacyFallbackHelper.CanFallback() && _legacyImpl is not null ? _legacyImpl.Request(reqCode, inBufferSize, inBuffer, outBufferSize, outBuffer) : HResults.E_NOTIMPL;

int IXCLRDataFrame.GetNumTypeArguments(uint* numTypeArgs)
=> _legacyImpl is not null ? _legacyImpl.GetNumTypeArguments(numTypeArgs) : HResults.E_NOTIMPL;
=> LegacyFallbackHelper.CanFallback() && _legacyImpl is not null ? _legacyImpl.GetNumTypeArguments(numTypeArgs) : HResults.E_NOTIMPL;

int IXCLRDataFrame.GetTypeArgumentByIndex(uint index, DacComNullableByRef<IXCLRDataTypeInstance> typeArg)
=> _legacyImpl is not null ? _legacyImpl.GetTypeArgumentByIndex(index, typeArg) : HResults.E_NOTIMPL;
=> LegacyFallbackHelper.CanFallback() && _legacyImpl is not null ? _legacyImpl.GetTypeArgumentByIndex(index, typeArg) : HResults.E_NOTIMPL;

// IXCLRDataFrame2 implementation
int IXCLRDataFrame2.GetExactGenericArgsToken(DacComNullableByRef<IXCLRDataValue> genericToken)
=> _legacyImpl2 is not null ? _legacyImpl2.GetExactGenericArgsToken(genericToken) : HResults.E_NOTIMPL;
=> LegacyFallbackHelper.CanFallback() && _legacyImpl2 is not null ? _legacyImpl2.GetExactGenericArgsToken(genericToken) : HResults.E_NOTIMPL;

// ========== Metadata resolution helpers ==========

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,19 +27,19 @@ public ClrDataMethodDefinition(
_legacyImpl = legacyImpl;
}
int IXCLRDataMethodDefinition.GetTypeDefinition(DacComNullableByRef<IXCLRDataTypeDefinition> typeDefinition)
=> _legacyImpl is not null ? _legacyImpl.GetTypeDefinition(typeDefinition) : HResults.E_NOTIMPL;
=> LegacyFallbackHelper.CanFallback() && _legacyImpl is not null ? _legacyImpl.GetTypeDefinition(typeDefinition) : HResults.E_NOTIMPL;

int IXCLRDataMethodDefinition.StartEnumInstances(IXCLRDataAppDomain? appDomain, ulong* handle)
=> _legacyImpl is not null ? _legacyImpl.StartEnumInstances(appDomain, handle) : HResults.E_NOTIMPL;
=> LegacyFallbackHelper.CanFallback() && _legacyImpl is not null ? _legacyImpl.StartEnumInstances(appDomain, handle) : HResults.E_NOTIMPL;

int IXCLRDataMethodDefinition.EnumInstance(ulong* handle, DacComNullableByRef<IXCLRDataMethodInstance> instance)
=> _legacyImpl is not null ? _legacyImpl.EnumInstance(handle, instance) : HResults.E_NOTIMPL;
=> LegacyFallbackHelper.CanFallback() && _legacyImpl is not null ? _legacyImpl.EnumInstance(handle, instance) : HResults.E_NOTIMPL;

int IXCLRDataMethodDefinition.EndEnumInstances(ulong handle)
=> _legacyImpl is not null ? _legacyImpl.EndEnumInstances(handle) : HResults.E_NOTIMPL;
=> LegacyFallbackHelper.CanFallback() && _legacyImpl is not null ? _legacyImpl.EndEnumInstances(handle) : HResults.E_NOTIMPL;

int IXCLRDataMethodDefinition.GetName(uint flags, uint bufLen, uint* nameLen, char* name)
=> _legacyImpl is not null ? _legacyImpl.GetName(flags, bufLen, nameLen, name) : HResults.E_NOTIMPL;
=> LegacyFallbackHelper.CanFallback() && _legacyImpl is not null ? _legacyImpl.GetName(flags, bufLen, nameLen, name) : HResults.E_NOTIMPL;

int IXCLRDataMethodDefinition.GetTokenAndScope(uint* token, DacComNullableByRef<IXCLRDataModule> mod)
{
Expand Down Expand Up @@ -93,35 +93,35 @@ int IXCLRDataMethodDefinition.GetTokenAndScope(uint* token, DacComNullableByRef<
}

int IXCLRDataMethodDefinition.GetFlags(uint* flags)
=> _legacyImpl is not null ? _legacyImpl.GetFlags(flags) : HResults.E_NOTIMPL;
=> LegacyFallbackHelper.CanFallback() && _legacyImpl is not null ? _legacyImpl.GetFlags(flags) : HResults.E_NOTIMPL;

int IXCLRDataMethodDefinition.IsSameObject(IXCLRDataMethodDefinition? method)
=> _legacyImpl is not null ? _legacyImpl.IsSameObject(method) : HResults.E_NOTIMPL;
=> LegacyFallbackHelper.CanFallback() && _legacyImpl is not null ? _legacyImpl.IsSameObject(method) : HResults.E_NOTIMPL;

int IXCLRDataMethodDefinition.GetLatestEnCVersion(uint* version)
=> _legacyImpl is not null ? _legacyImpl.GetLatestEnCVersion(version) : HResults.E_NOTIMPL;
=> LegacyFallbackHelper.CanFallback() && _legacyImpl is not null ? _legacyImpl.GetLatestEnCVersion(version) : HResults.E_NOTIMPL;

int IXCLRDataMethodDefinition.StartEnumExtents(ulong* handle)
=> _legacyImpl is not null ? _legacyImpl.StartEnumExtents(handle) : HResults.E_NOTIMPL;
=> LegacyFallbackHelper.CanFallback() && _legacyImpl is not null ? _legacyImpl.StartEnumExtents(handle) : HResults.E_NOTIMPL;

int IXCLRDataMethodDefinition.EnumExtent(ulong* handle, ClrDataMethodDefinitionExtent* extent)
=> _legacyImpl is not null ? _legacyImpl.EnumExtent(handle, extent) : HResults.E_NOTIMPL;
=> LegacyFallbackHelper.CanFallback() && _legacyImpl is not null ? _legacyImpl.EnumExtent(handle, extent) : HResults.E_NOTIMPL;

int IXCLRDataMethodDefinition.EndEnumExtents(ulong handle)
=> _legacyImpl is not null ? _legacyImpl.EndEnumExtents(handle) : HResults.E_NOTIMPL;
=> LegacyFallbackHelper.CanFallback() && _legacyImpl is not null ? _legacyImpl.EndEnumExtents(handle) : HResults.E_NOTIMPL;

int IXCLRDataMethodDefinition.GetCodeNotification(uint* flags)
=> _legacyImpl is not null ? _legacyImpl.GetCodeNotification(flags) : HResults.E_NOTIMPL;
=> LegacyFallbackHelper.CanFallback() && _legacyImpl is not null ? _legacyImpl.GetCodeNotification(flags) : HResults.E_NOTIMPL;

int IXCLRDataMethodDefinition.SetCodeNotification(uint flags)
=> _legacyImpl is not null ? _legacyImpl.SetCodeNotification(flags) : HResults.E_NOTIMPL;
=> LegacyFallbackHelper.CanFallback() && _legacyImpl is not null ? _legacyImpl.SetCodeNotification(flags) : HResults.E_NOTIMPL;

int IXCLRDataMethodDefinition.Request(uint reqCode, uint inBufferSize, byte* inBuffer, uint outBufferSize, byte* outBuffer)
=> _legacyImpl is not null ? _legacyImpl.Request(reqCode, inBufferSize, inBuffer, outBufferSize, outBuffer) : HResults.E_NOTIMPL;
=> LegacyFallbackHelper.CanFallback() && _legacyImpl is not null ? _legacyImpl.Request(reqCode, inBufferSize, inBuffer, outBufferSize, outBuffer) : HResults.E_NOTIMPL;

int IXCLRDataMethodDefinition.GetRepresentativeEntryAddress(ClrDataAddress* addr)
=> _legacyImpl is not null ? _legacyImpl.GetRepresentativeEntryAddress(addr) : HResults.E_NOTIMPL;
=> LegacyFallbackHelper.CanFallback() && _legacyImpl is not null ? _legacyImpl.GetRepresentativeEntryAddress(addr) : HResults.E_NOTIMPL;

int IXCLRDataMethodDefinition.HasClassOrMethodInstantiation(int* bGeneric)
=> _legacyImpl is not null ? _legacyImpl.HasClassOrMethodInstantiation(bGeneric) : HResults.E_NOTIMPL;
=> LegacyFallbackHelper.CanFallback() && _legacyImpl is not null ? _legacyImpl.HasClassOrMethodInstantiation(bGeneric) : HResults.E_NOTIMPL;
}
Loading
Loading