From 0b6ccbdd10f8b4dc0c1c158217811f59a23f2a4f Mon Sep 17 00:00:00 2001 From: Max Charlamb <44248479+max-charlamb@users.noreply.github.com> Date: Fri, 26 Sep 2025 15:38:44 -0400 Subject: [PATCH 1/4] add TriageDumpLocalVarLookup test --- debuggees.sln | 43 +++++++++++++++++++ .../TriageDumpLocalVarLookup/Program.cs | 26 +++++++++++ .../TriageDumpLocalVarLookup.csproj | 7 +++ src/SOS/SOS.UnitTests/SOS.cs | 24 +++++++++-- .../Scripts/TriageDumpLocalVarLookup.script | 15 +++++++ 5 files changed, 112 insertions(+), 3 deletions(-) create mode 100644 src/SOS/SOS.UnitTests/Debuggees/TriageDumpLocalVarLookup/Program.cs create mode 100644 src/SOS/SOS.UnitTests/Debuggees/TriageDumpLocalVarLookup/TriageDumpLocalVarLookup.csproj create mode 100644 src/SOS/SOS.UnitTests/Scripts/TriageDumpLocalVarLookup.script diff --git a/debuggees.sln b/debuggees.sln index 28ecfb5ea3..6bc9960858 100644 --- a/debuggees.sln +++ b/debuggees.sln @@ -51,6 +51,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FindRootsOlderGeneration", EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DumpGCData", "src\SOS\SOS.UnitTests\Debuggees\DumpGCData\DumpGCData.csproj", "{CBE13BD1-EA24-4A95-818C-EE6FFA4F09A5}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TriageDumpLocalVarLookup", "src\SOS\SOS.UnitTests\Debuggees\TriageDumpLocalVarLookup\TriageDumpLocalVarLookup.csproj", "{B042D2AB-D74C-46D8-94DD-68E9AA293FF5}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Checked|Any CPU = Checked|Any CPU @@ -835,6 +837,46 @@ Global {CBE13BD1-EA24-4A95-818C-EE6FFA4F09A5}.RelWithDebInfo|x64.Build.0 = Debug|Any CPU {CBE13BD1-EA24-4A95-818C-EE6FFA4F09A5}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU {CBE13BD1-EA24-4A95-818C-EE6FFA4F09A5}.RelWithDebInfo|x86.Build.0 = Debug|Any CPU + {B042D2AB-D74C-46D8-94DD-68E9AA293FF5}.Checked|Any CPU.ActiveCfg = Debug|Any CPU + {B042D2AB-D74C-46D8-94DD-68E9AA293FF5}.Checked|Any CPU.Build.0 = Debug|Any CPU + {B042D2AB-D74C-46D8-94DD-68E9AA293FF5}.Checked|ARM.ActiveCfg = Debug|Any CPU + {B042D2AB-D74C-46D8-94DD-68E9AA293FF5}.Checked|ARM.Build.0 = Debug|Any CPU + {B042D2AB-D74C-46D8-94DD-68E9AA293FF5}.Checked|ARM64.ActiveCfg = Debug|Any CPU + {B042D2AB-D74C-46D8-94DD-68E9AA293FF5}.Checked|ARM64.Build.0 = Debug|Any CPU + {B042D2AB-D74C-46D8-94DD-68E9AA293FF5}.Checked|x64.ActiveCfg = Debug|Any CPU + {B042D2AB-D74C-46D8-94DD-68E9AA293FF5}.Checked|x64.Build.0 = Debug|Any CPU + {B042D2AB-D74C-46D8-94DD-68E9AA293FF5}.Checked|x86.ActiveCfg = Debug|Any CPU + {B042D2AB-D74C-46D8-94DD-68E9AA293FF5}.Checked|x86.Build.0 = Debug|Any CPU + {B042D2AB-D74C-46D8-94DD-68E9AA293FF5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B042D2AB-D74C-46D8-94DD-68E9AA293FF5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B042D2AB-D74C-46D8-94DD-68E9AA293FF5}.Debug|ARM.ActiveCfg = Debug|Any CPU + {B042D2AB-D74C-46D8-94DD-68E9AA293FF5}.Debug|ARM.Build.0 = Debug|Any CPU + {B042D2AB-D74C-46D8-94DD-68E9AA293FF5}.Debug|ARM64.ActiveCfg = Debug|Any CPU + {B042D2AB-D74C-46D8-94DD-68E9AA293FF5}.Debug|ARM64.Build.0 = Debug|Any CPU + {B042D2AB-D74C-46D8-94DD-68E9AA293FF5}.Debug|x64.ActiveCfg = Debug|Any CPU + {B042D2AB-D74C-46D8-94DD-68E9AA293FF5}.Debug|x64.Build.0 = Debug|Any CPU + {B042D2AB-D74C-46D8-94DD-68E9AA293FF5}.Debug|x86.ActiveCfg = Debug|Any CPU + {B042D2AB-D74C-46D8-94DD-68E9AA293FF5}.Debug|x86.Build.0 = Debug|Any CPU + {B042D2AB-D74C-46D8-94DD-68E9AA293FF5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B042D2AB-D74C-46D8-94DD-68E9AA293FF5}.Release|Any CPU.Build.0 = Release|Any CPU + {B042D2AB-D74C-46D8-94DD-68E9AA293FF5}.Release|ARM.ActiveCfg = Release|Any CPU + {B042D2AB-D74C-46D8-94DD-68E9AA293FF5}.Release|ARM.Build.0 = Release|Any CPU + {B042D2AB-D74C-46D8-94DD-68E9AA293FF5}.Release|ARM64.ActiveCfg = Release|Any CPU + {B042D2AB-D74C-46D8-94DD-68E9AA293FF5}.Release|ARM64.Build.0 = Release|Any CPU + {B042D2AB-D74C-46D8-94DD-68E9AA293FF5}.Release|x64.ActiveCfg = Release|Any CPU + {B042D2AB-D74C-46D8-94DD-68E9AA293FF5}.Release|x64.Build.0 = Release|Any CPU + {B042D2AB-D74C-46D8-94DD-68E9AA293FF5}.Release|x86.ActiveCfg = Release|Any CPU + {B042D2AB-D74C-46D8-94DD-68E9AA293FF5}.Release|x86.Build.0 = Release|Any CPU + {B042D2AB-D74C-46D8-94DD-68E9AA293FF5}.RelWithDebInfo|Any CPU.ActiveCfg = Debug|Any CPU + {B042D2AB-D74C-46D8-94DD-68E9AA293FF5}.RelWithDebInfo|Any CPU.Build.0 = Debug|Any CPU + {B042D2AB-D74C-46D8-94DD-68E9AA293FF5}.RelWithDebInfo|ARM.ActiveCfg = Debug|Any CPU + {B042D2AB-D74C-46D8-94DD-68E9AA293FF5}.RelWithDebInfo|ARM.Build.0 = Debug|Any CPU + {B042D2AB-D74C-46D8-94DD-68E9AA293FF5}.RelWithDebInfo|ARM64.ActiveCfg = Debug|Any CPU + {B042D2AB-D74C-46D8-94DD-68E9AA293FF5}.RelWithDebInfo|ARM64.Build.0 = Debug|Any CPU + {B042D2AB-D74C-46D8-94DD-68E9AA293FF5}.RelWithDebInfo|x64.ActiveCfg = Debug|Any CPU + {B042D2AB-D74C-46D8-94DD-68E9AA293FF5}.RelWithDebInfo|x64.Build.0 = Debug|Any CPU + {B042D2AB-D74C-46D8-94DD-68E9AA293FF5}.RelWithDebInfo|x86.ActiveCfg = Debug|Any CPU + {B042D2AB-D74C-46D8-94DD-68E9AA293FF5}.RelWithDebInfo|x86.Build.0 = Debug|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -863,6 +905,7 @@ Global {AE071195-19FD-4215-87A9-D4A77A4ACC52} = {D25F6D55-E7B6-4231-F185-513E693BEEA2} {B7954E17-D190-42F2-B34F-284BCA70FD97} = {D25F6D55-E7B6-4231-F185-513E693BEEA2} {CBE13BD1-EA24-4A95-818C-EE6FFA4F09A5} = {D25F6D55-E7B6-4231-F185-513E693BEEA2} + {B042D2AB-D74C-46D8-94DD-68E9AA293FF5} = {D25F6D55-E7B6-4231-F185-513E693BEEA2} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {46465737-C938-44FC-BE1A-4CE139EBB5E0} diff --git a/src/SOS/SOS.UnitTests/Debuggees/TriageDumpLocalVarLookup/Program.cs b/src/SOS/SOS.UnitTests/Debuggees/TriageDumpLocalVarLookup/Program.cs new file mode 100644 index 0000000000..ec183bee88 --- /dev/null +++ b/src/SOS/SOS.UnitTests/Debuggees/TriageDumpLocalVarLookup/Program.cs @@ -0,0 +1,26 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Diagnostics; + +namespace TriageDumpLocalVarLookup; + +internal class Program +{ + static public void Main() + { + int intValue = 42; + string stringValue = "Hello, World!"; + + PrintValues(intValue, stringValue); + } + + static void PrintValues(int intValue, string stringValue) + { + int length = stringValue.Length; + Debugger.Break(); + Console.WriteLine($"intValue: {intValue}"); + Console.WriteLine($"stringValue: {stringValue} (length = {length})"); + } +} \ No newline at end of file diff --git a/src/SOS/SOS.UnitTests/Debuggees/TriageDumpLocalVarLookup/TriageDumpLocalVarLookup.csproj b/src/SOS/SOS.UnitTests/Debuggees/TriageDumpLocalVarLookup/TriageDumpLocalVarLookup.csproj new file mode 100644 index 0000000000..644ea7fa32 --- /dev/null +++ b/src/SOS/SOS.UnitTests/Debuggees/TriageDumpLocalVarLookup/TriageDumpLocalVarLookup.csproj @@ -0,0 +1,7 @@ + + + Exe + $(BuildProjectFramework) + $(SupportedSubProcessTargetFrameworks) + + diff --git a/src/SOS/SOS.UnitTests/SOS.cs b/src/SOS/SOS.UnitTests/SOS.cs index 3a66a4046f..2a6564fc6f 100644 --- a/src/SOS/SOS.UnitTests/SOS.cs +++ b/src/SOS/SOS.UnitTests/SOS.cs @@ -139,7 +139,8 @@ internal static async Task RunTest( string testName = null, bool testLive = true, bool testDump = true, - bool testTriage = false) + bool testTriage = false, + SOSRunner.DumpGenerator dumpGenerator = SOSRunner.DumpGenerator.CreateDump) { await RunTest(scriptName, new SOSRunner.TestInformation @@ -149,7 +150,8 @@ await RunTest(scriptName, TestLive = testLive, TestDump = testDump, DebuggeeName = debuggeeName, - DumpType = SOSRunner.DumpType.Heap + DumpType = SOSRunner.DumpType.Heap, + DumpGenerator = dumpGenerator, }, output); @@ -165,7 +167,8 @@ await RunTest(scriptName, TestLive = false, TestDump = testDump, DebuggeeName = debuggeeName, - DumpType = SOSRunner.DumpType.Triage + DumpType = SOSRunner.DumpType.Triage, + DumpGenerator = dumpGenerator, }, output); } @@ -234,6 +237,21 @@ public SOS(ITestOutputHelper output) public static IEnumerable Configurations => SOSTestHelpers.GetConfigurations("TestName", value: null); + [SkippableTheory, MemberData(nameof(SOSTestHelpers.GetNetCoreConfigurations), MemberType = typeof(SOSTestHelpers))] + public async Task TriageDumpLocalVarLookup(TestConfiguration config) + { + // The default dumpGenerator, CreateDump, only supports taking dumps at exceptions. + // DotnetDump could support taking a dump at a breakpoint, but this SOS test framework doesn't currently support this operation. + // Therefore we use the NativeDebugger to take a dump at the DebugBreak() call in the debuggee. + await SOSTestHelpers.RunTest( + config, + debuggeeName: "TriageDumpLocalVarLookup", + scriptName: "TriageDumpLocalVarLookup.script", + Output, + testName: "SOS.TriageDumpLocalVarLookup", + testTriage: true, + dumpGenerator: SOSRunner.DumpGenerator.NativeDebugger); + } [SkippableTheory, MemberData(nameof(SOSTestHelpers.GetNetCoreConfigurations), MemberType = typeof(SOSTestHelpers))] public async Task VarargPInvokeInteropMD(TestConfiguration config) diff --git a/src/SOS/SOS.UnitTests/Scripts/TriageDumpLocalVarLookup.script b/src/SOS/SOS.UnitTests/Scripts/TriageDumpLocalVarLookup.script new file mode 100644 index 0000000000..7214d421ef --- /dev/null +++ b/src/SOS/SOS.UnitTests/Scripts/TriageDumpLocalVarLookup.script @@ -0,0 +1,15 @@ +# +# Verifies that local stack value variables are able to be parsed by the debugger in mini/triage dumps +# Utilizes the ICorDebug stackwalk with -i +# + +CONTINUE + +LOADSOS + +# stackwalk with locals +SOSCOMMAND:clrstack -l + +# stackwalk through ICorDebug with locals +SOSCOMMAND:clrstack -i -l +VERIFY:int\s+length\s+=\s+13 \ No newline at end of file From dadfc6b6ccd7af47111529234f0f73db293b4180 Mon Sep 17 00:00:00 2001 From: Max Charlamb <44248479+max-charlamb@users.noreply.github.com> Date: Fri, 26 Sep 2025 15:40:06 -0400 Subject: [PATCH 2/4] spacing --- .../SOS.UnitTests/Debuggees/TriageDumpLocalVarLookup/Program.cs | 2 +- src/SOS/SOS.UnitTests/Scripts/TriageDumpLocalVarLookup.script | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/SOS/SOS.UnitTests/Debuggees/TriageDumpLocalVarLookup/Program.cs b/src/SOS/SOS.UnitTests/Debuggees/TriageDumpLocalVarLookup/Program.cs index ec183bee88..8b5c004486 100644 --- a/src/SOS/SOS.UnitTests/Debuggees/TriageDumpLocalVarLookup/Program.cs +++ b/src/SOS/SOS.UnitTests/Debuggees/TriageDumpLocalVarLookup/Program.cs @@ -23,4 +23,4 @@ static void PrintValues(int intValue, string stringValue) Console.WriteLine($"intValue: {intValue}"); Console.WriteLine($"stringValue: {stringValue} (length = {length})"); } -} \ No newline at end of file +} diff --git a/src/SOS/SOS.UnitTests/Scripts/TriageDumpLocalVarLookup.script b/src/SOS/SOS.UnitTests/Scripts/TriageDumpLocalVarLookup.script index 7214d421ef..8ce9245019 100644 --- a/src/SOS/SOS.UnitTests/Scripts/TriageDumpLocalVarLookup.script +++ b/src/SOS/SOS.UnitTests/Scripts/TriageDumpLocalVarLookup.script @@ -12,4 +12,4 @@ SOSCOMMAND:clrstack -l # stackwalk through ICorDebug with locals SOSCOMMAND:clrstack -i -l -VERIFY:int\s+length\s+=\s+13 \ No newline at end of file +VERIFY:int\s+length\s+=\s+13 From 076d627178182a5aba8a1423f31b5da74713ce5d Mon Sep 17 00:00:00 2001 From: Max Charlamb <44248479+max-charlamb@users.noreply.github.com> Date: Mon, 29 Sep 2025 10:38:07 -0400 Subject: [PATCH 3/4] update to use minidump --- .../MiniDumpLocalVarLookup.csproj} | 0 .../Program.cs | 2 +- src/SOS/SOS.UnitTests/SOS.cs | 36 ++++++++++++++++--- src/SOS/SOS.UnitTests/SOSRunner.cs | 10 ++++++ ...p.script => MiniDumpLocalVarLookup.script} | 0 5 files changed, 42 insertions(+), 6 deletions(-) rename src/SOS/SOS.UnitTests/Debuggees/{TriageDumpLocalVarLookup/TriageDumpLocalVarLookup.csproj => MiniDumpLocalVarLookup/MiniDumpLocalVarLookup.csproj} (100%) rename src/SOS/SOS.UnitTests/Debuggees/{TriageDumpLocalVarLookup => MiniDumpLocalVarLookup}/Program.cs (94%) rename src/SOS/SOS.UnitTests/Scripts/{TriageDumpLocalVarLookup.script => MiniDumpLocalVarLookup.script} (100%) diff --git a/src/SOS/SOS.UnitTests/Debuggees/TriageDumpLocalVarLookup/TriageDumpLocalVarLookup.csproj b/src/SOS/SOS.UnitTests/Debuggees/MiniDumpLocalVarLookup/MiniDumpLocalVarLookup.csproj similarity index 100% rename from src/SOS/SOS.UnitTests/Debuggees/TriageDumpLocalVarLookup/TriageDumpLocalVarLookup.csproj rename to src/SOS/SOS.UnitTests/Debuggees/MiniDumpLocalVarLookup/MiniDumpLocalVarLookup.csproj diff --git a/src/SOS/SOS.UnitTests/Debuggees/TriageDumpLocalVarLookup/Program.cs b/src/SOS/SOS.UnitTests/Debuggees/MiniDumpLocalVarLookup/Program.cs similarity index 94% rename from src/SOS/SOS.UnitTests/Debuggees/TriageDumpLocalVarLookup/Program.cs rename to src/SOS/SOS.UnitTests/Debuggees/MiniDumpLocalVarLookup/Program.cs index 8b5c004486..cbea65ad93 100644 --- a/src/SOS/SOS.UnitTests/Debuggees/TriageDumpLocalVarLookup/Program.cs +++ b/src/SOS/SOS.UnitTests/Debuggees/MiniDumpLocalVarLookup/Program.cs @@ -4,7 +4,7 @@ using System; using System.Diagnostics; -namespace TriageDumpLocalVarLookup; +namespace MiniDumpLocalVarLookup; internal class Program { diff --git a/src/SOS/SOS.UnitTests/SOS.cs b/src/SOS/SOS.UnitTests/SOS.cs index 2a6564fc6f..ebf4e0deda 100644 --- a/src/SOS/SOS.UnitTests/SOS.cs +++ b/src/SOS/SOS.UnitTests/SOS.cs @@ -140,6 +140,7 @@ internal static async Task RunTest( bool testLive = true, bool testDump = true, bool testTriage = false, + bool testMini = false, SOSRunner.DumpGenerator dumpGenerator = SOSRunner.DumpGenerator.CreateDump) { await RunTest(scriptName, @@ -172,6 +173,21 @@ await RunTest(scriptName, }, output); } + if (testMini && !config.PublishSingleFile) + { + await RunTest(scriptName, + new SOSRunner.TestInformation + { + TestConfiguration = config, + TestName = testName, + TestLive = false, + TestDump = testDump, + DebuggeeName = debuggeeName, + DumpType = SOSRunner.DumpType.Mini, + DumpGenerator = dumpGenerator, + }, + output); + } } internal static void TestCrashReport(string dumpName, SOSRunner.TestInformation information) @@ -238,18 +254,28 @@ public SOS(ITestOutputHelper output) public static IEnumerable Configurations => SOSTestHelpers.GetConfigurations("TestName", value: null); [SkippableTheory, MemberData(nameof(SOSTestHelpers.GetNetCoreConfigurations), MemberType = typeof(SOSTestHelpers))] - public async Task TriageDumpLocalVarLookup(TestConfiguration config) + public async Task MiniDumpLocalVarLookup(TestConfiguration config) { + if (OS.Kind != OSKind.Windows) + { + throw new SkipTestException("Test only supports CDB and therefore only runs on Windows"); + } + + if (config.PublishSingleFile) + { + throw new SkipTestException("Single file does not support mini dumps"); + } + // The default dumpGenerator, CreateDump, only supports taking dumps at exceptions. // DotnetDump could support taking a dump at a breakpoint, but this SOS test framework doesn't currently support this operation. // Therefore we use the NativeDebugger to take a dump at the DebugBreak() call in the debuggee. await SOSTestHelpers.RunTest( config, - debuggeeName: "TriageDumpLocalVarLookup", - scriptName: "TriageDumpLocalVarLookup.script", + debuggeeName: "MiniDumpLocalVarLookup", + scriptName: "MiniDumpLocalVarLookup.script", Output, - testName: "SOS.TriageDumpLocalVarLookup", - testTriage: true, + testName: "SOS.MiniDumpLocalVarLookup", + testMini: true, dumpGenerator: SOSRunner.DumpGenerator.NativeDebugger); } diff --git a/src/SOS/SOS.UnitTests/SOSRunner.cs b/src/SOS/SOS.UnitTests/SOSRunner.cs index 382a66bfe9..80fed0eb5e 100644 --- a/src/SOS/SOS.UnitTests/SOSRunner.cs +++ b/src/SOS/SOS.UnitTests/SOSRunner.cs @@ -34,6 +34,7 @@ public enum DumpGenerator public enum DumpType { Triage, + Mini, Heap, Full } @@ -235,6 +236,9 @@ public static async Task CreateDump(TestInformation information) await runner.ContinueExecution(); switch (information.DumpType) { + case DumpType.Mini: + command = ".dump /o /m %DUMP_NAME%"; + break; case DumpType.Heap: command = ".dump /o /mw %DUMP_NAME%"; break; @@ -349,6 +353,9 @@ public static async Task CreateDump(TestInformation information) } switch (dumpType) { + case DumpType.Mini: + processRunner.WithRuntimeConfiguration("DbgMiniDumpType", "1"); + break; case DumpType.Heap: processRunner.WithRuntimeConfiguration("DbgMiniDumpType", "2"); break; @@ -1498,6 +1505,9 @@ private HashSet GetEnabledDefines() { switch (_dumpType.Value) { + case DumpType.Mini: + defines.Add("MINI_DUMP"); + break; case DumpType.Triage: defines.Add("TRIAGE_DUMP"); break; diff --git a/src/SOS/SOS.UnitTests/Scripts/TriageDumpLocalVarLookup.script b/src/SOS/SOS.UnitTests/Scripts/MiniDumpLocalVarLookup.script similarity index 100% rename from src/SOS/SOS.UnitTests/Scripts/TriageDumpLocalVarLookup.script rename to src/SOS/SOS.UnitTests/Scripts/MiniDumpLocalVarLookup.script From f26353f5ea0c342d552cb6307bc95db8024050f6 Mon Sep 17 00:00:00 2001 From: Max Charlamb <44248479+max-charlamb@users.noreply.github.com> Date: Mon, 29 Sep 2025 11:41:07 -0400 Subject: [PATCH 4/4] fix debuggees --- debuggees.sln | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debuggees.sln b/debuggees.sln index 6bc9960858..0007c297aa 100644 --- a/debuggees.sln +++ b/debuggees.sln @@ -51,7 +51,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FindRootsOlderGeneration", EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DumpGCData", "src\SOS\SOS.UnitTests\Debuggees\DumpGCData\DumpGCData.csproj", "{CBE13BD1-EA24-4A95-818C-EE6FFA4F09A5}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TriageDumpLocalVarLookup", "src\SOS\SOS.UnitTests\Debuggees\TriageDumpLocalVarLookup\TriageDumpLocalVarLookup.csproj", "{B042D2AB-D74C-46D8-94DD-68E9AA293FF5}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MiniDumpLocalVarLookup", "src\SOS\SOS.UnitTests\Debuggees\MiniDumpLocalVarLookup\MiniDumpLocalVarLookup.csproj", "{B042D2AB-D74C-46D8-94DD-68E9AA293FF5}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution