From 7ac34129b82c20d7da72c1d8e6759026cee60d41 Mon Sep 17 00:00:00 2001 From: Jan Vorlicek Date: Wed, 9 Oct 2024 19:41:09 +0200 Subject: [PATCH] Remove managed EH code frames from stack trace When StackTrace is created inside of an exception filter, it contains stack frames of the managed exception handling code, like System.Runtime.EH.RhThrowEx System.Runtime.EH.DispatchEx System.Runtime.EH.FindFirstPassHandler These should not occur on the stack trace as they are internal implementation detail of the new EH. This change fixes it by adding [StackTraceHidden] attribute to these methods. Close #107995 --- .../Runtime.Base/src/System/Runtime/ExceptionHandling.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/coreclr/nativeaot/Runtime.Base/src/System/Runtime/ExceptionHandling.cs b/src/coreclr/nativeaot/Runtime.Base/src/System/Runtime/ExceptionHandling.cs index 3443e1bcb711a9..ef609ceaa61871 100644 --- a/src/coreclr/nativeaot/Runtime.Base/src/System/Runtime/ExceptionHandling.cs +++ b/src/coreclr/nativeaot/Runtime.Base/src/System/Runtime/ExceptionHandling.cs @@ -550,6 +550,7 @@ internal object ThrownException #if NATIVEAOT [RuntimeExport("RhThrowHwEx")] #endif + [StackTraceHidden] public static void RhThrowHwEx(uint exceptionCode, ref ExInfo exInfo) { #if NATIVEAOT @@ -624,6 +625,7 @@ public static void RhThrowHwEx(uint exceptionCode, ref ExInfo exInfo) #if NATIVEAOT [RuntimeExport("RhThrowEx")] #endif + [StackTraceHidden] public static void RhThrowEx(object exceptionObj, ref ExInfo exInfo) { #if NATIVEAOT @@ -705,6 +707,7 @@ public static void RhUnwindAndIntercept(ref ExInfo exInfo, UIntPtr interceptStac #if NATIVEAOT [RuntimeExport("RhRethrow")] #endif + [StackTraceHidden] public static void RhRethrow(ref ExInfo activeExInfo, ref ExInfo exInfo) { #if NATIVEAOT @@ -722,6 +725,7 @@ public static void RhRethrow(ref ExInfo activeExInfo, ref ExInfo exInfo) FallbackFailFast(RhFailFastReason.InternalError, null); } + [StackTraceHidden] private static void DispatchEx(scoped ref StackFrameIterator frameIter, ref ExInfo exInfo) { Debug.Assert(exInfo._passNumber == 1, "expected asm throw routine to set the pass"); @@ -977,6 +981,7 @@ private static void UpdateStackTrace(object exceptionObj, UIntPtr curFramePtr, I prevFramePtr = curFramePtr; } + [StackTraceHidden] private static bool FindFirstPassHandler(object exception, uint idxStart, ref StackFrameIterator frameIter, out uint tryRegionIdx, out byte* pHandler) { @@ -1134,6 +1139,7 @@ private static void InvokeSecondPass(ref ExInfo exInfo, uint idxStart) { InvokeSecondPass(ref exInfo, idxStart, MaxTryRegionIdx); } + private static void InvokeSecondPass(ref ExInfo exInfo, uint idxStart, uint idxLimit) { EHEnum ehEnum;