private async Task RunTest(TestConfiguration config, string testName, string debuggeeName, string scriptName, string debuggeeArguments = null, bool useCreateDump = true) { SkipIfArm(config); // Live using (SOSRunner runner = await SOSRunner.StartDebugger(config, Output, testName, debuggeeName, debuggeeArguments)) { await runner.RunScript(scriptName); } // Generate a crash dump. if (IsCreateDumpConfig(config)) { await SOSRunner.CreateDump(config, Output, testName, debuggeeName, debuggeeArguments, useCreateDump); } // Test against a crash dump. if (IsOpenDumpConfig(config)) { // With cdb (Windows) or lldb (Linux or OSX) using (SOSRunner runner = await SOSRunner.StartDebugger(config, Output, testName, debuggeeName, debuggeeArguments, SOSRunner.Options.LoadDump)) { await runner.RunScript(scriptName); } // With the dotnet-dump analyze tool if (OS.Kind == OSKind.Linux) { using (SOSRunner runner = await SOSRunner.StartDebugger(config, Output, testName, debuggeeName, debuggeeArguments, SOSRunner.Options.LoadDumpWithDotNetDump)) { await runner.RunScript(scriptName); } } } }
private async Task RunTest(string scriptName, bool testLive = true, bool testDump = true, SOSRunner.TestInformation information = null) { information.OutputHelper = Output; if (testLive) { // Live using (SOSRunner runner = await SOSRunner.StartDebugger(information, SOSRunner.DebuggerAction.Live)) { await runner.RunScript(scriptName); } } if (testDump) { string dumpName = null; // Create and test dumps on OSX or Alpine only if the runtime is 6.0 or greater if (!(OS.Kind == OSKind.OSX || OS.IsAlpine) || information.TestConfiguration.RuntimeFrameworkVersionMajor > 5) { // Generate a crash dump. if (information.DebuggeeDumpOutputRootDir != null) { dumpName = await SOSRunner.CreateDump(information); } // Test against a crash dump. if (information.DebuggeeDumpInputRootDir != null) { // With cdb (Windows) or lldb (Linux) using (SOSRunner runner = await SOSRunner.StartDebugger(information, SOSRunner.DebuggerAction.LoadDump)) { await runner.RunScript(scriptName); } // Using the dotnet-dump analyze tool if the path exists in the config file. // TODO: dotnet-dump currently doesn't support macho core dumps that the MacOS createdump generates if (information.TestConfiguration.DotNetDumpPath() != null && OS.Kind != OSKind.OSX) { // Don't test dotnet-dump on triage dumps when running on desktop CLR. if (information.TestConfiguration.IsNETCore || information.DumpType != SOSRunner.DumpType.Triage) { using (SOSRunner runner = await SOSRunner.StartDebugger(information, SOSRunner.DebuggerAction.LoadDumpWithDotNetDump)) { await runner.RunScript(scriptName); } } } } // Test the crash report json file if (dumpName != null && information.TestCrashReport) { TestCrashReport(dumpName, information); } } } }
private async Task RunTest(string scriptName, bool testLive = true, bool testDump = true, SOSRunner.TestInformation information = null) { information.OutputHelper = Output; if (testLive && !SOSRunner.IsAlpine()) { // Live using (SOSRunner runner = await SOSRunner.StartDebugger(information, SOSRunner.DebuggerAction.Live)) { await runner.RunScript(scriptName); } } if (testDump) { // Create and test dumps on OSX only if the runtime is 6.0 or greater // TODO: reenable for 5.0 when the MacOS createdump fixes make it into a service release (https://github.com/dotnet/diagnostics/issues/1749) if (OS.Kind != OSKind.OSX || information.TestConfiguration.RuntimeFrameworkVersionMajor > 5) { // Generate a crash dump. if (information.TestConfiguration.DebuggeeDumpOutputRootDir() != null) { if (information.DumpGenerator == SOSRunner.DumpGenerator.NativeDebugger && SOSRunner.IsAlpine()) { throw new SkipTestException("lldb tests not supported on Alpine"); } await SOSRunner.CreateDump(information); } // Test against a crash dump. if (information.TestConfiguration.DebuggeeDumpInputRootDir() != null) { if (!SOSRunner.IsAlpine()) { // With cdb (Windows) or lldb (Linux) using (SOSRunner runner = await SOSRunner.StartDebugger(information, SOSRunner.DebuggerAction.LoadDump)) { await runner.RunScript(scriptName); } } // Using the dotnet-dump analyze tool if the path exists in the config file. // TODO: dotnet-dump currently doesn't support macho core dumps that the MacOS createdump generates if (information.TestConfiguration.DotNetDumpPath() != null && OS.Kind != OSKind.OSX) { // Don't test dotnet-dump on triage dumps when running on desktop CLR. if (information.TestConfiguration.IsNETCore || information.DumpType != SOSRunner.DumpType.Triage) { using (SOSRunner runner = await SOSRunner.StartDebugger(information, SOSRunner.DebuggerAction.LoadDumpWithDotNetDump)) { await runner.RunScript(scriptName); } } } } } } }
public async Task GCTests(TestConfiguration config) { // Live only SkipIfArm(config); using (SOSRunner runner = await SOSRunner.StartDebugger(config, Output, testName: "SOS.GCTests", debuggeeName: "GCWhere")) { await runner.RunScript("GCTests.script"); } }
private async Task RunTest(string scriptName, bool testLive = true, bool testDump = true, SOSRunner.TestInformation information = null) { information.OutputHelper = Output; if (testLive && !SOSRunner.IsAlpine()) { // Live using (SOSRunner runner = await SOSRunner.StartDebugger(information, SOSRunner.DebuggerAction.Live)) { await runner.RunScript(scriptName); } } if (testDump) { // Create and test dumps on OSX only if the runtime is 5.0 or greater if (OS.Kind != OSKind.OSX || information.TestConfiguration.RuntimeFrameworkVersionMajor >= 5) { // Generate a crash dump. if (information.TestConfiguration.DebuggeeDumpOutputRootDir() != null) { if (information.DumpGenerator == SOSRunner.DumpGenerator.NativeDebugger && SOSRunner.IsAlpine()) { throw new SkipTestException("lldb tests not supported on Alpine"); } await SOSRunner.CreateDump(information); } // Test against a crash dump. if (information.TestConfiguration.DebuggeeDumpInputRootDir() != null) { if (!SOSRunner.IsAlpine() && OS.Kind != OSKind.OSX) { // With cdb (Windows) or lldb (Linux) using (SOSRunner runner = await SOSRunner.StartDebugger(information, SOSRunner.DebuggerAction.LoadDump)) { await runner.RunScript(scriptName); } } // Using the dotnet-dump analyze tool if the path exists in the config file. if (information.TestConfiguration.DotNetDumpPath() != null) { // Don't test dotnet-dump on triage dumps when running on desktop CLR. if (information.TestConfiguration.IsNETCore || information.DumpType != SOSRunner.DumpType.Triage) { using (SOSRunner runner = await SOSRunner.StartDebugger(information, SOSRunner.DebuggerAction.LoadDumpWithDotNetDump)) { await runner.RunScript(scriptName); } } } } } } }
private async Task RunTest(string scriptName, SOSRunner.TestInformation information) { information.OutputHelper = Output; if (information.TestLive) { // Live using (SOSRunner runner = await SOSRunner.StartDebugger(information, SOSRunner.DebuggerAction.Live)) { await runner.RunScript(scriptName); } } if (information.TestDump) { string dumpName = null; // Generate a crash dump. if (information.DebuggeeDumpOutputRootDir != null) { dumpName = await SOSRunner.CreateDump(information); } // Test against a crash dump. if (information.DebuggeeDumpInputRootDir != null) { // With cdb (Windows) or lldb (Linux) using (SOSRunner runner = await SOSRunner.StartDebugger(information, SOSRunner.DebuggerAction.LoadDump)) { await runner.RunScript(scriptName); } // Using the dotnet-dump analyze tool if the path exists in the config file. if (information.TestConfiguration.DotNetDumpPath() != null) { // Don't test dotnet-dump on triage dumps when running on desktop CLR. if (information.TestConfiguration.IsNETCore || information.DumpType != SOSRunner.DumpType.Triage) { using (SOSRunner runner = await SOSRunner.StartDebugger(information, SOSRunner.DebuggerAction.LoadDumpWithDotNetDump)) { await runner.RunScript(scriptName); } } } } // Test the crash report json file if (dumpName != null && information.TestCrashReport) { TestCrashReport(dumpName, information); } } }
public async Task GCTests(TestConfiguration config) { // Live only SkipIfArm(config); if (SOSRunner.IsAlpine()) { throw new SkipTestException("lldb tests not supported on Alpine"); } using (SOSRunner runner = await SOSRunner.StartDebugger(config, Output, testName: "SOS.GCTests", debuggeeName: "GCWhere")) { await runner.RunScript("GCTests.script"); } }
private async Task RunTest(string scriptName, bool testLive = true, bool testDump = true, SOSRunner.TestInformation information = null) { information.OutputHelper = Output; if (testLive && !SOSRunner.IsAlpine()) { // Live using (SOSRunner runner = await SOSRunner.StartDebugger(information, SOSRunner.DebuggerAction.Live)) { await runner.RunScript(scriptName); } } if (testDump) { // Generate a crash dump. if (information.TestConfiguration.DebuggeeDumpOutputRootDir() != null) { if (information.DumpGenerator == SOSRunner.DumpGenerator.NativeDebugger && SOSRunner.IsAlpine()) { throw new SkipTestException("lldb tests not supported on Alpine"); } await SOSRunner.CreateDump(information); } // Test against a crash dump. if (information.TestConfiguration.DebuggeeDumpInputRootDir() != null) { if (!SOSRunner.IsAlpine()) { // With cdb (Windows) or lldb (Linux or OSX) using (SOSRunner runner = await SOSRunner.StartDebugger(information, SOSRunner.DebuggerAction.LoadDump)) { await runner.RunScript(scriptName); } } // With the dotnet-dump analyze tool if (information.TestConfiguration.DotNetDumpPath() != null) { using (SOSRunner runner = await SOSRunner.StartDebugger(information, SOSRunner.DebuggerAction.LoadDumpWithDotNetDump)) { await runner.RunScript(scriptName); } } } } }
private async Task RunTest(TestConfiguration config, string testName, string debuggeeName, string scriptName, string debuggeeArguments = null, bool useCreateDump = true) { SkipIfArm(config); if (!SOSRunner.IsAlpine()) { // Live using (SOSRunner runner = await SOSRunner.StartDebugger(config, Output, testName, debuggeeName, debuggeeArguments)) { await runner.RunScript(scriptName); } } // Generate a crash dump. if (IsCreateDumpConfig(config)) { if (!useCreateDump && SOSRunner.IsAlpine()) { throw new SkipTestException("lldb tests not supported on Alpine"); } await SOSRunner.CreateDump(config, Output, testName, debuggeeName, debuggeeArguments, useCreateDump); } // Test against a crash dump. if (IsOpenDumpConfig(config)) { if (!SOSRunner.IsAlpine()) { // With cdb (Windows) or lldb (Linux or OSX) using (SOSRunner runner = await SOSRunner.StartDebugger(config, Output, testName, debuggeeName, debuggeeArguments, SOSRunner.Options.LoadDump)) { await runner.RunScript(scriptName); } } // With the dotnet-dump analyze tool if (config.DotNetDumpPath() != null) { using (SOSRunner runner = await SOSRunner.StartDebugger(config, Output, testName, debuggeeName, debuggeeArguments, SOSRunner.Options.LoadDumpWithDotNetDump)) { await runner.RunScript(scriptName); } } } }
private async Task RunTest(TestConfiguration config, string testName, string debuggeeName, string scriptName, string debuggeeArguments = null, bool useCreateDump = true) { SkipIfArm(config); // Live using (SOSRunner runner = await SOSRunner.StartDebugger(config, Output, testName, debuggeeName, debuggeeArguments)) { await runner.RunScript(scriptName); } // Against a crash dump. if (IsCreateDumpConfig(config)) { await SOSRunner.CreateDump(config, Output, testName, debuggeeName, debuggeeArguments, useCreateDump); } if (IsOpenDumpConfig(config)) { using (SOSRunner runner = await SOSRunner.StartDebugger(config, Output, testName, debuggeeName, debuggeeArguments, loadDump: true)) { await runner.RunScript(scriptName); } } }
/// <summary> /// Run a debuggee and create a dump. /// </summary> /// <param name="config">test configuration</param> /// <param name="output">output instance</param> /// <param name="testName">name of test</param> /// <param name="debuggeeName">debuggee name</param> /// <param name="debuggeeArguments">optional args to pass to debuggee</param> /// <param name="useCreateDump">if true, use "createdump" to generate core dump</param> public static async Task CreateDump(TestConfiguration config, ITestOutputHelper output, string testName, string debuggeeName, string debuggeeArguments = null, bool useCreateDump = true) { Directory.CreateDirectory(config.DebuggeeDumpOutputRootDir()); if (!config.CreateDumpExists || !useCreateDump || config.GenerateDumpWithLLDB() || config.GenerateDumpWithGDB()) { using (SOSRunner runner = await SOSRunner.StartDebugger(config, output, testName, debuggeeName, debuggeeArguments, Options.GenerateDump)) { try { await runner.LoadSosExtension(); string command = null; switch (runner.Debugger) { case SOSRunner.NativeDebugger.Cdb: await runner.ContinueExecution(); // On desktop create triage dump. On .NET Core, create full dump. command = config.IsDesktop ? ".dump /o /mshuRp %DUMP_NAME%" : ".dump /o /ma %DUMP_NAME%"; break; case SOSRunner.NativeDebugger.Gdb: command = "generate-core-file %DUMP_NAME%"; break; case SOSRunner.NativeDebugger.Lldb: await runner.ContinueExecution(); command = "sos CreateDump %DUMP_NAME%"; break; default: throw new Exception(runner.Debugger.ToString() + " does not support creating dumps"); } await runner.RunCommand(command); await runner.QuitDebugger(); } catch (Exception ex) { runner.WriteLine(ex.ToString()); throw; } } } else { TestRunner.OutputHelper outputHelper = null; try { // Setup the logging from the options in the config file outputHelper = TestRunner.ConfigureLogging(config, output, testName); // Restore and build the debuggee. The debuggee name is lower cased because the // source directory name has been lowercased by the build system. DebuggeeConfiguration debuggeeConfig = await DebuggeeCompiler.Execute(config, debuggeeName, outputHelper); outputHelper.WriteLine("Starting {0}", testName); outputHelper.WriteLine("{"); // Get the full debuggee launch command line (includes the host if required) string exePath = debuggeeConfig.BinaryExePath; var arguments = new StringBuilder(); if (!string.IsNullOrWhiteSpace(config.HostExe)) { exePath = config.HostExe; if (!string.IsNullOrWhiteSpace(config.HostArgs)) { arguments.Append(config.HostArgs); arguments.Append(" "); } arguments.Append(debuggeeConfig.BinaryExePath); } if (!string.IsNullOrWhiteSpace(debuggeeArguments)) { arguments.Append(" "); arguments.Append(debuggeeArguments); } // Run the debuggee with the createdump environment variables set to generate a coredump on unhandled exception var testLogger = new TestRunner.TestLogger(outputHelper.IndentedOutput); var variables = GenerateVariables(config, debuggeeConfig, Options.GenerateDump); ProcessRunner processRunner = new ProcessRunner(exePath, ReplaceVariables(variables, arguments.ToString())). WithLog(testLogger). WithTimeout(TimeSpan.FromMinutes(5)). WithEnvironmentVariable("COMPlus_DbgEnableMiniDump", "1"). WithEnvironmentVariable("COMPlus_DbgMiniDumpName", ReplaceVariables(variables, "%DUMP_NAME%")); processRunner.Start(); // Wait for the debuggee to finish await processRunner.WaitForExit(); } catch (Exception ex) { // Log the exception outputHelper?.WriteLine(ex.ToString()); throw; } finally { outputHelper?.WriteLine("}"); outputHelper?.Dispose(); } } }