Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
<InternalsVisibleTo Include="dotnet-dsrouter" />
<InternalsVisibleTo Include="dotnet-monitor" />
<InternalsVisibleTo Include="dotnet-trace" />
<InternalsVisibleTo Include="dotnet-dump" />
<InternalsVisibleTo Include="Microsoft.Diagnostics.Monitoring" />
<InternalsVisibleTo Include="Microsoft.Diagnostics.Monitoring.EventPipe" />
<InternalsVisibleTo Include="Microsoft.Diagnostics.WebSocketServer" />
Expand Down
42 changes: 19 additions & 23 deletions src/Tools/dotnet-dump/Dumper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,32 +31,14 @@ public Dumper()
{
}

public int Collect(TextWriter stdOutput, TextWriter stdError, int processId, string output, bool diag, bool crashreport, DumpTypeOption type, string name)
public int Collect(TextWriter stdOutput, TextWriter stdError, int processId, string output, bool diag, bool crashreport, DumpTypeOption type, string name, string diagnosticPort)
{
Console.WriteLine(name);
if (name != null)
if (CommandUtils.ResolveProcessForAttach(processId, name, diagnosticPort, string.Empty, out int resolvedProcessId))
{
if (processId != 0)
{
Console.WriteLine("Can only specify either --name or --process-id option.");
return -1;
}
processId = CommandUtils.FindProcessIdWithName(name);
if (processId < 0)
{
return -1;
}
processId = resolvedProcessId;
}

if (processId == 0)
else
{
Console.Error.WriteLine("ProcessId is required.");
return -1;
}

if (processId < 0)
{
Console.Error.WriteLine($"The PID cannot be negative: {processId}");
return -1;
}

Expand Down Expand Up @@ -103,7 +85,21 @@ public int Collect(TextWriter stdOutput, TextWriter stdError, int processId, str
}
else
{
DiagnosticsClient client = new(processId);
DiagnosticsClient client;
if (!string.IsNullOrEmpty(diagnosticPort))
{
IpcEndpointConfig diagnosticPortConfig = IpcEndpointConfig.Parse(diagnosticPort);
if (!diagnosticPortConfig.IsConnectConfig)
{
Console.WriteLine("dotnet-dump only supports connect mode to a runtime.");
return -1;
}
client = new DiagnosticsClient(diagnosticPortConfig);
}
else
{
client = new DiagnosticsClient(processId);
}

DumpType dumpType = DumpType.Normal;
switch (type)
Expand Down
11 changes: 9 additions & 2 deletions src/Tools/dotnet-dump/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ private static Command CollectCommand()
{
Command command = new(name: "collect", description: "Capture dumps from a process")
{
ProcessIdOption, OutputOption, DiagnosticLoggingOption, CrashReportOption, TypeOption, ProcessNameOption
ProcessIdOption, OutputOption, DiagnosticLoggingOption, CrashReportOption, TypeOption, ProcessNameOption, DiagnosticPortOption
};

command.SetAction((parseResult, ct) => Task.FromResult(new Dumper().Collect(
Expand All @@ -39,7 +39,8 @@ private static Command CollectCommand()
diag: parseResult.GetValue(DiagnosticLoggingOption),
crashreport: parseResult.GetValue(CrashReportOption),
type: parseResult.GetValue(TypeOption),
name: parseResult.GetValue(ProcessNameOption))));
name: parseResult.GetValue(ProcessNameOption),
diagnosticPort: parseResult.GetValue(DiagnosticPortOption))));

return command;
}
Expand Down Expand Up @@ -82,6 +83,12 @@ private static Command CollectCommand()
DefaultValueFactory = _ => Dumper.DumpTypeOption.Full
};

private static readonly Option<string> DiagnosticPortOption =
new("--diagnostic-port", "--dport")
{
Description = "The path to a diagnostic port to be used. Must be a runtime connect port."
};

private static Command AnalyzeCommand()
{
Command command = new(
Expand Down
Loading