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