Skip to content

Commit

Permalink
Remove managed EH code frames from stack trace (#108831)
Browse files Browse the repository at this point in the history
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

Co-authored-by: Jan Vorlicek <janvorli@microsoft.com>
Co-authored-by: Jeff Schwartz <jeffschw@microsoft.com>
3 people authored Oct 15, 2024

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
1 parent 066cfa7 commit cf1c582
Showing 1 changed file with 6 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -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;

0 comments on commit cf1c582

Please sign in to comment.