diff --git a/docs/design/datacontracts/Thread.md b/docs/design/datacontracts/Thread.md index f2ad63e4e7ab65..b23c40e7f93377 100644 --- a/docs/design/datacontracts/Thread.md +++ b/docs/design/datacontracts/Thread.md @@ -302,7 +302,11 @@ TargetPointer IThread.GetThreadLocalStaticBase(TargetPointer threadPointer, Targ if (collectibleCount > indexOffset) { TargetPointer collectibleArray = target.ReadPointer(threadLocalDataPtr + /* ThreadLocalData::CollectibleTlsArrayData offset */); - threadLocalStaticBase = target.ReadPointer(collectibleArray + (ulong)(indexOffset * target.PointerSize)); + // The collectible TLS array slot holds an OBJECTHANDLE; dereference the handle to the object + TargetPointer handleSlotAddress = collectibleArray + (ulong)(indexOffset * target.PointerSize); + TargetPointer handle = target.ReadPointer(handleSlotAddress); + if (handle != TargetPointer.Null && target.TryReadPointer(handle, out TargetPointer obj)) + threadLocalStaticBase = obj; } break; case TLSIndexType.DirectOnThreadLocalData: diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Thread_1.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Thread_1.cs index 56471abe6389fb..3ab8573b78f074 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Thread_1.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Thread_1.cs @@ -216,7 +216,8 @@ TargetPointer IThread.GetThreadLocalStaticBase(TargetPointer threadPointer, Targ if (collectibleCount > indexOffset) { TargetPointer collectibleArray = threadLocalData.CollectibleTlsArrayData; - threadLocalStaticBase = _target.ReadPointer(collectibleArray + (ulong)(indexOffset * _target.PointerSize)); + TargetPointer handleSlotAddress = collectibleArray + (ulong)(indexOffset * _target.PointerSize); + threadLocalStaticBase = _target.ProcessedData.GetOrAdd(handleSlotAddress).Object; } break; case TLSIndexType.DirectOnThreadLocalData: