1 //===-- ProcessMonitor.h -------------------------------------- -*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #ifndef liblldb_ProcessMonitor_H_ 11 #define liblldb_ProcessMonitor_H_ 12 13 // C Includes 14 #include <semaphore.h> 15 #include <signal.h> 16 17 // C++ Includes 18 // Other libraries and framework includes 19 #include "lldb/lldb-types.h" 20 #include "lldb/Host/Mutex.h" 21 22 namespace lldb_private 23 { 24 class Error; 25 class Module; 26 class Scalar; 27 } // End lldb_private namespace. 28 29 class ProcessFreeBSD; 30 class Operation; 31 32 /// @class ProcessMonitor 33 /// @brief Manages communication with the inferior (debugee) process. 34 /// 35 /// Upon construction, this class prepares and launches an inferior process for 36 /// debugging. 37 /// 38 /// Changes in the inferior process state are propagated to the associated 39 /// ProcessFreeBSD instance by calling ProcessFreeBSD::SendMessage with the 40 /// appropriate ProcessMessage events. 41 /// 42 /// A purposely minimal set of operations are provided to interrogate and change 43 /// the inferior process state. 44 class ProcessMonitor 45 { 46 public: 47 48 /// Launches an inferior process ready for debugging. Forms the 49 /// implementation of Process::DoLaunch. 50 ProcessMonitor(ProcessPOSIX *process, 51 lldb_private::Module *module, 52 char const *argv[], 53 char const *envp[], 54 const char *stdin_path, 55 const char *stdout_path, 56 const char *stderr_path, 57 const char *working_dir, 58 lldb_private::Error &error); 59 60 ProcessMonitor(ProcessPOSIX *process, 61 lldb::pid_t pid, 62 lldb_private::Error &error); 63 64 ~ProcessMonitor(); 65 66 /// Provides the process number of debugee. 67 lldb::pid_t GetPID()68 GetPID() const { return m_pid; } 69 70 /// Returns the process associated with this ProcessMonitor. 71 ProcessFreeBSD & GetProcess()72 GetProcess() { return *m_process; } 73 74 /// Returns a file descriptor to the controlling terminal of the inferior 75 /// process. 76 /// 77 /// Reads from this file descriptor yield both the standard output and 78 /// standard error of this debugee. Even if stderr and stdout were 79 /// redirected on launch it may still happen that data is available on this 80 /// descriptor (if the inferior process opens /dev/tty, for example). 81 /// 82 /// If this monitor was attached to an existing process this method returns 83 /// -1. 84 int GetTerminalFD()85 GetTerminalFD() const { return m_terminal_fd; } 86 87 /// Reads @p size bytes from address @vm_adder in the inferior process 88 /// address space. 89 /// 90 /// This method is provided to implement Process::DoReadMemory. 91 size_t 92 ReadMemory(lldb::addr_t vm_addr, void *buf, size_t size, 93 lldb_private::Error &error); 94 95 /// Writes @p size bytes from address @p vm_adder in the inferior process 96 /// address space. 97 /// 98 /// This method is provided to implement Process::DoWriteMemory. 99 size_t 100 WriteMemory(lldb::addr_t vm_addr, const void *buf, size_t size, 101 lldb_private::Error &error); 102 103 /// Reads the contents from the register identified by the given (architecture 104 /// dependent) offset. 105 /// 106 /// This method is provided for use by RegisterContextFreeBSD derivatives. 107 /// FIXME: The FreeBSD implementation of this function should use tid in order 108 /// to enable support for debugging threaded programs. 109 bool 110 ReadRegisterValue(lldb::tid_t tid, unsigned offset, const char *reg_name, 111 unsigned size, lldb_private::RegisterValue &value); 112 113 /// Writes the given value to the register identified by the given 114 /// (architecture dependent) offset. 115 /// 116 /// This method is provided for use by RegisterContextFreeBSD derivatives. 117 /// FIXME: The FreeBSD implementation of this function should use tid in order 118 /// to enable support for debugging threaded programs. 119 bool 120 WriteRegisterValue(lldb::tid_t tid, unsigned offset, const char *reg_name, 121 const lldb_private::RegisterValue &value); 122 123 /// Reads all general purpose registers into the specified buffer. 124 /// FIXME: The FreeBSD implementation of this function should use tid in order 125 /// to enable support for debugging threaded programs. 126 bool 127 ReadGPR(lldb::tid_t tid, void *buf, size_t buf_size); 128 129 /// Reads all floating point registers into the specified buffer. 130 /// FIXME: The FreeBSD implementation of this function should use tid in order 131 /// to enable support for debugging threaded programs. 132 bool 133 ReadFPR(lldb::tid_t tid, void *buf, size_t buf_size); 134 135 /// Reads the specified register set into the specified buffer. 136 /// 137 /// This method is provided for use by RegisterContextFreeBSD derivatives. 138 /// FIXME: The FreeBSD implementation of this function should use tid in order 139 /// to enable support for debugging threaded programs. 140 bool 141 ReadRegisterSet(lldb::tid_t tid, void *buf, size_t buf_size, unsigned int regset); 142 143 /// Writes all general purpose registers into the specified buffer. 144 /// FIXME: The FreeBSD implementation of this function should use tid in order 145 /// to enable support for debugging threaded programs. 146 bool 147 WriteGPR(lldb::tid_t tid, void *buf, size_t buf_size); 148 149 /// Writes all floating point registers into the specified buffer. 150 /// FIXME: The FreeBSD implementation of this function should use tid in order 151 /// to enable support for debugging threaded programs. 152 bool 153 WriteFPR(lldb::tid_t tid, void *buf, size_t buf_size); 154 155 /// Writes the specified register set into the specified buffer. 156 /// 157 /// This method is provided for use by RegisterContextFreeBSD derivatives. 158 /// FIXME: The FreeBSD implementation of this function should use tid in order 159 /// to enable support for debugging threaded programs. 160 bool 161 WriteRegisterSet(lldb::tid_t tid, void *buf, size_t buf_size, unsigned int regset); 162 163 /// Writes a ptrace_lwpinfo structure corresponding to the given thread ID 164 /// to the memory region pointed to by @p lwpinfo. 165 bool 166 GetLwpInfo(lldb::tid_t tid, void *lwpinfo, int &error_no); 167 168 /// Writes the raw event message code (vis-a-vis PTRACE_GETEVENTMSG) 169 /// corresponding to the given thread IDto the memory pointed to by @p 170 /// message. 171 bool 172 GetEventMessage(lldb::tid_t tid, unsigned long *message); 173 174 /// Resumes the given thread. If @p signo is anything but 175 /// LLDB_INVALID_SIGNAL_NUMBER, deliver that signal to the thread. 176 bool 177 Resume(lldb::tid_t tid, uint32_t signo); 178 179 /// Single steps the given thread. If @p signo is anything but 180 /// LLDB_INVALID_SIGNAL_NUMBER, deliver that signal to the thread. 181 bool 182 SingleStep(lldb::tid_t tid, uint32_t signo); 183 184 /// Sends the inferior process a PTRACE_KILL signal. The inferior will 185 /// still exists and can be interrogated. Once resumed it will exit as 186 /// though it received a SIGKILL. 187 bool 188 BringProcessIntoLimbo(); 189 190 lldb_private::Error 191 Detach(lldb::tid_t tid); 192 193 void 194 StopMonitor(); 195 196 private: 197 ProcessFreeBSD *m_process; 198 199 lldb::thread_t m_operation_thread; 200 lldb::thread_t m_monitor_thread; 201 lldb::pid_t m_pid; 202 203 204 lldb_private::Mutex m_server_mutex; 205 int m_terminal_fd; 206 int m_client_fd; 207 int m_server_fd; 208 209 struct OperationArgs 210 { 211 OperationArgs(ProcessMonitor *monitor); 212 213 ~OperationArgs(); 214 215 ProcessMonitor *m_monitor; // The monitor performing the attach. 216 sem_t m_semaphore; // Posted to once operation complete. 217 lldb_private::Error m_error; // Set if process operation failed. 218 }; 219 220 /// @class LauchArgs 221 /// 222 /// @brief Simple structure to pass data to the thread responsible for 223 /// launching a child process. 224 struct LaunchArgs : OperationArgs 225 { 226 LaunchArgs(ProcessMonitor *monitor, 227 lldb_private::Module *module, 228 char const **argv, 229 char const **envp, 230 const char *stdin_path, 231 const char *stdout_path, 232 const char *stderr_path, 233 const char *working_dir); 234 235 ~LaunchArgs(); 236 237 lldb_private::Module *m_module; // The executable image to launch. 238 char const **m_argv; // Process arguments. 239 char const **m_envp; // Process environment. 240 const char *m_stdin_path; // Redirect stdin or NULL. 241 const char *m_stdout_path; // Redirect stdout or NULL. 242 const char *m_stderr_path; // Redirect stderr or NULL. 243 const char *m_working_dir; // Working directory or NULL. 244 }; 245 246 void 247 StartLaunchOpThread(LaunchArgs *args, lldb_private::Error &error); 248 249 static void * 250 LaunchOpThread(void *arg); 251 252 static bool 253 Launch(LaunchArgs *args); 254 255 bool 256 EnableIPC(); 257 258 struct AttachArgs : OperationArgs 259 { 260 AttachArgs(ProcessMonitor *monitor, 261 lldb::pid_t pid); 262 263 ~AttachArgs(); 264 265 lldb::pid_t m_pid; // pid of the process to be attached. 266 }; 267 268 void 269 StartAttachOpThread(AttachArgs *args, lldb_private::Error &error); 270 271 static void * 272 AttachOpThread(void *args); 273 274 static bool 275 Attach(AttachArgs *args); 276 277 static void 278 ServeOperation(OperationArgs *args); 279 280 static bool 281 DupDescriptor(const char *path, int fd, int flags); 282 283 static bool 284 MonitorCallback(void *callback_baton, 285 lldb::pid_t pid, bool exited, int signal, int status); 286 287 static ProcessMessage 288 MonitorSIGTRAP(ProcessMonitor *monitor, 289 const siginfo_t *info, lldb::pid_t pid); 290 291 static ProcessMessage 292 MonitorSignal(ProcessMonitor *monitor, 293 const siginfo_t *info, lldb::pid_t pid); 294 295 static ProcessMessage::CrashReason 296 GetCrashReasonForSIGSEGV(const siginfo_t *info); 297 298 static ProcessMessage::CrashReason 299 GetCrashReasonForSIGILL(const siginfo_t *info); 300 301 static ProcessMessage::CrashReason 302 GetCrashReasonForSIGFPE(const siginfo_t *info); 303 304 static ProcessMessage::CrashReason 305 GetCrashReasonForSIGBUS(const siginfo_t *info); 306 307 void 308 DoOperation(Operation *op); 309 310 /// Stops the child monitor thread. 311 void 312 StopMonitoringChildProcess(); 313 314 /// Stops the operation thread used to attach/launch a process. 315 void 316 StopOpThread(); 317 318 void 319 CloseFD(int &fd); 320 }; 321 322 #endif // #ifndef liblldb_ProcessMonitor_H_ 323