1254721Semaste//===-- ProcessGDBRemote.h --------------------------------------*- C++ -*-===// 2254721Semaste// 3254721Semaste// The LLVM Compiler Infrastructure 4254721Semaste// 5254721Semaste// This file is distributed under the University of Illinois Open Source 6254721Semaste// License. See LICENSE.TXT for details. 7254721Semaste// 8254721Semaste//===----------------------------------------------------------------------===// 9254721Semaste 10254721Semaste#ifndef liblldb_ProcessGDBRemote_h_ 11254721Semaste#define liblldb_ProcessGDBRemote_h_ 12254721Semaste 13254721Semaste// C Includes 14254721Semaste 15254721Semaste// C++ Includes 16254721Semaste#include <list> 17254721Semaste#include <vector> 18254721Semaste 19254721Semaste// Other libraries and framework includes 20254721Semaste#include "lldb/Core/ArchSpec.h" 21254721Semaste#include "lldb/Core/Broadcaster.h" 22254721Semaste#include "lldb/Core/ConstString.h" 23254721Semaste#include "lldb/Core/Error.h" 24254721Semaste#include "lldb/Core/StreamString.h" 25254721Semaste#include "lldb/Core/StringList.h" 26254721Semaste#include "lldb/Core/ThreadSafeValue.h" 27254721Semaste#include "lldb/Target/Process.h" 28254721Semaste#include "lldb/Target/Thread.h" 29254721Semaste 30254721Semaste#include "GDBRemoteCommunicationClient.h" 31254721Semaste#include "Utility/StringExtractor.h" 32254721Semaste#include "GDBRemoteRegisterContext.h" 33254721Semaste 34254721Semasteclass ThreadGDBRemote; 35254721Semaste 36254721Semasteclass ProcessGDBRemote : public lldb_private::Process 37254721Semaste{ 38254721Semastepublic: 39254721Semaste //------------------------------------------------------------------ 40254721Semaste // Constructors and Destructors 41254721Semaste //------------------------------------------------------------------ 42254721Semaste static lldb::ProcessSP 43254721Semaste CreateInstance (lldb_private::Target& target, 44254721Semaste lldb_private::Listener &listener, 45254721Semaste const lldb_private::FileSpec *crash_file_path); 46254721Semaste 47254721Semaste static void 48254721Semaste Initialize(); 49254721Semaste 50254721Semaste static void 51254721Semaste DebuggerInitialize (lldb_private::Debugger &debugger); 52254721Semaste 53254721Semaste static void 54254721Semaste Terminate(); 55254721Semaste 56254721Semaste static lldb_private::ConstString 57254721Semaste GetPluginNameStatic(); 58254721Semaste 59254721Semaste static const char * 60254721Semaste GetPluginDescriptionStatic(); 61254721Semaste 62254721Semaste //------------------------------------------------------------------ 63254721Semaste // Constructors and Destructors 64254721Semaste //------------------------------------------------------------------ 65254721Semaste ProcessGDBRemote(lldb_private::Target& target, lldb_private::Listener &listener); 66254721Semaste 67254721Semaste virtual 68254721Semaste ~ProcessGDBRemote(); 69254721Semaste 70254721Semaste //------------------------------------------------------------------ 71254721Semaste // Check if a given Process 72254721Semaste //------------------------------------------------------------------ 73254721Semaste virtual bool 74254721Semaste CanDebug (lldb_private::Target &target, 75254721Semaste bool plugin_specified_by_name); 76254721Semaste 77254721Semaste virtual lldb_private::CommandObject * 78254721Semaste GetPluginCommandObject(); 79254721Semaste 80254721Semaste //------------------------------------------------------------------ 81254721Semaste // Creating a new process, or attaching to an existing one 82254721Semaste //------------------------------------------------------------------ 83254721Semaste virtual lldb_private::Error 84254721Semaste WillLaunch (lldb_private::Module* module); 85254721Semaste 86254721Semaste virtual lldb_private::Error 87254721Semaste DoLaunch (lldb_private::Module *exe_module, 88269024Semaste lldb_private::ProcessLaunchInfo &launch_info); 89254721Semaste 90254721Semaste virtual void 91254721Semaste DidLaunch (); 92254721Semaste 93254721Semaste virtual lldb_private::Error 94254721Semaste WillAttachToProcessWithID (lldb::pid_t pid); 95254721Semaste 96254721Semaste virtual lldb_private::Error 97254721Semaste WillAttachToProcessWithName (const char *process_name, bool wait_for_launch); 98254721Semaste 99254721Semaste virtual lldb_private::Error 100254721Semaste DoConnectRemote (lldb_private::Stream *strm, const char *remote_url); 101254721Semaste 102254721Semaste lldb_private::Error 103254721Semaste WillLaunchOrAttach (); 104254721Semaste 105254721Semaste virtual lldb_private::Error 106254721Semaste DoAttachToProcessWithID (lldb::pid_t pid); 107254721Semaste 108254721Semaste virtual lldb_private::Error 109254721Semaste DoAttachToProcessWithID (lldb::pid_t pid, const lldb_private::ProcessAttachInfo &attach_info); 110254721Semaste 111254721Semaste virtual lldb_private::Error 112254721Semaste DoAttachToProcessWithName (const char *process_name, 113254721Semaste const lldb_private::ProcessAttachInfo &attach_info); 114254721Semaste 115254721Semaste virtual void 116254721Semaste DidAttach (); 117254721Semaste 118254721Semaste //------------------------------------------------------------------ 119254721Semaste // PluginInterface protocol 120254721Semaste //------------------------------------------------------------------ 121254721Semaste virtual lldb_private::ConstString 122254721Semaste GetPluginName(); 123254721Semaste 124254721Semaste virtual uint32_t 125254721Semaste GetPluginVersion(); 126254721Semaste 127254721Semaste //------------------------------------------------------------------ 128254721Semaste // Process Control 129254721Semaste //------------------------------------------------------------------ 130254721Semaste virtual lldb_private::Error 131254721Semaste WillResume (); 132254721Semaste 133254721Semaste virtual lldb_private::Error 134254721Semaste DoResume (); 135254721Semaste 136254721Semaste virtual lldb_private::Error 137254721Semaste DoHalt (bool &caused_stop); 138254721Semaste 139254721Semaste virtual lldb_private::Error 140254721Semaste DoDetach (bool keep_stopped); 141254721Semaste 142254721Semaste virtual bool 143254721Semaste DetachRequiresHalt() { return true; } 144254721Semaste 145254721Semaste virtual lldb_private::Error 146254721Semaste DoSignal (int signal); 147254721Semaste 148254721Semaste virtual lldb_private::Error 149254721Semaste DoDestroy (); 150254721Semaste 151254721Semaste virtual void 152254721Semaste RefreshStateAfterStop(); 153254721Semaste 154254721Semaste //------------------------------------------------------------------ 155254721Semaste // Process Queries 156254721Semaste //------------------------------------------------------------------ 157254721Semaste virtual bool 158254721Semaste IsAlive (); 159254721Semaste 160254721Semaste virtual lldb::addr_t 161254721Semaste GetImageInfoAddress(); 162254721Semaste 163254721Semaste //------------------------------------------------------------------ 164254721Semaste // Process Memory 165254721Semaste //------------------------------------------------------------------ 166254721Semaste virtual size_t 167254721Semaste DoReadMemory (lldb::addr_t addr, void *buf, size_t size, lldb_private::Error &error); 168254721Semaste 169254721Semaste virtual size_t 170254721Semaste DoWriteMemory (lldb::addr_t addr, const void *buf, size_t size, lldb_private::Error &error); 171254721Semaste 172254721Semaste virtual lldb::addr_t 173254721Semaste DoAllocateMemory (size_t size, uint32_t permissions, lldb_private::Error &error); 174254721Semaste 175254721Semaste virtual lldb_private::Error 176254721Semaste GetMemoryRegionInfo (lldb::addr_t load_addr, 177254721Semaste lldb_private::MemoryRegionInfo ®ion_info); 178254721Semaste 179254721Semaste virtual lldb_private::Error 180254721Semaste DoDeallocateMemory (lldb::addr_t ptr); 181254721Semaste 182254721Semaste //------------------------------------------------------------------ 183254721Semaste // Process STDIO 184254721Semaste //------------------------------------------------------------------ 185254721Semaste virtual size_t 186254721Semaste PutSTDIN (const char *buf, size_t buf_size, lldb_private::Error &error); 187254721Semaste 188254721Semaste //---------------------------------------------------------------------- 189254721Semaste // Process Breakpoints 190254721Semaste //---------------------------------------------------------------------- 191254721Semaste virtual lldb_private::Error 192254721Semaste EnableBreakpointSite (lldb_private::BreakpointSite *bp_site); 193254721Semaste 194254721Semaste virtual lldb_private::Error 195254721Semaste DisableBreakpointSite (lldb_private::BreakpointSite *bp_site); 196254721Semaste 197254721Semaste //---------------------------------------------------------------------- 198254721Semaste // Process Watchpoints 199254721Semaste //---------------------------------------------------------------------- 200254721Semaste virtual lldb_private::Error 201254721Semaste EnableWatchpoint (lldb_private::Watchpoint *wp, bool notify = true); 202254721Semaste 203254721Semaste virtual lldb_private::Error 204254721Semaste DisableWatchpoint (lldb_private::Watchpoint *wp, bool notify = true); 205254721Semaste 206254721Semaste virtual lldb_private::Error 207254721Semaste GetWatchpointSupportInfo (uint32_t &num); 208254721Semaste 209254721Semaste virtual lldb_private::Error 210254721Semaste GetWatchpointSupportInfo (uint32_t &num, bool& after); 211254721Semaste 212254721Semaste virtual bool 213254721Semaste StartNoticingNewThreads(); 214254721Semaste 215254721Semaste virtual bool 216254721Semaste StopNoticingNewThreads(); 217254721Semaste 218254721Semaste GDBRemoteCommunicationClient & 219254721Semaste GetGDBRemote() 220254721Semaste { 221254721Semaste return m_gdb_comm; 222254721Semaste } 223263367Semaste 224263367Semaste //---------------------------------------------------------------------- 225263367Semaste // Override SetExitStatus so we can disconnect from the remote GDB server 226263367Semaste //---------------------------------------------------------------------- 227263367Semaste virtual bool 228263367Semaste SetExitStatus (int exit_status, const char *cstr); 229254721Semaste 230263367Semaste 231254721Semasteprotected: 232254721Semaste friend class ThreadGDBRemote; 233254721Semaste friend class GDBRemoteCommunicationClient; 234254721Semaste friend class GDBRemoteRegisterContext; 235254721Semaste 236254721Semaste //---------------------------------------------------------------------- 237254721Semaste // Accessors 238254721Semaste //---------------------------------------------------------------------- 239254721Semaste bool 240254721Semaste IsRunning ( lldb::StateType state ) 241254721Semaste { 242254721Semaste return state == lldb::eStateRunning || IsStepping(state); 243254721Semaste } 244254721Semaste 245254721Semaste bool 246254721Semaste IsStepping ( lldb::StateType state) 247254721Semaste { 248254721Semaste return state == lldb::eStateStepping; 249254721Semaste } 250254721Semaste bool 251254721Semaste CanResume ( lldb::StateType state) 252254721Semaste { 253254721Semaste return state == lldb::eStateStopped; 254254721Semaste } 255254721Semaste 256254721Semaste bool 257254721Semaste HasExited (lldb::StateType state) 258254721Semaste { 259254721Semaste return state == lldb::eStateExited; 260254721Semaste } 261254721Semaste 262254721Semaste bool 263254721Semaste ProcessIDIsValid ( ) const; 264254721Semaste 265254721Semaste void 266254721Semaste Clear ( ); 267254721Semaste 268254721Semaste lldb_private::Flags & 269254721Semaste GetFlags () 270254721Semaste { 271254721Semaste return m_flags; 272254721Semaste } 273254721Semaste 274254721Semaste const lldb_private::Flags & 275254721Semaste GetFlags () const 276254721Semaste { 277254721Semaste return m_flags; 278254721Semaste } 279254721Semaste 280254721Semaste virtual bool 281254721Semaste UpdateThreadList (lldb_private::ThreadList &old_thread_list, 282254721Semaste lldb_private::ThreadList &new_thread_list); 283254721Semaste 284254721Semaste lldb_private::Error 285269024Semaste LaunchAndConnectToDebugserver (const lldb_private::ProcessInfo &process_info); 286254721Semaste 287254721Semaste void 288254721Semaste KillDebugserverProcess (); 289254721Semaste 290254721Semaste void 291254721Semaste BuildDynamicRegisterInfo (bool force); 292254721Semaste 293254721Semaste void 294254721Semaste SetLastStopPacket (const StringExtractorGDBRemote &response); 295254721Semaste 296263363Semaste bool 297263363Semaste ParsePythonTargetDefinition(const lldb_private::FileSpec &target_definition_fspec); 298263363Semaste 299263363Semaste bool 300263363Semaste ParseRegisters(lldb_private::ScriptInterpreterObject *registers_array); 301263363Semaste 302254721Semaste //------------------------------------------------------------------ 303254721Semaste /// Broadcaster event bits definitions. 304254721Semaste //------------------------------------------------------------------ 305254721Semaste enum 306254721Semaste { 307254721Semaste eBroadcastBitAsyncContinue = (1 << 0), 308254721Semaste eBroadcastBitAsyncThreadShouldExit = (1 << 1), 309254721Semaste eBroadcastBitAsyncThreadDidExit = (1 << 2) 310254721Semaste }; 311254721Semaste 312254721Semaste typedef enum AsyncThreadState 313254721Semaste { 314254721Semaste eAsyncThreadNotStarted, 315254721Semaste eAsyncThreadRunning, 316254721Semaste eAsyncThreadDone 317254721Semaste } AsyncThreadState; 318254721Semaste 319254721Semaste lldb_private::Flags m_flags; // Process specific flags (see eFlags enums) 320254721Semaste GDBRemoteCommunicationClient m_gdb_comm; 321254721Semaste lldb::pid_t m_debugserver_pid; 322254721Semaste StringExtractorGDBRemote m_last_stop_packet; 323254721Semaste lldb_private::Mutex m_last_stop_packet_mutex; 324254721Semaste GDBRemoteDynamicRegisterInfo m_register_info; 325254721Semaste lldb_private::Broadcaster m_async_broadcaster; 326254721Semaste lldb::thread_t m_async_thread; 327254721Semaste AsyncThreadState m_async_thread_state; 328254721Semaste lldb_private::Mutex m_async_thread_state_mutex; 329254721Semaste typedef std::vector<lldb::tid_t> tid_collection; 330254721Semaste typedef std::vector< std::pair<lldb::tid_t,int> > tid_sig_collection; 331254721Semaste typedef std::map<lldb::addr_t, lldb::addr_t> MMapMap; 332254721Semaste tid_collection m_thread_ids; // Thread IDs for all threads. This list gets updated after stopping 333254721Semaste tid_collection m_continue_c_tids; // 'c' for continue 334254721Semaste tid_sig_collection m_continue_C_tids; // 'C' for continue with signal 335254721Semaste tid_collection m_continue_s_tids; // 's' for step 336254721Semaste tid_sig_collection m_continue_S_tids; // 'S' for step with signal 337254721Semaste size_t m_max_memory_size; // The maximum number of bytes to read/write when reading and writing memory 338254721Semaste MMapMap m_addr_to_mmap_size; 339254721Semaste lldb::BreakpointSP m_thread_create_bp_sp; 340254721Semaste bool m_waiting_for_attach; 341254721Semaste bool m_destroy_tried_resuming; 342254721Semaste lldb::CommandObjectSP m_command_sp; 343263363Semaste int64_t m_breakpoint_pc_offset; 344254721Semaste 345254721Semaste bool 346254721Semaste StartAsyncThread (); 347254721Semaste 348254721Semaste void 349254721Semaste StopAsyncThread (); 350254721Semaste 351263363Semaste static lldb::thread_result_t 352254721Semaste AsyncThread (void *arg); 353254721Semaste 354254721Semaste static bool 355254721Semaste MonitorDebugserverProcess (void *callback_baton, 356254721Semaste lldb::pid_t pid, 357254721Semaste bool exited, 358254721Semaste int signo, 359254721Semaste int exit_status); 360254721Semaste 361254721Semaste lldb::StateType 362254721Semaste SetThreadStopInfo (StringExtractor& stop_packet); 363254721Semaste 364254721Semaste void 365254721Semaste ClearThreadIDList (); 366254721Semaste 367254721Semaste bool 368254721Semaste UpdateThreadIDList (); 369254721Semaste 370254721Semaste void 371254721Semaste DidLaunchOrAttach (); 372254721Semaste 373254721Semaste lldb_private::Error 374254721Semaste ConnectToDebugserver (const char *host_port); 375254721Semaste 376254721Semaste const char * 377254721Semaste GetDispatchQueueNameForThread (lldb::addr_t thread_dispatch_qaddr, 378254721Semaste std::string &dispatch_queue_name); 379254721Semaste 380254721Semaste lldb_private::DynamicLoader * 381254721Semaste GetDynamicLoader (); 382254721Semaste 383254721Semasteprivate: 384254721Semaste //------------------------------------------------------------------ 385254721Semaste // For ProcessGDBRemote only 386254721Semaste //------------------------------------------------------------------ 387254721Semaste static bool 388254721Semaste NewThreadNotifyBreakpointHit (void *baton, 389254721Semaste lldb_private::StoppointCallbackContext *context, 390254721Semaste lldb::user_id_t break_id, 391254721Semaste lldb::user_id_t break_loc_id); 392254721Semaste 393254721Semaste DISALLOW_COPY_AND_ASSIGN (ProcessGDBRemote); 394254721Semaste 395254721Semaste}; 396254721Semaste 397254721Semaste#endif // liblldb_ProcessGDBRemote_h_ 398