From c487080adeccab500556aeca698beb47507ccf81 Mon Sep 17 00:00:00 2001 From: Mike McLaughlin Date: Thu, 12 Sep 2024 10:52:10 -0700 Subject: [PATCH] Fixes issue https://github.com/dotnet/diagnostics/issues/4850 (#4923) Fix dynamic methods "resolver" field name. --- debuggees.sln | 47 ++++++++++++- .../DynamicMethod/DynamicMethod.csproj | 9 +++ .../Debuggees/DynamicMethod/Program.cs | 67 +++++++++++++++++++ src/SOS/SOS.UnitTests/SOS.cs | 10 +++ .../Scripts/DynamicMethod.script | 11 +++ src/SOS/Strike/strike.cpp | 6 +- 6 files changed, 147 insertions(+), 3 deletions(-) create mode 100644 src/SOS/SOS.UnitTests/Debuggees/DynamicMethod/DynamicMethod.csproj create mode 100644 src/SOS/SOS.UnitTests/Debuggees/DynamicMethod/Program.cs create mode 100644 src/SOS/SOS.UnitTests/Scripts/DynamicMethod.script diff --git a/debuggees.sln b/debuggees.sln index 731e71af09..8786ab4f78 100644 --- a/debuggees.sln +++ b/debuggees.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.29019.234 +# Visual Studio Version 17 +VisualStudioVersion = 17.12.35309.182 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestDebuggee", "src\SOS\lldbplugin.tests\TestDebuggee\TestDebuggee.csproj", "{6C43BE85-F8C3-4D76-8050-F25CE953A7FD}" EndProject @@ -39,6 +39,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GCPOH", "src\SOS\SOS.UnitTe EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DotnetDumpCommands", "src\SOS\SOS.UnitTests\Debuggees\DotnetDumpCommands\DotnetDumpCommands.csproj", "{F9A69812-DC52-428D-9DB1-8B831A8FF776}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DynamicMethod", "src\SOS\SOS.UnitTests\Debuggees\DynamicMethod\DynamicMethod.csproj", "{2F9AA5A9-D42A-42C6-B483-1B9284C62F91}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Checked|Any CPU = Checked|Any CPU @@ -663,6 +665,46 @@ Global {F9A69812-DC52-428D-9DB1-8B831A8FF776}.RelWithDebInfo|x64.Build.0 = Release|Any CPU {F9A69812-DC52-428D-9DB1-8B831A8FF776}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU {F9A69812-DC52-428D-9DB1-8B831A8FF776}.RelWithDebInfo|x86.Build.0 = Release|Any CPU + {2F9AA5A9-D42A-42C6-B483-1B9284C62F91}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {2F9AA5A9-D42A-42C6-B483-1B9284C62F91}.Checked|Any CPU.Build.0 = Debug|Any CPU + {2F9AA5A9-D42A-42C6-B483-1B9284C62F91}.Checked|ARM.ActiveCfg = Debug|Any CPU + {2F9AA5A9-D42A-42C6-B483-1B9284C62F91}.Checked|ARM.Build.0 = Debug|Any CPU + {2F9AA5A9-D42A-42C6-B483-1B9284C62F91}.Checked|ARM64.ActiveCfg = Debug|Any CPU + {2F9AA5A9-D42A-42C6-B483-1B9284C62F91}.Checked|ARM64.Build.0 = Debug|Any CPU + {2F9AA5A9-D42A-42C6-B483-1B9284C62F91}.Checked|x64.ActiveCfg = Debug|Any CPU + {2F9AA5A9-D42A-42C6-B483-1B9284C62F91}.Checked|x64.Build.0 = Debug|Any CPU + {2F9AA5A9-D42A-42C6-B483-1B9284C62F91}.Checked|x86.ActiveCfg = Debug|Any CPU + {2F9AA5A9-D42A-42C6-B483-1B9284C62F91}.Checked|x86.Build.0 = Debug|Any CPU + {2F9AA5A9-D42A-42C6-B483-1B9284C62F91}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2F9AA5A9-D42A-42C6-B483-1B9284C62F91}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2F9AA5A9-D42A-42C6-B483-1B9284C62F91}.Debug|ARM.ActiveCfg = Debug|Any CPU + {2F9AA5A9-D42A-42C6-B483-1B9284C62F91}.Debug|ARM.Build.0 = Debug|Any CPU + {2F9AA5A9-D42A-42C6-B483-1B9284C62F91}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {2F9AA5A9-D42A-42C6-B483-1B9284C62F91}.Debug|ARM64.Build.0 = Debug|Any CPU + {2F9AA5A9-D42A-42C6-B483-1B9284C62F91}.Debug|x64.ActiveCfg = Debug|Any CPU + {2F9AA5A9-D42A-42C6-B483-1B9284C62F91}.Debug|x64.Build.0 = Debug|Any CPU + {2F9AA5A9-D42A-42C6-B483-1B9284C62F91}.Debug|x86.ActiveCfg = Debug|Any CPU + {2F9AA5A9-D42A-42C6-B483-1B9284C62F91}.Debug|x86.Build.0 = Debug|Any CPU + {2F9AA5A9-D42A-42C6-B483-1B9284C62F91}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2F9AA5A9-D42A-42C6-B483-1B9284C62F91}.Release|Any CPU.Build.0 = Release|Any CPU + {2F9AA5A9-D42A-42C6-B483-1B9284C62F91}.Release|ARM.ActiveCfg = Release|Any CPU + {2F9AA5A9-D42A-42C6-B483-1B9284C62F91}.Release|ARM.Build.0 = Release|Any CPU + {2F9AA5A9-D42A-42C6-B483-1B9284C62F91}.Release|ARM64.ActiveCfg = Release|Any CPU + {2F9AA5A9-D42A-42C6-B483-1B9284C62F91}.Release|ARM64.Build.0 = Release|Any CPU + {2F9AA5A9-D42A-42C6-B483-1B9284C62F91}.Release|x64.ActiveCfg = Release|Any CPU + {2F9AA5A9-D42A-42C6-B483-1B9284C62F91}.Release|x64.Build.0 = Release|Any CPU + {2F9AA5A9-D42A-42C6-B483-1B9284C62F91}.Release|x86.ActiveCfg = Release|Any CPU + {2F9AA5A9-D42A-42C6-B483-1B9284C62F91}.Release|x86.Build.0 = Release|Any CPU + {2F9AA5A9-D42A-42C6-B483-1B9284C62F91}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU + {2F9AA5A9-D42A-42C6-B483-1B9284C62F91}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU + {2F9AA5A9-D42A-42C6-B483-1B9284C62F91}.RelWithDebInfo|ARM.ActiveCfg = Release|Any CPU + {2F9AA5A9-D42A-42C6-B483-1B9284C62F91}.RelWithDebInfo|ARM.Build.0 = Release|Any CPU + {2F9AA5A9-D42A-42C6-B483-1B9284C62F91}.RelWithDebInfo|ARM64.ActiveCfg = Release|Any CPU + {2F9AA5A9-D42A-42C6-B483-1B9284C62F91}.RelWithDebInfo|ARM64.Build.0 = Release|Any CPU + {2F9AA5A9-D42A-42C6-B483-1B9284C62F91}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU + {2F9AA5A9-D42A-42C6-B483-1B9284C62F91}.RelWithDebInfo|x64.Build.0 = Release|Any CPU + {2F9AA5A9-D42A-42C6-B483-1B9284C62F91}.RelWithDebInfo|x86.ActiveCfg = Release|Any CPU + {2F9AA5A9-D42A-42C6-B483-1B9284C62F91}.RelWithDebInfo|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -685,6 +727,7 @@ Global {84881FB8-37E1-4D9B-B27E-9831C30DCC04} = {C3072949-6D24-451B-A308-2F3621F858B0} {0A34CA51-8B8C-41A1-BE24-AB2C574EA144} = {C3072949-6D24-451B-A308-2F3621F858B0} {F9A69812-DC52-428D-9DB1-8B831A8FF776} = {C3072949-6D24-451B-A308-2F3621F858B0} + {2F9AA5A9-D42A-42C6-B483-1B9284C62F91} = {C3072949-6D24-451B-A308-2F3621F858B0} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {46465737-C938-44FC-BE1A-4CE139EBB5E0} diff --git a/src/SOS/SOS.UnitTests/Debuggees/DynamicMethod/DynamicMethod.csproj b/src/SOS/SOS.UnitTests/Debuggees/DynamicMethod/DynamicMethod.csproj new file mode 100644 index 0000000000..299cffbb99 --- /dev/null +++ b/src/SOS/SOS.UnitTests/Debuggees/DynamicMethod/DynamicMethod.csproj @@ -0,0 +1,9 @@ + + + + Exe + $(BuildProjectFramework) + $(BuildTargetFrameworks) + + + diff --git a/src/SOS/SOS.UnitTests/Debuggees/DynamicMethod/Program.cs b/src/SOS/SOS.UnitTests/Debuggees/DynamicMethod/Program.cs new file mode 100644 index 0000000000..16afe57006 --- /dev/null +++ b/src/SOS/SOS.UnitTests/Debuggees/DynamicMethod/Program.cs @@ -0,0 +1,67 @@ +using System; +using System.Reflection.Emit; +using System.Runtime.CompilerServices; + +namespace TestInfiniteDynamicMethods +{ + internal class Program + { + [MethodImpl(MethodImplOptions.NoInlining)] + static Func GetFibDynamicMethod() + { + DynamicMethod dynamicMethod = new DynamicMethod("Fibonacci", typeof(int), new Type[] { typeof(int) }); + ILGenerator ilgen = dynamicMethod.GetILGenerator(); + Label labelAfterCmp0 = ilgen.DefineLabel(); + ilgen.Emit(OpCodes.Ldarg_0); + ilgen.Emit(OpCodes.Ldc_I4_0); + ilgen.Emit(OpCodes.Bne_Un_S, labelAfterCmp0); + ilgen.Emit(OpCodes.Ldc_I4_0); + ilgen.Emit(OpCodes.Ret); + ilgen.MarkLabel(labelAfterCmp0); + + Label labelAfterCmp1 = ilgen.DefineLabel(); + ilgen.Emit(OpCodes.Ldarg_0); + ilgen.Emit(OpCodes.Ldc_I4_1); + ilgen.Emit(OpCodes.Bne_Un_S, labelAfterCmp1); + ilgen.Emit(OpCodes.Ldc_I4_1); + ilgen.Emit(OpCodes.Ret); + ilgen.MarkLabel(labelAfterCmp1); + + ilgen.Emit(OpCodes.Ldarg_0); + ilgen.Emit(OpCodes.Ldc_I4_1); + ilgen.Emit(OpCodes.Sub); + ilgen.Emit(OpCodes.Call, dynamicMethod); + + ilgen.Emit(OpCodes.Ldarg_0); + ilgen.Emit(OpCodes.Ldc_I4_2); + ilgen.Emit(OpCodes.Sub); + ilgen.Emit(OpCodes.Call, dynamicMethod); + + ilgen.Emit(OpCodes.Add); + ilgen.Emit(OpCodes.Ret); + + var result = dynamicMethod.CreateDelegate>(); + throw new Exception(); + } + + static void Main(string[] args) + { + Console.WriteLine("Hello, World!"); + + int count = 0; + while (true) + { + int result = GetFibDynamicMethod()(4); + + if (((++count) % 200) == 0) + { + GC.Collect(); + GC.WaitForPendingFinalizers(); + } + + if (((++count) % 1000) == 0) + Console.WriteLine(count); + } + } + } +} diff --git a/src/SOS/SOS.UnitTests/SOS.cs b/src/SOS/SOS.UnitTests/SOS.cs index c665bad6e5..fb9d74886d 100644 --- a/src/SOS/SOS.UnitTests/SOS.cs +++ b/src/SOS/SOS.UnitTests/SOS.cs @@ -254,6 +254,16 @@ await SOSTestHelpers.RunTest( Output); } + [SkippableTheory, MemberData(nameof(Configurations))] + public async Task DynamicMethod(TestConfiguration config) + { + if (config.PublishSingleFile || config.IsDesktop) + { + throw new SkipTestException("Single file and desktop framework not supported"); + } + await SOSTestHelpers.RunTest(config, debuggeeName: "DynamicMethod", scriptName: "DynamicMethod.script", Output); + } + [SkippableTheory, MemberData(nameof(Configurations))] public async Task Reflection(TestConfiguration config) { diff --git a/src/SOS/SOS.UnitTests/Scripts/DynamicMethod.script b/src/SOS/SOS.UnitTests/Scripts/DynamicMethod.script new file mode 100644 index 0000000000..ea20901c36 --- /dev/null +++ b/src/SOS/SOS.UnitTests/Scripts/DynamicMethod.script @@ -0,0 +1,11 @@ + +CONTINUE + +LOADSOS + +SOSCOMMAND:ClrStack -i -a +VERIFY:\s+LOCALS:\s+ + +SOSCOMMAND:DumpIL .*System\.Reflection\.Emit\.DynamicMethod dynamicMethod @ 0x().*\s+ +VERIFY:\s+IL_0000: ldarg.0\s+ +VERIFY:\s+IL_0001: ldc.i4.0\s+ diff --git a/src/SOS/Strike/strike.cpp b/src/SOS/Strike/strike.cpp index 6c4bac0fd2..59861b4411 100644 --- a/src/SOS/Strike/strike.cpp +++ b/src/SOS/Strike/strike.cpp @@ -651,7 +651,11 @@ BOOL GatherDynamicInfo(TADDR DynamicMethodObj, DacpObjectData *codeArray, iOffset = GetObjFieldOffset(TO_CDADDR(DynamicMethodObj), objData.MethodTable, W("m_resolver")); if (iOffset <= 0) - return bRet; + { + iOffset = GetObjFieldOffset(TO_CDADDR(DynamicMethodObj), objData.MethodTable, W("_resolver")); + if (iOffset <= 0) + return bRet; + } TADDR resolverPtr; if (FAILED(MOVE(resolverPtr, DynamicMethodObj + iOffset)))