diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataStackWalk.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataStackWalk.cs index c9c682d988a8ab..80b1c3e99f43c0 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataStackWalk.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataStackWalk.cs @@ -15,7 +15,7 @@ namespace Microsoft.Diagnostics.DataContractReader.Legacy; public sealed unsafe partial class ClrDataStackWalk : IXCLRDataStackWalk { private readonly TargetPointer _threadAddr; - private readonly uint _flags; + private readonly CLRDataStackWalkFlag _flags; private readonly Target _target; private readonly IXCLRDataStackWalk? _legacyImpl; private readonly ThreadData _threadData; @@ -23,7 +23,7 @@ public sealed unsafe partial class ClrDataStackWalk : IXCLRDataStackWalk private bool _currentFrameIsValid; private IEnumerator _dataFrames; - public ClrDataStackWalk(TargetPointer threadAddr, uint flags, Target target, IXCLRDataStackWalk? legacyImpl) + public ClrDataStackWalk(TargetPointer threadAddr, CLRDataStackWalkFlag flags, Target target, IXCLRDataStackWalk? legacyImpl) { _threadAddr = threadAddr; _flags = flags; @@ -54,10 +54,10 @@ private bool MoveNextLegacyVisible() return false; } - internal static bool IsLegacyVisible(IStackDataFrameHandle frame) + internal bool IsLegacyVisible(IStackDataFrameHandle frame) => frame.State is StackWalkState.Frameless - or StackWalkState.Frame - or StackWalkState.SkippedFrame; + || ((_flags & CLRDataStackWalkFlag.CLRDATA_SIMPFRAME_RUNTIME_UNMANAGED_CODE) != 0 + && frame.State is StackWalkState.Frame or StackWalkState.SkippedFrame); private void Reseed(byte[] context, bool isFirst) { diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataTask.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataTask.cs index f425cffa2e7f7d..d774e44e582a87 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataTask.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataTask.cs @@ -66,7 +66,7 @@ int IXCLRDataTask.GetDesiredExecutionState(uint* state) int IXCLRDataTask.SetDesiredExecutionState(uint state) => HResults.E_NOTIMPL; - int IXCLRDataTask.CreateStackWalk(uint flags, DacComNullableByRef stackWalk) + int IXCLRDataTask.CreateStackWalk(CLRDataStackWalkFlag flags, DacComNullableByRef stackWalk) { Contracts.ThreadData threadData = _target.Contracts.Thread.GetThreadData(_address); if (threadData.State.HasFlag(Contracts.ThreadState.Unstarted)) diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/IXCLRData.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/IXCLRData.cs index 45ac79081e971d..84a679ecc60c94 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/IXCLRData.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/IXCLRData.cs @@ -520,7 +520,7 @@ public unsafe partial interface IXCLRDataTask int SetDesiredExecutionState(uint state); [PreserveSig] - int CreateStackWalk(uint flags, DacComNullableByRef stackWalk); + int CreateStackWalk(CLRDataStackWalkFlag flags, DacComNullableByRef stackWalk); [PreserveSig] int GetOSThreadID(uint* id); @@ -996,6 +996,12 @@ public enum CLRDataStackWalkRequest : uint CLRDATA_STACK_WALK_REQUEST_SET_FIRST_FRAME = 0xe1000000, } +[Flags] +public enum CLRDataStackWalkFlag : uint +{ + CLRDATA_SIMPFRAME_RUNTIME_UNMANAGED_CODE = 0x8, +} + [Flags] public enum CLRDataStackSetContextFlag : uint {