diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 6acf25d322..c091617ddb 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -1,13 +1,17 @@ - + https://github.com/microsoft/clrmd - 02791bfe45e47611bebc437caaf659319b5bd893 + f11663fc2e71ddd0869deb528047f0f476a0e346 - + https://github.com/microsoft/clrmd - 02791bfe45e47611bebc437caaf659319b5bd893 + f11663fc2e71ddd0869deb528047f0f476a0e346 + + + https://github.com/dotnet/command-line-api + e9b0511d7f1128e2bc3be7a658a2a4ea977e602d https://github.com/dotnet/android diff --git a/eng/Versions.props b/eng/Versions.props index b9e1382871..0c87ffac26 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -48,7 +48,7 @@ 8.0.0 6.0.0 - 4.0.0-beta.25380.1 + 4.0.0-beta.25381.2 17.10.0-beta1.24272.1 3.1.23 6.0.0 diff --git a/src/Tools/Common/DsRouterProcessLauncher.cs b/src/Tools/Common/DsRouterProcessLauncher.cs index 626c333227..e4c93efa30 100644 --- a/src/Tools/Common/DsRouterProcessLauncher.cs +++ b/src/Tools/Common/DsRouterProcessLauncher.cs @@ -127,8 +127,10 @@ public int Start(string dsrouterCommand, CancellationToken ct) dotnetDsrouterTool = Path.Combine(toolsRoot, dotnetDsrouterTool); } + using Process currentProcess = Process.GetCurrentProcess(); + // Block SIGINT and SIGQUIT in child process. - dsrouterCommand += " --block-signals SIGINT;SIGQUIT"; + dsrouterCommand += $" --block-signals SIGINT;SIGQUIT --parentprocess \"{currentProcess.Id}:{currentProcess.ProcessName}\""; _childProc = new Process(); diff --git a/src/Tools/dotnet-dsrouter/DiagnosticsServerRouterCommands.cs b/src/Tools/dotnet-dsrouter/DiagnosticsServerRouterCommands.cs index f7f64a122f..bc0b0a3473 100644 --- a/src/Tools/dotnet-dsrouter/DiagnosticsServerRouterCommands.cs +++ b/src/Tools/dotnet-dsrouter/DiagnosticsServerRouterCommands.cs @@ -357,41 +357,41 @@ public async Task RunIpcClientWebSocketServerRouter(CancellationToken token } } - public async Task RunIpcServerIOSSimulatorRouter(CancellationToken token, int runtimeTimeout, string verbose, bool info) + public async Task RunIpcServerIOSSimulatorRouter(CancellationToken token, int runtimeTimeout, string verbose, bool info, string parentProcess) { if (info || ParseLogLevel(verbose) <= LogLevel.Information) { - logRouterUsageInfo("ios simulator", "127.0.0.1:9000", true); + logRouterUsageInfo("ios simulator", "127.0.0.1", "9000", true, parentProcess); } return await RunIpcServerTcpClientRouter(token, "", "127.0.0.1:9000", runtimeTimeout, verbose, "").ConfigureAwait(false); } - public async Task RunIpcServerIOSRouter(CancellationToken token, int runtimeTimeout, string verbose, bool info) + public async Task RunIpcServerIOSRouter(CancellationToken token, int runtimeTimeout, string verbose, bool info, string parentProcess) { if (info || ParseLogLevel(verbose) <= LogLevel.Information) { - logRouterUsageInfo("ios device", "127.0.0.1:9000", true); + logRouterUsageInfo("ios device", "127.0.0.1", "9000", true, parentProcess); } return await RunIpcServerTcpClientRouter(token, "", "127.0.0.1:9000", runtimeTimeout, verbose, "iOS").ConfigureAwait(false); } - public async Task RunIpcServerAndroidEmulatorRouter(CancellationToken token, int runtimeTimeout, string verbose, bool info) + public async Task RunIpcServerAndroidEmulatorRouter(CancellationToken token, int runtimeTimeout, string verbose, bool info, string parentProcess) { if (info || ParseLogLevel(verbose) <= LogLevel.Information) { - logRouterUsageInfo("android emulator", "10.0.2.2:9000", false); + logRouterUsageInfo("android emulator", "10.0.2.2", "9000", false, parentProcess); } return await RunIpcServerTcpServerRouter(token, "", "127.0.0.1:9000", runtimeTimeout, verbose, "").ConfigureAwait(false); } - public async Task RunIpcServerAndroidRouter(CancellationToken token, int runtimeTimeout, string verbose, bool info) + public async Task RunIpcServerAndroidRouter(CancellationToken token, int runtimeTimeout, string verbose, bool info, string parentProcess) { if (info || ParseLogLevel(verbose) <= LogLevel.Information) { - logRouterUsageInfo("android device", "127.0.0.1:9000", false); + logRouterUsageInfo("android device", "127.0.0.1", "9000", false, parentProcess); } return await RunIpcServerTcpServerRouter(token, "", "127.0.0.1:9001", runtimeTimeout, verbose, "Android").ConfigureAwait(false); @@ -501,7 +501,7 @@ private static LogLevel ParseLogLevel(string verbose) return logLevel; } - private static void logRouterUsageInfo(string deviceName, string deviceTcpIpAddress, bool deviceListenMode) + private static void logRouterUsageInfo(string deviceName, string deviceTcpIpAddress, string deviceTcpIpPort, bool deviceListenMode, string parentProcess) { StringBuilder message = new(); @@ -509,13 +509,16 @@ private static void logRouterUsageInfo(string deviceName, string deviceTcpIpAddr int pid = Process.GetCurrentProcess().Id; message.AppendLine($"How to connect current dotnet-dsrouter pid={pid} with {deviceName} and diagnostics tooling."); - message.AppendLine($"Start an application on {deviceName} with ONE of the following environment variables set:"); + message.AppendLine($"Build and run your application on {deviceName} such as:"); message.AppendLine("[Default Tracing]"); - message.AppendLine($"DOTNET_DiagnosticPorts={deviceTcpIpAddress},nosuspend,{listenMode}"); + message.AppendLine($"dotnet build -t:Run -c Release -p:DiagnosticAddress={deviceTcpIpAddress} -p:DiagnosticPort={deviceTcpIpPort} -p:DiagnosticSuspend=false -p:DiagnosticListenMode={listenMode}"); message.AppendLine("[Startup Tracing]"); - message.AppendLine($"DOTNET_DiagnosticPorts={deviceTcpIpAddress},suspend,{listenMode}"); - message.AppendLine($"Run diagnotic tool connecting application on {deviceName} through dotnet-dsrouter pid={pid}:"); - message.AppendLine($"dotnet-trace collect -p {pid}"); + message.AppendLine($"dotnet build -t:Run -c Release -p:DiagnosticAddress={deviceTcpIpAddress} -p:DiagnosticPort={deviceTcpIpPort} -p:DiagnosticSuspend=true -p:DiagnosticListenMode={listenMode}"); + if (string.IsNullOrEmpty(parentProcess)) + { + message.AppendLine($"Run diagnotic tool connecting application on {deviceName} through dotnet-dsrouter pid={pid}:"); + message.AppendLine($"dotnet-trace collect -p {pid}"); + } message.AppendLine($"See https://learn.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-dsrouter for additional details and examples."); ConsoleColor currentColor = Console.ForegroundColor; diff --git a/src/Tools/dotnet-dsrouter/Program.cs b/src/Tools/dotnet-dsrouter/Program.cs index 5449a9dead..bfd3deecfd 100644 --- a/src/Tools/dotnet-dsrouter/Program.cs +++ b/src/Tools/dotnet-dsrouter/Program.cs @@ -156,14 +156,15 @@ private static Command IOSSimulatorRouterCommand() "Router is configured using an IPC server (connecting to by diagnostic tools) " + "and a TCP/IP server (accepting runtime TCP client).") { - RuntimeTimeoutOption, VerboseOption, InfoOption, BlockedSignalsOption + RuntimeTimeoutOption, VerboseOption, InfoOption, BlockedSignalsOption, ParentProcessOption }; command.SetAction((parseResult, ct) => new DiagnosticsServerRouterCommands().RunIpcServerIOSSimulatorRouter( ct, runtimeTimeout: parseResult.GetValue(RuntimeTimeoutOption), verbose: parseResult.GetValue(VerboseOption), - info: parseResult.GetValue(InfoOption) + info: parseResult.GetValue(InfoOption), + parentProcess: parseResult.GetValue(ParentProcessOption) )); return command; @@ -177,14 +178,15 @@ private static Command IOSRouterCommand() "Router is configured using an IPC server (connecting to by diagnostic tools) " + "and a TCP/IP client (connecting runtime TCP server over usbmux).") { - RuntimeTimeoutOption, VerboseOption, InfoOption, BlockedSignalsOption + RuntimeTimeoutOption, VerboseOption, InfoOption, BlockedSignalsOption, ParentProcessOption }; command.SetAction((parseResult, ct) => new DiagnosticsServerRouterCommands().RunIpcServerIOSRouter( ct, runtimeTimeout: parseResult.GetValue(RuntimeTimeoutOption), verbose: parseResult.GetValue(VerboseOption), - info: parseResult.GetValue(InfoOption) + info: parseResult.GetValue(InfoOption), + parentProcess: parseResult.GetValue(ParentProcessOption) )); return command; @@ -198,14 +200,16 @@ private static Command AndroidEmulatorRouterCommand() "Router is configured using an IPC server (connecting to by diagnostic tools) " + "and a TCP/IP server (accepting runtime TCP client).") { - RuntimeTimeoutOption, VerboseOption, InfoOption, BlockedSignalsOption + RuntimeTimeoutOption, VerboseOption, InfoOption, BlockedSignalsOption, ParentProcessOption }; command.SetAction((parseResult, ct) => new DiagnosticsServerRouterCommands().RunIpcServerAndroidEmulatorRouter( ct, runtimeTimeout: parseResult.GetValue(RuntimeTimeoutOption), verbose: parseResult.GetValue(VerboseOption), - info: parseResult.GetValue(InfoOption))); + info: parseResult.GetValue(InfoOption), + parentProcess: parseResult.GetValue(ParentProcessOption) + )); return command; } @@ -218,14 +222,16 @@ private static Command AndroidRouterCommand() "Router is configured using an IPC server (connecting to by diagnostic tools) " + "and a TCP/IP server (accepting runtime TCP client).") { - RuntimeTimeoutOption, VerboseOption, InfoOption, BlockedSignalsOption + RuntimeTimeoutOption, VerboseOption, InfoOption, BlockedSignalsOption, ParentProcessOption }; command.SetAction((parseResult, ct) => new DiagnosticsServerRouterCommands().RunIpcServerAndroidRouter( ct, runtimeTimeout: parseResult.GetValue(RuntimeTimeoutOption), verbose: parseResult.GetValue(VerboseOption), - info: parseResult.GetValue(InfoOption))); + info: parseResult.GetValue(InfoOption), + parentProcess: parseResult.GetValue(ParentProcessOption) + )); return command; } @@ -304,6 +310,14 @@ private static Command AndroidRouterCommand() Description = "Print info on how to use current dotnet-dsrouter instance with application and diagnostic tooling." }; + private static readonly Option ParentProcessOption = + new("--parentprocess") + { + Description = "If dsrouter was launched from dotnet-trace or another .NET diagnostic tool, contains the parent process ID and name: --parentprocess pid:name", + DefaultValueFactory = _ => "", + Hidden = true + }; + private static Task Main(string[] args) { RootCommand rootCommand = new()