From bd97baced6481e5527cd18f36fb9c0a721d6ab21 Mon Sep 17 00:00:00 2001 From: Mike McLaughlin Date: Tue, 9 Apr 2024 21:54:03 -0700 Subject: [PATCH] Fix issue #4464 - dotnet-dump (and other tools) Access Denied when /tmp is R/O (#4593) --- src/Tools/Common/CommandExtensions.cs | 24 +++++++++++++++++-- src/Tools/Common/Commands/ProcessStatus.cs | 2 +- src/Tools/dotnet-counters/Program.cs | 4 ++-- src/Tools/dotnet-dsrouter/Program.cs | 4 ++-- src/Tools/dotnet-dump/Program.cs | 4 ++-- .../CommandLine/CollectCommandHandler.cs | 2 +- .../CommandLine/ConvertCommandHandler.cs | 2 +- .../CommandLine/ReportCommandHandler.cs | 4 ++-- src/Tools/dotnet-gcdump/Program.cs | 3 ++- src/Tools/dotnet-sos/Program.cs | 4 ++-- src/Tools/dotnet-stack/Program.cs | 3 ++- src/Tools/dotnet-stack/ReportCommand.cs | 2 +- src/Tools/dotnet-stack/Symbolicate.cs | 2 +- .../CommandLine/Commands/CollectCommand.cs | 2 +- .../CommandLine/Commands/ConvertCommand.cs | 2 +- .../CommandLine/Commands/ReportCommand.cs | 2 +- src/Tools/dotnet-trace/Program.cs | 3 ++- 17 files changed, 46 insertions(+), 23 deletions(-) diff --git a/src/Tools/Common/CommandExtensions.cs b/src/Tools/Common/CommandExtensions.cs index 421bb2c74..58f91ce57 100644 --- a/src/Tools/Common/CommandExtensions.cs +++ b/src/Tools/Common/CommandExtensions.cs @@ -2,11 +2,12 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.CommandLine; +using System.CommandLine.Builder; using System.CommandLine.Invocation; -namespace Microsoft.Tools.Common +namespace Microsoft.Internal.Common { - public static class CommandExtenions + public static class CommandExtensions { /// /// Allows the command handler to be included in the collection initializer. @@ -15,5 +16,24 @@ namespace Microsoft.Tools.Common { command.Handler = handler; } + + /// + /// Setups the diagnostic tools defaults. Like .UseDefault except RegisterWithDotnetSuggest() which + /// causes problems on Linux systems with R/O /tmp directory. + /// + public static CommandLineBuilder UseToolsDefaults(this CommandLineBuilder builder) + { + return builder + .UseVersionOption() + .UseHelp() + .UseEnvironmentVariableDirective() + .UseParseDirective() + .UseDebugDirective() + .UseSuggestDirective() + .UseTypoCorrections() + .UseParseErrorReporting() + .UseExceptionHandler() + .CancelOnProcessTermination(); + } } } diff --git a/src/Tools/Common/Commands/ProcessStatus.cs b/src/Tools/Common/Commands/ProcessStatus.cs index 2c5c14187..524dc15cb 100644 --- a/src/Tools/Common/Commands/ProcessStatus.cs +++ b/src/Tools/Common/Commands/ProcessStatus.cs @@ -14,7 +14,7 @@ using System.Runtime.InteropServices; using System.Text; using Microsoft.Diagnostics.NETCore.Client; using Microsoft.Internal.Common.Utils; -using Microsoft.Tools.Common; +using Microsoft.Internal.Common; using Process = System.Diagnostics.Process; namespace Microsoft.Internal.Common.Commands diff --git a/src/Tools/dotnet-counters/Program.cs b/src/Tools/dotnet-counters/Program.cs index da00ca078..4870e3faf 100644 --- a/src/Tools/dotnet-counters/Program.cs +++ b/src/Tools/dotnet-counters/Program.cs @@ -11,9 +11,9 @@ using System.CommandLine.Parsing; using System.Linq; using System.Threading; using System.Threading.Tasks; +using Microsoft.Internal.Common; using Microsoft.Internal.Common.Commands; using Microsoft.Internal.Common.Utils; -using Microsoft.Tools.Common; namespace Microsoft.Diagnostics.Tools.Counters { @@ -250,7 +250,7 @@ namespace Microsoft.Diagnostics.Tools.Counters .AddCommand(CollectCommand()) .AddCommand(ListCommand()) .AddCommand(ProcessStatusCommandHandler.ProcessStatusCommand("Lists the dotnet processes that can be monitored.")) - .UseDefaults() + .UseToolsDefaults() .Build(); ParseResult parseResult = parser.Parse(args); diff --git a/src/Tools/dotnet-dsrouter/Program.cs b/src/Tools/dotnet-dsrouter/Program.cs index bc3b53281..ef5d4541a 100644 --- a/src/Tools/dotnet-dsrouter/Program.cs +++ b/src/Tools/dotnet-dsrouter/Program.cs @@ -8,8 +8,8 @@ using System.CommandLine.Builder; using System.CommandLine.Parsing; using System.Threading; using System.Threading.Tasks; +using Microsoft.Internal.Common; using Microsoft.Internal.Common.Utils; -using Microsoft.Tools.Common; namespace Microsoft.Diagnostics.Tools.DiagnosticsServerRouter { @@ -260,7 +260,7 @@ namespace Microsoft.Diagnostics.Tools.DiagnosticsServerRouter .AddCommand(IOSRouterCommand()) .AddCommand(AndroidEmulatorRouterCommand()) .AddCommand(AndroidRouterCommand()) - .UseDefaults() + .UseToolsDefaults() .Build(); ParseResult parseResult = parser.Parse(args); diff --git a/src/Tools/dotnet-dump/Program.cs b/src/Tools/dotnet-dump/Program.cs index ec1facfb4..76a6ab777 100644 --- a/src/Tools/dotnet-dump/Program.cs +++ b/src/Tools/dotnet-dump/Program.cs @@ -8,8 +8,8 @@ using System.CommandLine.Invocation; using System.CommandLine.Parsing; using System.IO; using System.Threading.Tasks; +using Microsoft.Internal.Common; using Microsoft.Internal.Common.Commands; -using Microsoft.Tools.Common; namespace Microsoft.Diagnostics.Tools.Dump { @@ -21,7 +21,7 @@ namespace Microsoft.Diagnostics.Tools.Dump .AddCommand(CollectCommand()) .AddCommand(AnalyzeCommand()) .AddCommand(ProcessStatusCommandHandler.ProcessStatusCommand("Lists the dotnet processes that dumps can be collected from.")) - .UseDefaults() + .UseToolsDefaults() .Build(); return parser.InvokeAsync(args); diff --git a/src/Tools/dotnet-gcdump/CommandLine/CollectCommandHandler.cs b/src/Tools/dotnet-gcdump/CommandLine/CollectCommandHandler.cs index 63f8912ec..5c18fa806 100644 --- a/src/Tools/dotnet-gcdump/CommandLine/CollectCommandHandler.cs +++ b/src/Tools/dotnet-gcdump/CommandLine/CollectCommandHandler.cs @@ -9,8 +9,8 @@ using System.Threading; using System.Threading.Tasks; using Graphs; using Microsoft.Diagnostics.NETCore.Client; +using Microsoft.Internal.Common; using Microsoft.Internal.Common.Utils; -using Microsoft.Tools.Common; namespace Microsoft.Diagnostics.Tools.GCDump { diff --git a/src/Tools/dotnet-gcdump/CommandLine/ConvertCommandHandler.cs b/src/Tools/dotnet-gcdump/CommandLine/ConvertCommandHandler.cs index 60de9b0e9..af04a9aba 100644 --- a/src/Tools/dotnet-gcdump/CommandLine/ConvertCommandHandler.cs +++ b/src/Tools/dotnet-gcdump/CommandLine/ConvertCommandHandler.cs @@ -5,7 +5,7 @@ using System; using System.CommandLine; using System.IO; using Graphs; -using Microsoft.Tools.Common; +using Microsoft.Internal.Common; namespace Microsoft.Diagnostics.Tools.GCDump { diff --git a/src/Tools/dotnet-gcdump/CommandLine/ReportCommandHandler.cs b/src/Tools/dotnet-gcdump/CommandLine/ReportCommandHandler.cs index 27dd2400e..538b2ef96 100644 --- a/src/Tools/dotnet-gcdump/CommandLine/ReportCommandHandler.cs +++ b/src/Tools/dotnet-gcdump/CommandLine/ReportCommandHandler.cs @@ -7,10 +7,10 @@ using System.CommandLine.Binding; using System.IO; using System.Threading; using System.Threading.Tasks; +using Microsoft.Diagnostics.NETCore.Client; using Microsoft.Diagnostics.Tools.GCDump.CommandLine; -using Microsoft.Tools.Common; +using Microsoft.Internal.Common; using Microsoft.Internal.Common.Utils; -using Microsoft.Diagnostics.NETCore.Client; namespace Microsoft.Diagnostics.Tools.GCDump { diff --git a/src/Tools/dotnet-gcdump/Program.cs b/src/Tools/dotnet-gcdump/Program.cs index 5de61d81a..dfb1cc902 100644 --- a/src/Tools/dotnet-gcdump/Program.cs +++ b/src/Tools/dotnet-gcdump/Program.cs @@ -4,6 +4,7 @@ using System.CommandLine.Builder; using System.CommandLine.Parsing; using System.Threading.Tasks; +using Microsoft.Internal.Common; using Microsoft.Internal.Common.Commands; namespace Microsoft.Diagnostics.Tools.GCDump @@ -17,7 +18,7 @@ namespace Microsoft.Diagnostics.Tools.GCDump .AddCommand(ProcessStatusCommandHandler.ProcessStatusCommand("Lists the dotnet processes that gcdumps can be collected from.")) .AddCommand(ReportCommandHandler.ReportCommand()) .AddCommand(ConvertCommandHandler.ConvertCommand()) - .UseDefaults() + .UseToolsDefaults() .Build(); return parser.InvokeAsync(args); diff --git a/src/Tools/dotnet-sos/Program.cs b/src/Tools/dotnet-sos/Program.cs index 31dc56e4b..983c81c9e 100644 --- a/src/Tools/dotnet-sos/Program.cs +++ b/src/Tools/dotnet-sos/Program.cs @@ -8,7 +8,7 @@ using System.CommandLine.IO; using System.CommandLine.Parsing; using System.Runtime.InteropServices; using System.Threading.Tasks; -using Microsoft.Tools.Common; +using Microsoft.Internal.Common; using SOS; namespace Microsoft.Diagnostics.Tools.SOS @@ -20,7 +20,7 @@ namespace Microsoft.Diagnostics.Tools.SOS Parser parser = new CommandLineBuilder() .AddCommand(InstallCommand()) .AddCommand(UninstallCommand()) - .UseDefaults() + .UseToolsDefaults() .Build(); return parser.InvokeAsync(args); diff --git a/src/Tools/dotnet-stack/Program.cs b/src/Tools/dotnet-stack/Program.cs index 3d9be0e48..fe208f761 100644 --- a/src/Tools/dotnet-stack/Program.cs +++ b/src/Tools/dotnet-stack/Program.cs @@ -4,6 +4,7 @@ using System.CommandLine.Builder; using System.CommandLine.Parsing; using System.Threading.Tasks; +using Microsoft.Internal.Common; using Microsoft.Internal.Common.Commands; namespace Microsoft.Diagnostics.Tools.Stack @@ -16,7 +17,7 @@ namespace Microsoft.Diagnostics.Tools.Stack .AddCommand(ReportCommandHandler.ReportCommand()) .AddCommand(ProcessStatusCommandHandler.ProcessStatusCommand("Lists the dotnet processes that stack traces can be collected from.")) .AddCommand(SymbolicateHandler.SymbolicateCommand()) - .UseDefaults() + .UseToolsDefaults() .Build(); return parser.InvokeAsync(args); diff --git a/src/Tools/dotnet-stack/ReportCommand.cs b/src/Tools/dotnet-stack/ReportCommand.cs index 76ca818ea..4684d58d0 100644 --- a/src/Tools/dotnet-stack/ReportCommand.cs +++ b/src/Tools/dotnet-stack/ReportCommand.cs @@ -15,8 +15,8 @@ using Microsoft.Diagnostics.Symbols; using Microsoft.Diagnostics.Tracing; using Microsoft.Diagnostics.Tracing.Etlx; using Microsoft.Diagnostics.Tracing.Stacks; +using Microsoft.Internal.Common; using Microsoft.Internal.Common.Utils; -using Microsoft.Tools.Common; namespace Microsoft.Diagnostics.Tools.Stack { diff --git a/src/Tools/dotnet-stack/Symbolicate.cs b/src/Tools/dotnet-stack/Symbolicate.cs index 7a258ff5d..442061788 100644 --- a/src/Tools/dotnet-stack/Symbolicate.cs +++ b/src/Tools/dotnet-stack/Symbolicate.cs @@ -12,7 +12,7 @@ using System.Reflection.Metadata; using System.Reflection.Metadata.Ecma335; using System.Reflection.PortableExecutable; using System.Text.RegularExpressions; -using Microsoft.Tools.Common; +using Microsoft.Internal.Common; namespace Microsoft.Diagnostics.Tools.Stack { diff --git a/src/Tools/dotnet-trace/CommandLine/Commands/CollectCommand.cs b/src/Tools/dotnet-trace/CommandLine/Commands/CollectCommand.cs index 96a13631e..7df395bb7 100644 --- a/src/Tools/dotnet-trace/CommandLine/Commands/CollectCommand.cs +++ b/src/Tools/dotnet-trace/CommandLine/Commands/CollectCommand.cs @@ -14,8 +14,8 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.Diagnostics.Monitoring.EventPipe; using Microsoft.Diagnostics.NETCore.Client; +using Microsoft.Internal.Common; using Microsoft.Internal.Common.Utils; -using Microsoft.Tools.Common; namespace Microsoft.Diagnostics.Tools.Trace { diff --git a/src/Tools/dotnet-trace/CommandLine/Commands/ConvertCommand.cs b/src/Tools/dotnet-trace/CommandLine/Commands/ConvertCommand.cs index 3e94fc673..75838ef29 100644 --- a/src/Tools/dotnet-trace/CommandLine/Commands/ConvertCommand.cs +++ b/src/Tools/dotnet-trace/CommandLine/Commands/ConvertCommand.cs @@ -7,7 +7,7 @@ using System.CommandLine; using System.CommandLine.IO; using System.IO; using System.Linq; -using Microsoft.Tools.Common; +using Microsoft.Internal.Common; namespace Microsoft.Diagnostics.Tools.Trace { diff --git a/src/Tools/dotnet-trace/CommandLine/Commands/ReportCommand.cs b/src/Tools/dotnet-trace/CommandLine/Commands/ReportCommand.cs index 5bf9c8603..87b7e8cad 100644 --- a/src/Tools/dotnet-trace/CommandLine/Commands/ReportCommand.cs +++ b/src/Tools/dotnet-trace/CommandLine/Commands/ReportCommand.cs @@ -14,7 +14,7 @@ using Microsoft.Diagnostics.Tools.Trace.CommandLine; using Microsoft.Diagnostics.Tracing; using Microsoft.Diagnostics.Tracing.Etlx; using Microsoft.Diagnostics.Tracing.Stacks; -using Microsoft.Tools.Common; +using Microsoft.Internal.Common; namespace Microsoft.Diagnostics.Tools.Trace { diff --git a/src/Tools/dotnet-trace/Program.cs b/src/Tools/dotnet-trace/Program.cs index 84e828f97..797e6073a 100644 --- a/src/Tools/dotnet-trace/Program.cs +++ b/src/Tools/dotnet-trace/Program.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.CommandLine.Builder; using System.CommandLine.Parsing; using System.Threading.Tasks; +using Microsoft.Internal.Common; using Microsoft.Internal.Common.Commands; using Microsoft.Internal.Common.Utils; @@ -20,7 +21,7 @@ namespace Microsoft.Diagnostics.Tools.Trace .AddCommand(ListProfilesCommandHandler.ListProfilesCommand()) .AddCommand(ConvertCommandHandler.ConvertCommand()) .AddCommand(ReportCommandHandler.ReportCommand()) - .UseDefaults() + .UseToolsDefaults() .Build(); ParseResult parseResult = parser.Parse(args); string parsedCommandName = parseResult.CommandResult.Command.Name; -- 2.34.1