Adding GetObjectComWrappers cDAC API#125846
Conversation
|
Tagging subscribers to this area: @steveisok, @tommcdon, @dotnet/dotnet-diag |
There was a problem hiding this comment.
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
ConditionalWeakTablecontract (incl. GC dependent-handle “extra info” access) and implementComWrappersAPIs 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
left a comment
There was a problem hiding this comment.
Generally, looks good! Just a few pieces of feedback.
Removed comment about cDAC dependencies in ConditionalWeakTable_1.
There was a problem hiding this comment.
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)
No description provided.