1 //===-- ProcessGDBRemote.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_ProcessGDBRemote_h_ 11 #define liblldb_ProcessGDBRemote_h_ 12 13 // C Includes 14 // C++ Includes 15 #include <atomic> 16 #include <map> 17 #include <string> 18 #include <vector> 19 20 // Other libraries and framework includes 21 // Project includes 22 #include "lldb/Core/ArchSpec.h" 23 #include "lldb/Core/Broadcaster.h" 24 #include "lldb/Core/ConstString.h" 25 #include "lldb/Core/Error.h" 26 #include "lldb/Core/StreamString.h" 27 #include "lldb/Core/StringList.h" 28 #include "lldb/Core/StructuredData.h" 29 #include "lldb/Core/ThreadSafeValue.h" 30 #include "lldb/Host/HostThread.h" 31 #include "lldb/lldb-private-forward.h" 32 #include "lldb/Utility/StringExtractor.h" 33 #include "lldb/Target/Process.h" 34 #include "lldb/Target/Thread.h" 35 36 #include "GDBRemoteCommunicationClient.h" 37 #include "GDBRemoteRegisterContext.h" 38 39 namespace lldb_private { 40 namespace process_gdb_remote { 41 42 class ThreadGDBRemote; 43 44 class ProcessGDBRemote : public Process 45 { 46 public: 47 ProcessGDBRemote(lldb::TargetSP target_sp, Listener &listener); 48 49 ~ProcessGDBRemote() override; 50 51 static lldb::ProcessSP 52 CreateInstance (lldb::TargetSP target_sp, 53 Listener &listener, 54 const FileSpec *crash_file_path); 55 56 static void 57 Initialize(); 58 59 static void 60 DebuggerInitialize (Debugger &debugger); 61 62 static void 63 Terminate(); 64 65 static ConstString 66 GetPluginNameStatic(); 67 68 static const char * 69 GetPluginDescriptionStatic(); 70 71 //------------------------------------------------------------------ 72 // Check if a given Process 73 //------------------------------------------------------------------ 74 bool 75 CanDebug (lldb::TargetSP target_sp, bool plugin_specified_by_name) override; 76 77 CommandObject * 78 GetPluginCommandObject() override; 79 80 //------------------------------------------------------------------ 81 // Creating a new process, or attaching to an existing one 82 //------------------------------------------------------------------ 83 Error 84 WillLaunch (Module* module) override; 85 86 Error 87 DoLaunch (Module *exe_module, ProcessLaunchInfo &launch_info) override; 88 89 void 90 DidLaunch () override; 91 92 Error 93 WillAttachToProcessWithID (lldb::pid_t pid) override; 94 95 Error 96 WillAttachToProcessWithName (const char *process_name, bool wait_for_launch) override; 97 98 Error 99 DoConnectRemote (Stream *strm, const char *remote_url) override; 100 101 Error 102 WillLaunchOrAttach (); 103 104 Error 105 DoAttachToProcessWithID (lldb::pid_t pid, const ProcessAttachInfo &attach_info) override; 106 107 Error 108 DoAttachToProcessWithName (const char *process_name, 109 const ProcessAttachInfo &attach_info) override; 110 111 void 112 DidAttach (ArchSpec &process_arch) override; 113 114 //------------------------------------------------------------------ 115 // PluginInterface protocol 116 //------------------------------------------------------------------ 117 ConstString 118 GetPluginName() override; 119 120 uint32_t 121 GetPluginVersion() override; 122 123 //------------------------------------------------------------------ 124 // Process Control 125 //------------------------------------------------------------------ 126 Error 127 WillResume () override; 128 129 Error 130 DoResume () override; 131 132 Error 133 DoHalt (bool &caused_stop) override; 134 135 Error 136 DoDetach (bool keep_stopped) override; 137 138 bool 139 DetachRequiresHalt() override { return true; } 140 141 Error 142 DoSignal (int signal) override; 143 144 Error 145 DoDestroy () override; 146 147 void 148 RefreshStateAfterStop() override; 149 150 void 151 SetUnixSignals(const lldb::UnixSignalsSP &signals_sp); 152 153 //------------------------------------------------------------------ 154 // Process Queries 155 //------------------------------------------------------------------ 156 bool 157 IsAlive () override; 158 159 lldb::addr_t 160 GetImageInfoAddress() override; 161 162 void 163 WillPublicStop () override; 164 165 //------------------------------------------------------------------ 166 // Process Memory 167 //------------------------------------------------------------------ 168 size_t 169 DoReadMemory (lldb::addr_t addr, void *buf, size_t size, Error &error) override; 170 171 size_t 172 DoWriteMemory (lldb::addr_t addr, const void *buf, size_t size, Error &error) override; 173 174 lldb::addr_t 175 DoAllocateMemory (size_t size, uint32_t permissions, Error &error) override; 176 177 Error 178 GetMemoryRegionInfo (lldb::addr_t load_addr, MemoryRegionInfo ®ion_info) override; 179 180 Error 181 DoDeallocateMemory (lldb::addr_t ptr) override; 182 183 //------------------------------------------------------------------ 184 // Process STDIO 185 //------------------------------------------------------------------ 186 size_t 187 PutSTDIN (const char *buf, size_t buf_size, Error &error) override; 188 189 //---------------------------------------------------------------------- 190 // Process Breakpoints 191 //---------------------------------------------------------------------- 192 Error 193 EnableBreakpointSite (BreakpointSite *bp_site) override; 194 195 Error 196 DisableBreakpointSite (BreakpointSite *bp_site) override; 197 198 //---------------------------------------------------------------------- 199 // Process Watchpoints 200 //---------------------------------------------------------------------- 201 Error 202 EnableWatchpoint (Watchpoint *wp, bool notify = true) override; 203 204 Error 205 DisableWatchpoint (Watchpoint *wp, bool notify = true) override; 206 207 Error 208 GetWatchpointSupportInfo (uint32_t &num) override; 209 210 Error 211 GetWatchpointSupportInfo (uint32_t &num, bool& after) override; 212 213 bool 214 StartNoticingNewThreads() override; 215 216 bool 217 StopNoticingNewThreads() override; 218 219 GDBRemoteCommunicationClient & 220 GetGDBRemote() 221 { 222 return m_gdb_comm; 223 } 224 225 Error 226 SendEventData(const char *data) override; 227 228 //---------------------------------------------------------------------- 229 // Override DidExit so we can disconnect from the remote GDB server 230 //---------------------------------------------------------------------- 231 void 232 DidExit () override; 233 234 void 235 SetUserSpecifiedMaxMemoryTransferSize (uint64_t user_specified_max); 236 237 bool 238 GetModuleSpec(const FileSpec& module_file_spec, 239 const ArchSpec& arch, 240 ModuleSpec &module_spec) override; 241 242 bool 243 GetHostOSVersion(uint32_t &major, 244 uint32_t &minor, 245 uint32_t &update) override; 246 247 size_t 248 LoadModules() override; 249 250 Error 251 GetFileLoadAddress(const FileSpec& file, bool& is_loaded, lldb::addr_t& load_addr) override; 252 253 void 254 ModulesDidLoad (ModuleList &module_list) override; 255 256 StructuredData::ObjectSP 257 GetLoadedDynamicLibrariesInfos (lldb::addr_t image_list_address, lldb::addr_t image_count) override; 258 259 protected: 260 friend class ThreadGDBRemote; 261 friend class GDBRemoteCommunicationClient; 262 friend class GDBRemoteRegisterContext; 263 264 class GDBLoadedModuleInfoList; 265 266 //------------------------------------------------------------------ 267 /// Broadcaster event bits definitions. 268 //------------------------------------------------------------------ 269 enum 270 { 271 eBroadcastBitAsyncContinue = (1 << 0), 272 eBroadcastBitAsyncThreadShouldExit = (1 << 1), 273 eBroadcastBitAsyncThreadDidExit = (1 << 2) 274 }; 275 276 Flags m_flags; // Process specific flags (see eFlags enums) 277 GDBRemoteCommunicationClient m_gdb_comm; 278 std::atomic<lldb::pid_t> m_debugserver_pid; 279 std::vector<StringExtractorGDBRemote> m_stop_packet_stack; // The stop packet stack replaces the last stop packet variable 280 Mutex m_last_stop_packet_mutex; 281 GDBRemoteDynamicRegisterInfo m_register_info; 282 Broadcaster m_async_broadcaster; 283 Listener m_async_listener; 284 HostThread m_async_thread; 285 Mutex m_async_thread_state_mutex; 286 typedef std::vector<lldb::tid_t> tid_collection; 287 typedef std::vector< std::pair<lldb::tid_t,int> > tid_sig_collection; 288 typedef std::map<lldb::addr_t, lldb::addr_t> MMapMap; 289 typedef std::map<uint32_t, std::string> ExpeditedRegisterMap; 290 tid_collection m_thread_ids; // Thread IDs for all threads. This list gets updated after stopping 291 StructuredData::ObjectSP m_jstopinfo_sp; // Stop info only for any threads that have valid stop infos 292 StructuredData::ObjectSP m_jthreadsinfo_sp; // Full stop info, expedited registers and memory for all threads if "jThreadsInfo" packet is supported 293 tid_collection m_continue_c_tids; // 'c' for continue 294 tid_sig_collection m_continue_C_tids; // 'C' for continue with signal 295 tid_collection m_continue_s_tids; // 's' for step 296 tid_sig_collection m_continue_S_tids; // 'S' for step with signal 297 uint64_t m_max_memory_size; // The maximum number of bytes to read/write when reading and writing memory 298 uint64_t m_remote_stub_max_memory_size; // The maximum memory size the remote gdb stub can handle 299 MMapMap m_addr_to_mmap_size; 300 lldb::BreakpointSP m_thread_create_bp_sp; 301 bool m_waiting_for_attach; 302 bool m_destroy_tried_resuming; 303 lldb::CommandObjectSP m_command_sp; 304 int64_t m_breakpoint_pc_offset; 305 lldb::tid_t m_initial_tid; // The initial thread ID, given by stub on attach 306 307 //---------------------------------------------------------------------- 308 // Accessors 309 //---------------------------------------------------------------------- 310 bool 311 IsRunning ( lldb::StateType state ) 312 { 313 return state == lldb::eStateRunning || IsStepping(state); 314 } 315 316 bool 317 IsStepping ( lldb::StateType state) 318 { 319 return state == lldb::eStateStepping; 320 } 321 322 bool 323 CanResume ( lldb::StateType state) 324 { 325 return state == lldb::eStateStopped; 326 } 327 328 bool 329 HasExited (lldb::StateType state) 330 { 331 return state == lldb::eStateExited; 332 } 333 334 bool 335 ProcessIDIsValid ( ) const; 336 337 void 338 Clear ( ); 339 340 Flags & 341 GetFlags () 342 { 343 return m_flags; 344 } 345 346 const Flags & 347 GetFlags () const 348 { 349 return m_flags; 350 } 351 352 bool 353 UpdateThreadList (ThreadList &old_thread_list, 354 ThreadList &new_thread_list) override; 355 356 Error 357 EstablishConnectionIfNeeded (const ProcessInfo &process_info); 358 359 Error 360 LaunchAndConnectToDebugserver (const ProcessInfo &process_info); 361 362 void 363 KillDebugserverProcess (); 364 365 void 366 BuildDynamicRegisterInfo (bool force); 367 368 void 369 SetLastStopPacket (const StringExtractorGDBRemote &response); 370 371 bool 372 ParsePythonTargetDefinition(const FileSpec &target_definition_fspec); 373 374 const lldb::DataBufferSP 375 GetAuxvData() override; 376 377 StructuredData::ObjectSP 378 GetExtendedInfoForThread (lldb::tid_t tid); 379 380 void 381 GetMaxMemorySize(); 382 383 bool 384 CalculateThreadStopInfo (ThreadGDBRemote *thread); 385 386 size_t 387 UpdateThreadIDsFromStopReplyThreadsValue (std::string &value); 388 389 bool 390 HandleNotifyPacket(StringExtractorGDBRemote &packet); 391 392 bool 393 StartAsyncThread (); 394 395 void 396 StopAsyncThread (); 397 398 static lldb::thread_result_t 399 AsyncThread (void *arg); 400 401 static bool 402 MonitorDebugserverProcess (void *callback_baton, 403 lldb::pid_t pid, 404 bool exited, 405 int signo, 406 int exit_status); 407 408 lldb::StateType 409 SetThreadStopInfo (StringExtractor& stop_packet); 410 411 bool 412 GetThreadStopInfoFromJSON (ThreadGDBRemote *thread, const StructuredData::ObjectSP &thread_infos_sp); 413 414 lldb::ThreadSP 415 SetThreadStopInfo (StructuredData::Dictionary *thread_dict); 416 417 lldb::ThreadSP 418 SetThreadStopInfo (lldb::tid_t tid, 419 ExpeditedRegisterMap &expedited_register_map, 420 uint8_t signo, 421 const std::string &thread_name, 422 const std::string &reason, 423 const std::string &description, 424 uint32_t exc_type, 425 const std::vector<lldb::addr_t> &exc_data, 426 lldb::addr_t thread_dispatch_qaddr, 427 bool queue_vars_valid, 428 std::string &queue_name, 429 lldb::QueueKind queue_kind, 430 uint64_t queue_serial); 431 432 void 433 HandleStopReplySequence (); 434 435 void 436 ClearThreadIDList (); 437 438 bool 439 UpdateThreadIDList (); 440 441 void 442 DidLaunchOrAttach (ArchSpec& process_arch); 443 444 Error 445 ConnectToDebugserver (const char *host_port); 446 447 const char * 448 GetDispatchQueueNameForThread (lldb::addr_t thread_dispatch_qaddr, 449 std::string &dispatch_queue_name); 450 451 DynamicLoader * 452 GetDynamicLoader () override; 453 454 // Query remote GDBServer for register information 455 bool 456 GetGDBServerRegisterInfo (); 457 458 // Query remote GDBServer for a detailed loaded library list 459 Error 460 GetLoadedModuleList (GDBLoadedModuleInfoList &); 461 462 lldb::ModuleSP 463 LoadModuleAtAddress (const FileSpec &file, lldb::addr_t base_addr, bool value_is_offset); 464 465 private: 466 //------------------------------------------------------------------ 467 // For ProcessGDBRemote only 468 //------------------------------------------------------------------ 469 static bool 470 NewThreadNotifyBreakpointHit (void *baton, 471 StoppointCallbackContext *context, 472 lldb::user_id_t break_id, 473 lldb::user_id_t break_loc_id); 474 475 DISALLOW_COPY_AND_ASSIGN (ProcessGDBRemote); 476 }; 477 478 } // namespace process_gdb_remote 479 } // namespace lldb_private 480 481 #endif // liblldb_ProcessGDBRemote_h_ 482