Skip to content

Adding GetObjectComWrappers cDAC API#125846

Merged
rcj1 merged 11 commits into
dotnet:mainfrom
rcj1:GetObjectComWrappersData
Mar 21, 2026
Merged

Adding GetObjectComWrappers cDAC API#125846
rcj1 merged 11 commits into
dotnet:mainfrom
rcj1:GetObjectComWrappersData

Conversation

@rcj1

@rcj1 rcj1 commented Mar 20, 2026

Copy link
Copy Markdown
Contributor

No description provided.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @tommcdon, @dotnet/dotnet-diag
See info in area-owners.md if you want to be subscribed.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds cDAC surface area needed to query ComWrappers state for a managed object (RCW + MOWs) by introducing a ConditionalWeakTable contract and supporting runtime/type-system plumbing, plus dump-based integration coverage.

Changes:

  • Extend cDAC object/syncblock modeling to read object header sync-block state and expose TryGetHashCode.
  • Add ConditionalWeakTable contract (incl. GC dependent-handle “extra info” access) and implement ComWrappers APIs to retrieve MOWs and RCWs for an object.
  • Add dump-test debuggee + integration tests, and wire the new support into legacy SOS DAC interop (GetObjectComWrappersData).

Reviewed changes

Copilot reviewed 51 out of 51 changed files in this pull request and generated no comments.

Show a summary per file
File Description
src/native/managed/cdac/tests/MockDescriptors/MockDescriptors.cs Adds mock ObjectHeader type and SyncBlock.HashCode field for unit-test targets.
src/native/managed/cdac/tests/MockDescriptors/MockDescriptors.Object.cs Updates mock globals/types to use ObjectHeader sizing and adds sync-block hash mask global.
src/native/managed/cdac/tests/MockDescriptors/MockDescriptors.GC.cs Adds HandleSegmentSize global to mock GC heap builders for new handle-extra-info logic.
src/native/managed/cdac/tests/DumpTests/README.md Documents new ComWrappers dump-test scenario and mapping.
src/native/managed/cdac/tests/DumpTests/Debuggees/ComWrappers/Program.cs New debuggee that creates one MOW + one RCW via ComWrappers then crashes for dump capture.
src/native/managed/cdac/tests/DumpTests/Debuggees/ComWrappers/ComWrappers.csproj Declares debuggee dump type (Full).
src/native/managed/cdac/tests/DumpTests/ComWrappersDumpTests.cs New dump-based integration tests for GetMOWs and GetComWrappersRCWForObject.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader/CachingContractRegistry.cs Registers the new IConditionalWeakTable factory.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs Implements ISOSDacInterface10.GetObjectComWrappersData using new contracts (and debug-validates against legacy impl in DEBUG).
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ISOSDacInterface.cs Updates GetObjectComWrappersData signature to array-based marshalling.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/SyncBlock.cs Adds HashCode field readout from SyncBlock.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/ObjectHeader.cs New data model to read SyncBlockValue from object header.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/ManagedObjectWrapperLayout.cs Expands MOW layout reads with flags, user-defined entries, dispatch section.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/ManagedObjectWrapperHolderObject.cs Adds Wrapper pointer field for holder object.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/InternalComInterfaceDispatch.cs New data model for dispatch blocks used to compute COM identity pointers.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/ConditionalWeakTableObject.cs New data model for the managed CWT object.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/ConditionalWeakTableEntry.cs New data model for CWT entries (hash/next/dep-handle).
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/ConditionalWeakTableContainerObject.cs New data model for the CWT container (buckets/entries arrays).
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/ComInterfaceEntry.cs New data model for reading GUID IID entries in user-defined COM interface table.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/Array.cs Exposes DataPointer for array element base address.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/RuntimeTypeSystem_1.cs Adds FieldDesc RVA flag + static-address resolution API (incl. dynamic/big RVA handling).
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Object_1.cs Uses ObjectHeader type info instead of ObjectHeaderSize global; adds TryGetHashCode.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ObjectFactory.cs Plumbs sync-block bitmasks into Object_1.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Loader_1.cs Adds GetFieldAddressFromRva and refactors RVA resolution helper.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GC/GC_1.cs Adds dependent-handle “extra info” lookup (GetHandleExtraInfo).
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/GC/GCFactory.cs Plumbs HandleSegmentSize into GC_1.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ConditionalWeakTable_1.cs New contract implementation to look up CWT value by key identity using dep-handles.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ConditionalWeakTableFactory.cs New factory for IConditionalWeakTable.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ComWrappers_1.cs Implements GetMOWs, GetIdentityForMOW, and GetComWrappersRCWForObject using RTS + CWT.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Constants.cs Removes ObjectHeaderSize; adds globals for hash-code mask, dynamic RVA, handle segment size.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/DataType.cs Adds new data types (ObjectHeader, ComWrappers-related, CWT-related).
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Contracts/IRuntimeTypeSystem.cs Adds GetFieldDescStaticAddress API to abstractions.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Contracts/IObject.cs Adds TryGetHashCode API.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Contracts/ILoader.cs Adds GetFieldAddressFromRva API.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Contracts/IGC.cs Adds GetHandleExtraInfo API.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Contracts/IConditionalWeakTable.cs Introduces IConditionalWeakTable contract abstraction.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Contracts/IComWrappers.cs Extends contract surface with MOW/RCW lookup and identity retrieval APIs.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/ContractRegistry.cs Adds ConditionalWeakTable accessor to registry.
src/coreclr/vm/syncblk.h Adds SyncBlock.m_dwHashCode field to cDAC layout.
src/coreclr/vm/interoplibinterface_comwrappers.h Adds ManagedObjectWrapperHolderObject::_wrapper field to cDAC layout.
src/coreclr/vm/datadescriptor/datadescriptor.inc Adds new types/globals/contracts for ObjectHeader, CWT, ComWrappers dispatch data; removes ObjectHeaderSize global.
src/coreclr/vm/datadescriptor/datadescriptor.h Includes conditionalweaktable.h for new cDAC data exposure.
src/coreclr/vm/conditionalweaktable.h Exposes cDAC layout metadata for CWT container/object and entry details.
src/coreclr/interop/inc/interoplibabi.h Adds cDAC offsets for new ComWrappers ABI structs/fields.
src/coreclr/interop/inc/interoplib.h Annotates CallerDefinedIUnknown constant as contract-dependent.
src/coreclr/gc/datadescriptor/datadescriptor.inc Adds HandleSegmentSize global for handle-table segment computations.
docs/design/datacontracts/Object.md Documents TryGetHashCode and required descriptors/globals.
docs/design/datacontracts/Loader.md Documents GetFieldAddressFromRva API and RVA helper behavior.
docs/design/datacontracts/GC.md Documents GetHandleExtraInfo API and required globals.
docs/design/datacontracts/ConditionalWeakTable.md New contract design doc for CWT lookup via dependent handles.
docs/design/datacontracts/ComWrappers.md Documents new ComWrappers contract APIs and descriptor dependencies.

@jkoritzinsky jkoritzinsky left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Generally, looks good! Just a few pieces of feedback.

Comment thread src/coreclr/vm/conditionalweaktable.h
Comment thread docs/design/datacontracts/Object.md Outdated
Copilot AI review requested due to automatic review settings March 20, 2026 23:23
Removed comment about cDAC dependencies in ConditionalWeakTable_1.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 50 out of 50 changed files in this pull request and generated 4 comments.

@noahfalk noahfalk left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

Copilot AI review requested due to automatic review settings March 21, 2026 14:05

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 50 out of 50 changed files in this pull request and generated 6 comments.

Comment thread src/native/managed/cdac/tests/DumpTests/ComWrappersDumpTests.cs
Copilot AI review requested due to automatic review settings March 21, 2026 14:36

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 50 out of 50 changed files in this pull request and generated 3 comments.

Comments suppressed due to low confidence (1)

src/coreclr/gc/datadescriptor/datadescriptor.inc:128

  • GC contract versioning: HandleSegmentSize is a new required global for the managed GC contract implementation (GetHandleExtraInfo) but the GC contract is still advertised as version 1 below. If older descriptors are expected to work with newer readers, this should be version-bumped (or the reader should treat HandleSegmentSize as optional and fall back).
CDAC_GLOBAL(HandleSegmentSize, /*uint32*/, HANDLE_SEGMENT_SIZE)
CDAC_GLOBAL(HandleBlocksPerSegment, /*uint32*/, HANDLE_BLOCKS_PER_SEGMENT)
CDAC_GLOBAL(HandleMaxInternalTypes, /*uint32*/, HANDLE_MAX_INTERNAL_TYPES)
CDAC_GLOBAL(HandlesPerBlock, /*uint32*/, HANDLE_HANDLES_PER_BLOCK)
CDAC_GLOBAL(BlockInvalid, /*uint8*/, BLOCK_INVALID)

Comment thread src/coreclr/vm/datadescriptor/datadescriptor.inc
Copilot AI review requested due to automatic review settings March 21, 2026 15:18

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 50 out of 50 changed files in this pull request and generated no new comments.

@rcj1
rcj1 merged commit f416dc4 into dotnet:main Mar 21, 2026
160 checks passed
@rcj1
rcj1 deleted the GetObjectComWrappersData branch March 21, 2026 17:49
@github-actions github-actions Bot locked and limited conversation to collaborators Apr 21, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants