Description
Support filter flags in DAC stack walk API. These filters aren't used in SOS so this is low priority.
Flags:
enum CLRDataSimpleFrameType {
CLRDATA_SIMPFRAME_UNRECOGNIZED = 0x1,
CLRDATA_SIMPFRAME_MANAGED_METHOD = 0x2,
CLRDATA_SIMPFRAME_RUNTIME_MANAGED_CODE = 0x4,
CLRDATA_SIMPFRAME_RUNTIME_UNMANAGED_CODE = 0x8
} ;
I initially expected this to be relatively simple, managed methods corresponding to frameless methods and Frames corresponding to runtime code. However, the logic in SFI changes with the FUNCTIONSONLY
flag which is used if CLRDataSimpleFrameType = CLRDATA_SIMPFRAME_MANAGED_METHOD
.
This filters funclets but seems somewhat inconsistent.
Example
In the following example containing multiple exception handlers, the DAC filtering for only managed methods sometimes, but not always, skips these frames. This appears to be due to logic surrounding funclets and skipping to non-filtering funclets parents, but enumerating to filtering funclets parents.
Full Stackwalk
Highlighted lines are removed in the current DAC behavior.
OS Thread Id: 0xd474 (0)
Child SP IP Call Site
**0000008FC11C6818 00007ff81f87f7e4 [InlinedCallFrame: 0000008fc11c6818] Interop+Kernel32.g____PInvoke|43_0(IntPtr, Byte*, Int32, Int32*, IntPtr)**
**0000008FC11C6818 00007ffe4a340092 [InlinedCallFrame: 0000008fc11c6818] Interop+Kernel32.g____PInvoke|43_0(IntPtr, Byte*, Int32, Int32*, IntPtr)**
0000008FC11C67E0 00007ffe4a340092 Interop+Kernel32.ReadFile(IntPtr, Byte*, Int32, Int32 ByRef, IntPtr) [C:\Users\maxcharlamb\source\reposA\runtime\artifacts\obj\System.Console\Release\net10.0-windows\Microsoft.Interop.LibraryImportGenerator\Microsoft.Interop.LibraryImportGenerator\LibraryImports.g.cs @ 412]
0000008FC11C68C0 00007ffe4a33ff27 System.ConsolePal+WindowsConsoleStream.ReadFileNative(IntPtr, System.Span`1, Boolean, Int32 ByRef, Boolean) [C:\Users\maxcharlamb\source\reposA\runtime\src\libraries\System.Console\src\System\ConsolePal.Windows.cs @ 1223]
0000008FC11C6920 00007ffe4a33fe3b System.ConsolePal+WindowsConsoleStream.Read(System.Span`1) [C:\Users\maxcharlamb\source\reposA\runtime\src\libraries\System.Console\src\System\ConsolePal.Windows.cs @ 1181]
0000008FC11C6990 00007ffe4a33fd58 System.IO.ConsoleStream.Read(Byte[], Int32, Int32) [C:\Users\maxcharlamb\source\reposA\runtime\src\libraries\System.Console\src\System\IO\ConsoleStream.cs @ 34]
0000008FC11C69E0 00007ffea758c606 System.IO.StreamReader.ReadBuffer() [C:\Users\maxcharlamb\source\reposA\runtime\src\libraries\System.Private.CoreLib\src\System\IO\StreamReader.cs @ 611]
0000008FC11C6A40 00007ffea758cb93 System.IO.StreamReader.ReadLine() [C:\Users\maxcharlamb\source\reposA\runtime\src\libraries\System.Private.CoreLib\src\System\IO\StreamReader.cs @ 800]
0000008FC11C6B00 00007ffe4a33fc74 System.IO.SyncTextReader.ReadLine() [C:\Users\maxcharlamb\source\reposA\runtime\src\libraries\System.Console\src\System\IO\SyncTextReader.cs @ 77]
0000008FC11C6B60 00007ffe4a33f2bc System.Console.ReadLine() [C:\Users\maxcharlamb\source\reposA\runtime\src\libraries\System.Console\src\System\Console.cs @ 727]
0000008FC11C6BA0 00007ffe4a33df58 NibbleMapReplacement.C1.Block() [C:\Users\maxcharlamb\source\repos\NibbleMapReplacement\Program.cs @ 160]
0000008FC11C6C20 00007ffe4a340aeb NibbleMapReplacement.C1.M2() [C:\Users\maxcharlamb\source\repos\NibbleMapReplacement\Program.cs @ 50]
**0000008FC11C7160 00007ffea8ef51a9 [InlinedCallFrame: 0000008fc11c7160]**
**0000008FC11C7160 00007ffea74e9e83 [InlinedCallFrame: 0000008fc11c7160]**
**0000008FC11C7100 00007ffea74e9e83 System.Runtime.EH.DispatchEx(System.Runtime.StackFrameIterator ByRef, ExInfo ByRef) [C:\Users\maxcharlamb\source\reposA\runtime\src\coreclr\nativeaot\Runtime.Base\src\System\Runtime\ExceptionHandling.cs @ 948]**
**0000008FC11C7240 00007ffea74e97f9 System.Runtime.EH.RhThrowEx(System.Object, ExInfo ByRef) [C:\Users\maxcharlamb\source\reposA\runtime\src\coreclr\nativeaot\Runtime.Base\src\System\Runtime\ExceptionHandling.cs @ 665]**
**0000008FC11C8DA0 00007ffea8ffea33 [SoftwareExceptionFrame: 0000008fc11c8da0]**
0000008FC11C9970 00007ffe4a340ac2 NibbleMapReplacement.C1.M2() [C:\Users\maxcharlamb\source\repos\NibbleMapReplacement\Program.cs @ 46]
0000008FC11C99C0 00007ffe4a340a22 NibbleMapReplacement.C1.F2(System.Exception) [C:\Users\maxcharlamb\source\repos\NibbleMapReplacement\Program.cs @ 153]
0000008FC11C9A00 00007ffe4a340974 NibbleMapReplacement.C1.M4() [C:\Users\maxcharlamb\source\repos\NibbleMapReplacement\Program.cs @ 72]
**0000008FC11C9EF0 00007ffea8ef5ea6 [InlinedCallFrame: 0000008fc11c9ef0]**
**0000008FC11C9EF0 00007ffea74ea16a [InlinedCallFrame: 0000008fc11c9ef0]**
0000008FC11C9EB0 00007ffea74ea16a System.Runtime.EH.FindFirstPassHandler(System.Object, UInt32, System.Runtime.StackFrameIterator ByRef, UInt32 ByRef, Byte* ByRef) [C:\Users\maxcharlamb\source\reposA\runtime\src\coreclr\nativeaot\Runtime.Base\src\System\Runtime\ExceptionHandling.cs @ 1092]
0000008FC11CA000 00007ffea74e9c4a System.Runtime.EH.DispatchEx(System.Runtime.StackFrameIterator ByRef, ExInfo ByRef) [C:\Users\maxcharlamb\source\reposA\runtime\src\coreclr\nativeaot\Runtime.Base\src\System\Runtime\ExceptionHandling.cs @ 807]
0000008FC11CA140 00007ffea74e97f9 System.Runtime.EH.RhThrowEx(System.Object, ExInfo ByRef) [C:\Users\maxcharlamb\source\reposA\runtime\src\coreclr\nativeaot\Runtime.Base\src\System\Runtime\ExceptionHandling.cs @ 665]
**0000008FC11CBCA0 00007ffea8ffea33 [SoftwareExceptionFrame: 0000008fc11cbca0]**
0000008FC11CC870 00007ffe4a340913 NibbleMapReplacement.C1.M4() [C:\Users\maxcharlamb\source\repos\NibbleMapReplacement\Program.cs @ 70]
0000008FC11CC8F0 00007ffe4a34084d NibbleMapReplacement.C1.U1(IntPtr, Int32) [C:\Users\maxcharlamb\source\repos\NibbleMapReplacement\Program.cs @ 138]
**0000008FC11CC988 00007ffe4a3406f2 [InlinedCallFrame: 0000008fc11cc988]**
**0000008FC11CC960 00007ffe4a3406f2 ILStubClass.IL_STUB_PInvoke(IntPtr, Int32)**
0000008FC11CCA40 00007ffe4a340612 NibbleMapReplacement.C1.M5() [C:\Users\maxcharlamb\source\repos\NibbleMapReplacement\Program.cs @ 82]
**0000008FC11CD350 00007ffea8ffea33 [InlinedCallFrame: 0000008fc11cd350]**
**0000008FC11CD350 00007ffea7523612 [InlinedCallFrame: 0000008fc11cd350]**
0000008FC11CD300 00007ffea7523612 System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(System.Object, IntPtr*) [C:\Users\maxcharlamb\source\reposA\runtime\src\coreclr\System.Private.CoreLib\src\System\Reflection\MethodBaseInvoker.CoreCLR.cs @ 36]
0000008FC11CD400 00007ffea7523724 System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(System.Object, System.Reflection.BindingFlags) [C:\Users\maxcharlamb\source\reposA\runtime\src\libraries\System.Private.CoreLib\src\System\Reflection\MethodBaseInvoker.cs @ 57]
0000008FC11CD450 00007ffea7534c6c System.Reflection.RuntimeMethodInfo.Invoke(System.Object, System.Reflection.BindingFlags, System.Reflection.Binder, System.Object[], System.Globalization.CultureInfo) [C:\Users\maxcharlamb\source\reposA\runtime\src\libraries\System.Private.CoreLib\src\System\Reflection\RuntimeMethodInfo.cs @ 126]
0000008FC11CD4C0 00007ffea7522f33 System.Reflection.MethodBase.Invoke(System.Object, System.Object[]) [C:\Users\maxcharlamb\source\reposA\runtime\src\libraries\System.Private.CoreLib\src\System\Reflection\MethodBase.cs @ 56]
0000008FC11CD500 00007ffe4a340570 NibbleMapReplacement.C1.M6() [C:\Users\maxcharlamb\source\repos\NibbleMapReplacement\Program.cs @ 89]
0000008FC11CD560 00007ffe4a33de35 NibbleMapReplacement.Program.Main(System.String[]) [C:\Users\maxcharlamb\source\repos\NibbleMapReplacement\Program.cs @ 25
Managed Only DAC Behavior
OS Thread Id: 0xd474 (0)
Child SP IP Call Site
0000008FC11C67E0 00007ffe4a340092 Interop+Kernel32.ReadFile(IntPtr, Byte*, Int32, Int32 ByRef, IntPtr) [C:\Users\maxcharlamb\source\reposA\runtime\artifacts\obj\System.Console\Release\net10.0-windows\Microsoft.Interop.LibraryImportGenerator\Microsoft.Interop.LibraryImportGenerator\LibraryImports.g.cs @ 412]
0000008FC11C68C0 00007ffe4a33ff27 System.ConsolePal+WindowsConsoleStream.ReadFileNative(IntPtr, System.Span`1, Boolean, Int32 ByRef, Boolean) [C:\Users\maxcharlamb\source\reposA\runtime\src\libraries\System.Console\src\System\ConsolePal.Windows.cs @ 1223]
0000008FC11C6920 00007ffe4a33fe3b System.ConsolePal+WindowsConsoleStream.Read(System.Span`1) [C:\Users\maxcharlamb\source\reposA\runtime\src\libraries\System.Console\src\System\ConsolePal.Windows.cs @ 1181]
0000008FC11C6990 00007ffe4a33fd58 System.IO.ConsoleStream.Read(Byte[], Int32, Int32) [C:\Users\maxcharlamb\source\reposA\runtime\src\libraries\System.Console\src\System\IO\ConsoleStream.cs @ 34]
0000008FC11C69E0 00007ffea758c606 System.IO.StreamReader.ReadBuffer() [C:\Users\maxcharlamb\source\reposA\runtime\src\libraries\System.Private.CoreLib\src\System\IO\StreamReader.cs @ 611]
0000008FC11C6A40 00007ffea758cb93 System.IO.StreamReader.ReadLine() [C:\Users\maxcharlamb\source\reposA\runtime\src\libraries\System.Private.CoreLib\src\System\IO\StreamReader.cs @ 800]
0000008FC11C6B00 00007ffe4a33fc74 System.IO.SyncTextReader.ReadLine() [C:\Users\maxcharlamb\source\reposA\runtime\src\libraries\System.Console\src\System\IO\SyncTextReader.cs @ 77]
0000008FC11C6B60 00007ffe4a33f2bc System.Console.ReadLine() [C:\Users\maxcharlamb\source\reposA\runtime\src\libraries\System.Console\src\System\Console.cs @ 727]
0000008FC11C6BA0 00007ffe4a33df58 NibbleMapReplacement.C1.Block() [C:\Users\maxcharlamb\source\repos\NibbleMapReplacement\Program.cs @ 160]
0000008FC11C9970 00007ffe4a340ac2 NibbleMapReplacement.C1.M2() [C:\Users\maxcharlamb\source\repos\NibbleMapReplacement\Program.cs @ 46]
0000008FC11C99C0 00007ffe4a340a22 NibbleMapReplacement.C1.F2(System.Exception) [C:\Users\maxcharlamb\source\repos\NibbleMapReplacement\Program.cs @ 153]
0000008FC11C9A00 00007ffe4a340974 NibbleMapReplacement.C1.M4() [C:\Users\maxcharlamb\source\repos\NibbleMapReplacement\Program.cs @ 72]
0000008FC11C9EB0 00007ffea74ea16a System.Runtime.EH.FindFirstPassHandler(System.Object, UInt32, System.Runtime.StackFrameIterator ByRef, UInt32 ByRef, Byte* ByRef) [C:\Users\maxcharlamb\source\reposA\runtime\src\coreclr\nativeaot\Runtime.Base\src\System\Runtime\ExceptionHandling.cs @ 1092]
0000008FC11CA000 00007ffea74e9c4a System.Runtime.EH.DispatchEx(System.Runtime.StackFrameIterator ByRef, ExInfo ByRef) [C:\Users\maxcharlamb\source\reposA\runtime\src\coreclr\nativeaot\Runtime.Base\src\System\Runtime\ExceptionHandling.cs @ 807]
0000008FC11CA140 00007ffea74e97f9 System.Runtime.EH.RhThrowEx(System.Object, ExInfo ByRef) [C:\Users\maxcharlamb\source\reposA\runtime\src\coreclr\nativeaot\Runtime.Base\src\System\Runtime\ExceptionHandling.cs @ 665]
0000008FC11CC870 00007ffe4a340913 NibbleMapReplacement.C1.M4() [C:\Users\maxcharlamb\source\repos\NibbleMapReplacement\Program.cs @ 70]
0000008FC11CC8F0 00007ffe4a34084d NibbleMapReplacement.C1.U1(IntPtr, Int32) [C:\Users\maxcharlamb\source\repos\NibbleMapReplacement\Program.cs @ 138]
0000008FC11CCA40 00007ffe4a340612 NibbleMapReplacement.C1.M5() [C:\Users\maxcharlamb\source\repos\NibbleMapReplacement\Program.cs @ 82]
0000008FC11CD300 00007ffea7523612 System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(System.Object, IntPtr*) [C:\Users\maxcharlamb\source\reposA\runtime\src\coreclr\System.Private.CoreLib\src\System\Reflection\MethodBaseInvoker.CoreCLR.cs @ 36]
0000008FC11CD400 00007ffea7523724 System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(System.Object, System.Reflection.BindingFlags) [C:\Users\maxcharlamb\source\reposA\runtime\src\libraries\System.Private.CoreLib\src\System\Reflection\MethodBaseInvoker.cs @ 57]
0000008FC11CD450 00007ffea7534c6c System.Reflection.RuntimeMethodInfo.Invoke(System.Object, System.Reflection.BindingFlags, System.Reflection.Binder, System.Object[], System.Globalization.CultureInfo) [C:\Users\maxcharlamb\source\reposA\runtime\src\libraries\System.Private.CoreLib\src\System\Reflection\RuntimeMethodInfo.cs @ 126]
0000008FC11CD4C0 00007ffea7522f33 System.Reflection.MethodBase.Invoke(System.Object, System.Object[]) [C:\Users\maxcharlamb\source\reposA\runtime\src\libraries\System.Private.CoreLib\src\System\Reflection\MethodBase.cs @ 56]
0000008FC11CD500 00007ffe4a340570 NibbleMapReplacement.C1.M6() [C:\Users\maxcharlamb\source\repos\NibbleMapReplacement\Program.cs @ 89]
0000008FC11CD560 00007ffe4a33de35 NibbleMapReplacement.Program.Main(System.String[]) [C:\Users\maxcharlamb\source\repos\NibbleMapReplacement\Program.cs @ 25]
Managed Only Naive cDAC Implementation
Highlighted frames are not present in the DAC behavior. With a little more information, it should be trivial to filter the ILStub, but the logic around sometimes filtering ExceptionHandling logic is more complex.
OS Thread Id: 0xd474 (0)
Child SP IP Call Site
0000008FC11C67E0 00007ffe4a340092 Interop+Kernel32.ReadFile(IntPtr, Byte*, Int32, Int32 ByRef, IntPtr) [C:\Users\maxcharlamb\source\reposA\runtime\artifacts\obj\System.Console\Release\net10.0-windows\Microsoft.Interop.LibraryImportGenerator\Microsoft.Interop.LibraryImportGenerator\LibraryImports.g.cs @ 412]
0000008FC11C68C0 00007ffe4a33ff27 System.ConsolePal+WindowsConsoleStream.ReadFileNative(IntPtr, System.Span`1, Boolean, Int32 ByRef, Boolean) [C:\Users\maxcharlamb\source\reposA\runtime\src\libraries\System.Console\src\System\ConsolePal.Windows.cs @ 1223]
0000008FC11C6920 00007ffe4a33fe3b System.ConsolePal+WindowsConsoleStream.Read(System.Span`1) [C:\Users\maxcharlamb\source\reposA\runtime\src\libraries\System.Console\src\System\ConsolePal.Windows.cs @ 1181]
0000008FC11C6990 00007ffe4a33fd58 System.IO.ConsoleStream.Read(Byte[], Int32, Int32) [C:\Users\maxcharlamb\source\reposA\runtime\src\libraries\System.Console\src\System\IO\ConsoleStream.cs @ 34]
0000008FC11C69E0 00007ffea758c606 System.IO.StreamReader.ReadBuffer() [C:\Users\maxcharlamb\source\reposA\runtime\src\libraries\System.Private.CoreLib\src\System\IO\StreamReader.cs @ 611]
0000008FC11C6A40 00007ffea758cb93 System.IO.StreamReader.ReadLine() [C:\Users\maxcharlamb\source\reposA\runtime\src\libraries\System.Private.CoreLib\src\System\IO\StreamReader.cs @ 800]
0000008FC11C6B00 00007ffe4a33fc74 System.IO.SyncTextReader.ReadLine() [C:\Users\maxcharlamb\source\reposA\runtime\src\libraries\System.Console\src\System\IO\SyncTextReader.cs @ 77]
0000008FC11C6B60 00007ffe4a33f2bc System.Console.ReadLine() [C:\Users\maxcharlamb\source\reposA\runtime\src\libraries\System.Console\src\System\Console.cs @ 727]
0000008FC11C6BA0 00007ffe4a33df58 NibbleMapReplacement.C1.Block() [C:\Users\maxcharlamb\source\repos\NibbleMapReplacement\Program.cs @ 160]
**0000008FC11C6C20 00007ffe4a340aeb NibbleMapReplacement.C1.M2() [C:\Users\maxcharlamb\source\repos\NibbleMapReplacement\Program.cs @ 50]**
**0000008FC11C7100 00007ffea74e9e83 System.Runtime.EH.DispatchEx(System.Runtime.StackFrameIterator ByRef, ExInfo ByRef) [C:\Users\maxcharlamb\source\reposA\runtime\src\coreclr\nativeaot\Runtime.Base\src\System\Runtime\ExceptionHandling.cs @ 948]**
**0000008FC11C7240 00007ffea74e97f9 System.Runtime.EH.RhThrowEx(System.Object, ExInfo ByRef) [C:\Users\maxcharlamb\source\reposA\runtime\src\coreclr\nativeaot\Runtime.Base\src\System\Runtime\ExceptionHandling.cs @ 665]**
0000008FC11C9970 00007ffe4a340ac2 NibbleMapReplacement.C1.M2() [C:\Users\maxcharlamb\source\repos\NibbleMapReplacement\Program.cs @ 46]
0000008FC11C99C0 00007ffe4a340a22 NibbleMapReplacement.C1.F2(System.Exception) [C:\Users\maxcharlamb\source\repos\NibbleMapReplacement\Program.cs @ 153]
0000008FC11C9A00 00007ffe4a340974 NibbleMapReplacement.C1.M4() [C:\Users\maxcharlamb\source\repos\NibbleMapReplacement\Program.cs @ 72]
0000008FC11C9EB0 00007ffea74ea16a System.Runtime.EH.FindFirstPassHandler(System.Object, UInt32, System.Runtime.StackFrameIterator ByRef, UInt32 ByRef, Byte* ByRef) [C:\Users\maxcharlamb\source\reposA\runtime\src\coreclr\nativeaot\Runtime.Base\src\System\Runtime\ExceptionHandling.cs @ 1092]
0000008FC11CA000 00007ffea74e9c4a System.Runtime.EH.DispatchEx(System.Runtime.StackFrameIterator ByRef, ExInfo ByRef) [C:\Users\maxcharlamb\source\reposA\runtime\src\coreclr\nativeaot\Runtime.Base\src\System\Runtime\ExceptionHandling.cs @ 807]
0000008FC11CA140 00007ffea74e97f9 System.Runtime.EH.RhThrowEx(System.Object, ExInfo ByRef) [C:\Users\maxcharlamb\source\reposA\runtime\src\coreclr\nativeaot\Runtime.Base\src\System\Runtime\ExceptionHandling.cs @ 665]
0000008FC11CC870 00007ffe4a340913 NibbleMapReplacement.C1.M4() [C:\Users\maxcharlamb\source\repos\NibbleMapReplacement\Program.cs @ 70]
0000008FC11CC8F0 00007ffe4a34084d NibbleMapReplacement.C1.U1(IntPtr, Int32) [C:\Users\maxcharlamb\source\repos\NibbleMapReplacement\Program.cs @ 138]
**0000008FC11CC960 00007ffe4a3406f2 ILStubClass.IL_STUB_PInvoke(IntPtr, Int32)**
0000008FC11CCA40 00007ffe4a340612 NibbleMapReplacement.C1.M5() [C:\Users\maxcharlamb\source\repos\NibbleMapReplacement\Program.cs @ 82]
0000008FC11CD300 00007ffea7523612 System.Reflection.MethodBaseInvoker.InterpretedInvoke_Method(System.Object, IntPtr*) [C:\Users\maxcharlamb\source\reposA\runtime\src\coreclr\System.Private.CoreLib\src\System\Reflection\MethodBaseInvoker.CoreCLR.cs @ 36]
0000008FC11CD400 00007ffea7523724 System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(System.Object, System.Reflection.BindingFlags) [C:\Users\maxcharlamb\source\reposA\runtime\src\libraries\System.Private.CoreLib\src\System\Reflection\MethodBaseInvoker.cs @ 57]
0000008FC11CD450 00007ffea7534c6c System.Reflection.RuntimeMethodInfo.Invoke(System.Object, System.Reflection.BindingFlags, System.Reflection.Binder, System.Object[], System.Globalization.CultureInfo) [C:\Users\maxcharlamb\source\reposA\runtime\src\libraries\System.Private.CoreLib\src\System\Reflection\RuntimeMethodInfo.cs @ 126]
0000008FC11CD4C0 00007ffea7522f33 System.Reflection.MethodBase.Invoke(System.Object, System.Object[]) [C:\Users\maxcharlamb\source\reposA\runtime\src\libraries\System.Private.CoreLib\src\System\Reflection\MethodBase.cs @ 56]
0000008FC11CD500 00007ffe4a340570 NibbleMapReplacement.C1.M6() [C:\Users\maxcharlamb\source\repos\NibbleMapReplacement\Program.cs @ 89]
0000008FC11CD560 00007ffe4a33de35 NibbleMapReplacement.Program.Main(System.String[]) [C:\Users\maxcharlamb\source\repos\NibbleMapReplacement\Program.cs @ 25]
What is going on
Not showing "logically" unwound call frames due to exception handling. This occurs in the second pass of EH.
ExceptionTracker::FindParentStackFrameForStackWalk
ExceptionTracker::IsUnwoundToTargetParentFrame
ExceptionTracker::IsInStackRegionUnwoundByCurrentException