dotnet / runtime

.NET is a cross-platform runtime for cloud, mobile, desktop, and IoT apps.
https://docs.microsoft.com/dotnet/core/
MIT License
14.98k stars 4.66k forks source link

Should stack traces collected in filters have managed EH frames in them? #107995

Open SingleAccretion opened 1 day ago

SingleAccretion commented 1 day ago

Reproduction:

TestStackTraceInFilter();

[MethodImpl(MethodImplOptions.NoInlining)]
static void TestStackTraceInFilter()
{
    StackTrace st = TestStackTraceInFilterCallee();
    Console.WriteLine(st);
}

[MethodImpl(MethodImplOptions.NoInlining)]
static StackTrace TestStackTraceInFilterCallee()
{
    StackTrace st = null;
    try
    {
        throw new Exception();
    }
    catch (Exception e) when ((st = new StackTrace(fNeedFileInfo: true)) != null)
    {
    }
    return st;
}

dotnet run -f net8.0:

   at RyuJitReproduction.Program.TestStackTraceInFilterCallee() in C:\Users\Accretion\source\dotnet\RyuJit\RyuJitReproduction\Program.cs:line 94
   at RyuJitReproduction.Program.TestStackTraceInFilterCallee() in C:\Users\Accretion\source\dotnet\RyuJit\RyuJitReproduction\Program.cs:line 92
   at RyuJitReproduction.Program.TestStackTraceInFilter() in C:\Users\Accretion\source\dotnet\RyuJit\RyuJitReproduction\Program.cs:line 76
   at RyuJitReproduction.Program.Main() in C:\Users\Accretion\source\dotnet\RyuJit\RyuJitReproduction\Program.cs:line 70

dotnet run -f net9.0:

   at RyuJitReproduction.Program.TestStackTraceInFilterCallee() in C:\Users\Accretion\source\dotnet\RyuJit\RyuJitReproduction\Program.cs:line 94
   at System.Runtime.EH.FindFirstPassHandler(Object exception, UInt32 idxStart, StackFrameIterator& frameIter, UInt32& tryRegionIdx, Byte*& pHandler)
   at System.Runtime.EH.DispatchEx(StackFrameIterator& frameIter, ExInfo& exInfo)
   at System.Runtime.EH.RhThrowEx(Object exceptionObj, ExInfo& exInfo)
   at RyuJitReproduction.Program.TestStackTraceInFilterCallee() in C:\Users\Accretion\source\dotnet\RyuJit\RyuJitReproduction\Program.cs:line 92
   at RyuJitReproduction.Program.TestStackTraceInFilter() in C:\Users\Accretion\source\dotnet\RyuJit\RyuJitReproduction\Program.cs:line 76
   at RyuJitReproduction.Program.Main() in C:\Users\Accretion\source\dotnet\RyuJit\RyuJitReproduction\Program.cs:line 70

I would also slightly question the double appearance of TestStackTraceInFilterCallee where other funclets get collapsed, but I suppose that has been this way for a long time.

mangod9 commented 1 day ago

this looks related to new EH. Assume you get 8.0 if that is disabled? @janvorli fyi.

SingleAccretion commented 1 day ago

Assume you get 8.0 if that is disabled?

Correct.