================
@@ -182,6 +187,97 @@ static llvm::Error LaunchClient(const
llvm::opt::InputArgList &args) {
return ClientLauncher::GetLauncher(*client)->Launch(launch_args);
}
+/// Handles `--list-processes`: print the processes visible to the selected
+/// platform as a JSON array on stdout, then exit.
+///
+/// The JSON shape is intentionally minimal and stable:
+///
+/// [ { "pid": number, "name": string, "triple": string,
+/// "user": number, "executable": string }, ... ]
+///
+/// Fields other than `pid` are omitted if not available.
+static llvm::Error ListProcesses(const llvm::opt::InputArgList &args) {
+ llvm::StringRef platform_name = args.getLastArgValue(OPT_platform_name);
+ llvm::StringRef platform_url = args.getLastArgValue(OPT_platform_url);
+
+ if (!platform_url.empty() && platform_name.empty())
+ return llvm::createStringError("--platform-url requires --platform");
+
+ if (lldb::SBError init_error =
+ lldb::SBDebugger::InitializeWithErrorHandling();
+ init_error.Fail())
+ return llvm::createStringError(llvm::formatv(
+ "failed to initialize lldb: {0}", init_error.GetCString()));
+ llvm::scope_exit cleanup{[]() { lldb::SBDebugger::Terminate(); }};
+
+ lldb::SBDebugger debugger =
+ lldb::SBDebugger::Create(/*source_init_files=*/false);
+ if (!debugger.IsValid())
+ return llvm::createStringError("failed to create debugger");
+
+ lldb::SBPlatform platform =
+ platform_name.empty() ? lldb::SBPlatform::GetHostPlatform()
+ : lldb::SBPlatform(platform_name.str().c_str());
+ if (!platform.IsValid())
+ return llvm::createStringError(
+ llvm::formatv("unknown platform: {0}", platform_name));
+
+ bool connected = false;
+ if (!platform_url.empty()) {
+ lldb::SBPlatformConnectOptions opts(platform_url.str().c_str());
+ lldb::SBError error = platform.ConnectRemote(opts);
+ if (error.Fail())
+ return llvm::createStringError(
+ llvm::formatv("failed to connect to platform {0} at {1}: {2}",
+ platform.GetName(), platform_url, error.GetCString()));
+ connected = true;
+ }
+ llvm::scope_exit disconnect{[&]() {
+ if (connected)
+ platform.DisconnectRemote();
+ }};
+
+ lldb::SBError error;
+ lldb::SBProcessInfoList processes = platform.GetAllProcesses(error);
+ if (error.Fail()) {
+ if (!platform.IsConnected() && platform_url.empty())
+ return llvm::createStringError(
+ llvm::formatv("platform {0} is not connected; pass --platform-url "
+ "to connect to a remote platform",
+ platform.GetName()));
+ return llvm::createStringError(
+ llvm::formatv("failed to list processes: {0}", error.GetCString()));
+ }
+
+ llvm::json::Array array;
+ for (uint32_t i = 0, n = processes.GetSize(); i < n; ++i) {
+ lldb::SBProcessInfo info;
+ if (!processes.GetProcessInfoAtIndex(i, info))
+ continue;
+
+ llvm::json::Object entry;
----------------
DrSergei wrote:
I think it would be nice to add process arguments to the output
https://github.com/llvm/llvm-project/pull/197330
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits