diff --git a/src/Platform/Microsoft.Testing.Extensions.HangDump/HangDumpProcessLifetimeHandler.cs b/src/Platform/Microsoft.Testing.Extensions.HangDump/HangDumpProcessLifetimeHandler.cs index 7f7ffa4b7b..06f1fa1044 100644 --- a/src/Platform/Microsoft.Testing.Extensions.HangDump/HangDumpProcessLifetimeHandler.cs +++ b/src/Platform/Microsoft.Testing.Extensions.HangDump/HangDumpProcessLifetimeHandler.cs @@ -379,42 +379,48 @@ private async Task TakeDumpAsync() await _outputDisplay.DisplayAsync(this, new ErrorMessageOutputDeviceData(string.Format(CultureInfo.InvariantCulture, ExtensionResources.CreatingDumpFile, finalDumpFileName))); -#if NETCOREAPP - DiagnosticsClient diagnosticsClient = new(_testHostProcessInformation.PID); - DumpType dumpType = _dumpType.ToLowerInvariant().Trim() switch - { - "mini" => DumpType.Normal, - "heap" => DumpType.WithHeap, - "triage" => DumpType.Triage, - "full" => DumpType.Full, - _ => throw ApplicationStateGuard.Unreachable(), - }; - - // Wrap the dump path into "" when it has space in it, this is a workaround for this runtime issue: https://github.com/dotnet/diagnostics/issues/5020 - // It only affects windows. Otherwise the dump creation fails with: [createdump] The pid argument is no longer supported - if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows) && finalDumpFileName.Contains(' ')) + try { - finalDumpFileName = $"\"{finalDumpFileName}\""; - } +#if NETCOREAPP + DiagnosticsClient diagnosticsClient = new(_testHostProcessInformation.PID); + DumpType dumpType = _dumpType.ToLowerInvariant().Trim() switch + { + "mini" => DumpType.Normal, + "heap" => DumpType.WithHeap, + "triage" => DumpType.Triage, + "full" => DumpType.Full, + _ => throw ApplicationStateGuard.Unreachable(), + }; + + // Wrap the dump path into "" when it has space in it, this is a workaround for this runtime issue: https://github.com/dotnet/diagnostics/issues/5020 + // It only affects windows. Otherwise the dump creation fails with: [createdump] The pid argument is no longer supported + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows) && finalDumpFileName.Contains(' ')) + { + finalDumpFileName = $"\"{finalDumpFileName}\""; + } - diagnosticsClient.WriteDump(dumpType, finalDumpFileName, true); + diagnosticsClient.WriteDump(dumpType, finalDumpFileName, true); #else - MiniDumpWriteDump.MiniDumpTypeOption miniDumpTypeOption = _dumpType.ToLowerInvariant().Trim() switch - { - "mini" => MiniDumpWriteDump.MiniDumpTypeOption.Mini, - "heap" => MiniDumpWriteDump.MiniDumpTypeOption.Heap, - "full" => MiniDumpWriteDump.MiniDumpTypeOption.Full, - _ => throw ApplicationStateGuard.Unreachable(), - }; + MiniDumpWriteDump.MiniDumpTypeOption miniDumpTypeOption = _dumpType.ToLowerInvariant().Trim() switch + { + "mini" => MiniDumpWriteDump.MiniDumpTypeOption.Mini, + "heap" => MiniDumpWriteDump.MiniDumpTypeOption.Heap, + "full" => MiniDumpWriteDump.MiniDumpTypeOption.Full, + _ => throw ApplicationStateGuard.Unreachable(), + }; - MiniDumpWriteDump.CollectDumpUsingMiniDumpWriteDump(_testHostProcessInformation.PID, finalDumpFileName, miniDumpTypeOption); + MiniDumpWriteDump.CollectDumpUsingMiniDumpWriteDump(_testHostProcessInformation.PID, finalDumpFileName, miniDumpTypeOption); #endif - NotifyCrashDumpServiceIfEnabled(); - using IProcess process = _processHandler.GetProcessById(_testHostProcessInformation.PID); - process.Kill(); - await process.WaitForExitAsync(); - _dumpFileTaken = finalDumpFileName; + _dumpFileTaken = finalDumpFileName; + } + finally + { + NotifyCrashDumpServiceIfEnabled(); + using IProcess process = _processHandler.GetProcessById(_testHostProcessInformation.PID); + process.Kill(); + await process.WaitForExitAsync(); + } } private static void NotifyCrashDumpServiceIfEnabled()