1 //===-- ProcessKDP.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_ProcessKDP_h_ 11 #define liblldb_ProcessKDP_h_ 12 13 // C Includes 14 15 // C++ Includes 16 #include <list> 17 #include <vector> 18 19 // Other libraries and framework includes 20 #include "lldb/Core/ArchSpec.h" 21 #include "lldb/Core/Broadcaster.h" 22 #include "lldb/Core/ConstString.h" 23 #include "lldb/Core/Error.h" 24 #include "lldb/Core/InputReader.h" 25 #include "lldb/Core/StreamString.h" 26 #include "lldb/Core/StringList.h" 27 #include "lldb/Core/ThreadSafeValue.h" 28 #include "lldb/Target/Process.h" 29 #include "lldb/Target/Thread.h" 30 31 #include "CommunicationKDP.h" 32 #include "Utility/StringExtractor.h" 33 34 class ThreadKDP; 35 36 class ProcessKDP : public lldb_private::Process 37 { 38 public: 39 //------------------------------------------------------------------ 40 // Constructors and Destructors 41 //------------------------------------------------------------------ 42 static lldb::ProcessSP 43 CreateInstance (lldb_private::Target& target, 44 lldb_private::Listener &listener, 45 const lldb_private::FileSpec *crash_file_path); 46 47 static void 48 Initialize(); 49 50 static void 51 Terminate(); 52 53 static lldb_private::ConstString 54 GetPluginNameStatic(); 55 56 static const char * 57 GetPluginDescriptionStatic(); 58 59 //------------------------------------------------------------------ 60 // Constructors and Destructors 61 //------------------------------------------------------------------ 62 ProcessKDP(lldb_private::Target& target, lldb_private::Listener &listener); 63 64 virtual 65 ~ProcessKDP(); 66 67 //------------------------------------------------------------------ 68 // Check if a given Process 69 //------------------------------------------------------------------ 70 virtual bool 71 CanDebug (lldb_private::Target &target, 72 bool plugin_specified_by_name); 73 74 virtual lldb_private::CommandObject * 75 GetPluginCommandObject(); 76 77 //------------------------------------------------------------------ 78 // Creating a new process, or attaching to an existing one 79 //------------------------------------------------------------------ 80 virtual lldb_private::Error 81 WillLaunch (lldb_private::Module* module); 82 83 virtual lldb_private::Error 84 DoLaunch (lldb_private::Module *exe_module, 85 const lldb_private::ProcessLaunchInfo &launch_info); 86 87 virtual lldb_private::Error 88 WillAttachToProcessWithID (lldb::pid_t pid); 89 90 virtual lldb_private::Error 91 WillAttachToProcessWithName (const char *process_name, bool wait_for_launch); 92 93 virtual lldb_private::Error 94 DoConnectRemote (lldb_private::Stream *strm, const char *remote_url); 95 96 virtual lldb_private::Error 97 DoAttachToProcessWithID (lldb::pid_t pid); 98 99 virtual lldb_private::Error 100 DoAttachToProcessWithID (lldb::pid_t pid, const lldb_private::ProcessAttachInfo &attach_info); 101 102 virtual lldb_private::Error 103 DoAttachToProcessWithName (const char *process_name, bool wait_for_launch, const lldb_private::ProcessAttachInfo &attach_info); 104 105 virtual void 106 DidAttach (); 107 108 lldb::addr_t 109 GetImageInfoAddress(); 110 111 lldb_private::DynamicLoader * 112 GetDynamicLoader (); 113 114 //------------------------------------------------------------------ 115 // PluginInterface protocol 116 //------------------------------------------------------------------ 117 virtual lldb_private::ConstString 118 GetPluginName(); 119 120 virtual uint32_t 121 GetPluginVersion(); 122 123 //------------------------------------------------------------------ 124 // Process Control 125 //------------------------------------------------------------------ 126 virtual lldb_private::Error 127 WillResume (); 128 129 virtual lldb_private::Error 130 DoResume (); 131 132 virtual lldb_private::Error 133 DoHalt (bool &caused_stop); 134 135 virtual lldb_private::Error 136 DoDetach (bool keep_stopped); 137 138 virtual lldb_private::Error 139 DoSignal (int signal); 140 141 virtual lldb_private::Error 142 DoDestroy (); 143 144 virtual void 145 RefreshStateAfterStop(); 146 147 //------------------------------------------------------------------ 148 // Process Queries 149 //------------------------------------------------------------------ 150 virtual bool 151 IsAlive (); 152 153 //------------------------------------------------------------------ 154 // Process Memory 155 //------------------------------------------------------------------ 156 virtual size_t 157 DoReadMemory (lldb::addr_t addr, void *buf, size_t size, lldb_private::Error &error); 158 159 virtual size_t 160 DoWriteMemory (lldb::addr_t addr, const void *buf, size_t size, lldb_private::Error &error); 161 162 virtual lldb::addr_t 163 DoAllocateMemory (size_t size, uint32_t permissions, lldb_private::Error &error); 164 165 virtual lldb_private::Error 166 DoDeallocateMemory (lldb::addr_t ptr); 167 168 //---------------------------------------------------------------------- 169 // Process Breakpoints 170 //---------------------------------------------------------------------- 171 virtual lldb_private::Error 172 EnableBreakpointSite (lldb_private::BreakpointSite *bp_site); 173 174 virtual lldb_private::Error 175 DisableBreakpointSite (lldb_private::BreakpointSite *bp_site); 176 177 //---------------------------------------------------------------------- 178 // Process Watchpoints 179 //---------------------------------------------------------------------- 180 virtual lldb_private::Error 181 EnableWatchpoint (lldb_private::Watchpoint *wp, bool notify = true); 182 183 virtual lldb_private::Error 184 DisableWatchpoint (lldb_private::Watchpoint *wp, bool notify = true); 185 186 CommunicationKDP & 187 GetCommunication() 188 { 189 return m_comm; 190 } 191 192 protected: 193 friend class ThreadKDP; 194 friend class CommunicationKDP; 195 196 //---------------------------------------------------------------------- 197 // Accessors 198 //---------------------------------------------------------------------- 199 bool 200 IsRunning ( lldb::StateType state ) 201 { 202 return state == lldb::eStateRunning || IsStepping(state); 203 } 204 205 bool 206 IsStepping ( lldb::StateType state) 207 { 208 return state == lldb::eStateStepping; 209 } 210 211 bool 212 CanResume ( lldb::StateType state) 213 { 214 return state == lldb::eStateStopped; 215 } 216 217 bool 218 HasExited (lldb::StateType state) 219 { 220 return state == lldb::eStateExited; 221 } 222 223 bool 224 ProcessIDIsValid ( ) const; 225 226 void 227 Clear ( ); 228 229 virtual bool 230 UpdateThreadList (lldb_private::ThreadList &old_thread_list, 231 lldb_private::ThreadList &new_thread_list); 232 233 enum 234 { 235 eBroadcastBitAsyncContinue = (1 << 0), 236 eBroadcastBitAsyncThreadShouldExit = (1 << 1) 237 }; 238 239 lldb::ThreadSP 240 GetKernelThread (); 241 242 //------------------------------------------------------------------ 243 /// Broadcaster event bits definitions. 244 //------------------------------------------------------------------ 245 CommunicationKDP m_comm; 246 lldb_private::Broadcaster m_async_broadcaster; 247 lldb::thread_t m_async_thread; 248 lldb_private::ConstString m_dyld_plugin_name; 249 lldb::addr_t m_kernel_load_addr; 250 lldb::CommandObjectSP m_command_sp; 251 lldb::ThreadWP m_kernel_thread_wp; 252 253 254 bool 255 StartAsyncThread (); 256 257 void 258 StopAsyncThread (); 259 260 static void * 261 AsyncThread (void *arg); 262 263 private: 264 //------------------------------------------------------------------ 265 // For ProcessKDP only 266 //------------------------------------------------------------------ 267 268 DISALLOW_COPY_AND_ASSIGN (ProcessKDP); 269 270 }; 271 272 #endif // liblldb_ProcessKDP_h_ 273