1 //===-- MonitoringProcessLauncher.cpp -------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "lldb/Host/MonitoringProcessLauncher.h" 10 #include "lldb/Host/FileSystem.h" 11 #include "lldb/Host/HostProcess.h" 12 #include "lldb/Host/ProcessLaunchInfo.h" 13 #include "lldb/Utility/LLDBLog.h" 14 #include "lldb/Utility/Log.h" 15 16 #include "llvm/Support/FileSystem.h" 17 18 using namespace lldb; 19 using namespace lldb_private; 20 MonitoringProcessLauncher(std::unique_ptr<ProcessLauncher> delegate_launcher)21MonitoringProcessLauncher::MonitoringProcessLauncher( 22 std::unique_ptr<ProcessLauncher> delegate_launcher) 23 : m_delegate_launcher(std::move(delegate_launcher)) {} 24 25 HostProcess LaunchProcess(const ProcessLaunchInfo & launch_info,Status & error)26MonitoringProcessLauncher::LaunchProcess(const ProcessLaunchInfo &launch_info, 27 Status &error) { 28 ProcessLaunchInfo resolved_info(launch_info); 29 30 error.Clear(); 31 32 FileSystem &fs = FileSystem::Instance(); 33 FileSpec exe_spec(resolved_info.GetExecutableFile()); 34 35 if (!fs.Exists(exe_spec)) 36 FileSystem::Instance().Resolve(exe_spec); 37 38 if (!fs.Exists(exe_spec)) 39 FileSystem::Instance().ResolveExecutableLocation(exe_spec); 40 41 if (!fs.Exists(exe_spec)) { 42 error.SetErrorStringWithFormatv("executable doesn't exist: '{0}'", 43 exe_spec); 44 return HostProcess(); 45 } 46 47 resolved_info.SetExecutableFile(exe_spec, false); 48 assert(!resolved_info.GetFlags().Test(eLaunchFlagLaunchInTTY)); 49 50 HostProcess process = 51 m_delegate_launcher->LaunchProcess(resolved_info, error); 52 53 if (process.GetProcessId() != LLDB_INVALID_PROCESS_ID) { 54 Log *log = GetLog(LLDBLog::Process); 55 56 assert(launch_info.GetMonitorProcessCallback()); 57 llvm::Expected<HostThread> maybe_thread = 58 process.StartMonitoring(launch_info.GetMonitorProcessCallback()); 59 if (!maybe_thread) 60 error.SetErrorStringWithFormatv("failed to launch host thread: {}", 61 llvm::toString(maybe_thread.takeError())); 62 if (log) 63 log->PutCString("started monitoring child process."); 64 } else { 65 // Invalid process ID, something didn't go well 66 if (error.Success()) 67 error.SetErrorString("process launch failed for unknown reasons"); 68 } 69 return process; 70 } 71