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/Error.h" 23 #include "lldb/Core/InputReader.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 Terminate(); 51 52 static const char * 53 GetPluginNameStatic(); 54 55 static const char * 56 GetPluginDescriptionStatic(); 57 58 //------------------------------------------------------------------ 59 // Constructors and Destructors 60 //------------------------------------------------------------------ 61 ProcessKDP(lldb_private::Target& target, lldb_private::Listener &listener); 62 63 virtual 64 ~ProcessKDP(); 65 66 //------------------------------------------------------------------ 67 // Check if a given Process 68 //------------------------------------------------------------------ 69 virtual bool 70 CanDebug (lldb_private::Target &target, 71 bool plugin_specified_by_name); 72 73 virtual lldb_private::CommandObject * 74 GetPluginCommandObject(); 75 76 //------------------------------------------------------------------ 77 // Creating a new process, or attaching to an existing one 78 //------------------------------------------------------------------ 79 virtual lldb_private::Error 80 WillLaunch (lldb_private::Module* module); 81 82 virtual lldb_private::Error 83 DoLaunch (lldb_private::Module *exe_module, 84 const lldb_private::ProcessLaunchInfo &launch_info); 85 86 virtual lldb_private::Error 87 WillAttachToProcessWithID (lldb::pid_t pid); 88 89 virtual lldb_private::Error 90 WillAttachToProcessWithName (const char *process_name, bool wait_for_launch); 91 92 virtual lldb_private::Error 93 DoConnectRemote (lldb_private::Stream *strm, const char *remote_url); 94 95 virtual lldb_private::Error 96 DoAttachToProcessWithID (lldb::pid_t pid); 97 98 virtual lldb_private::Error 99 DoAttachToProcessWithID (lldb::pid_t pid, const lldb_private::ProcessAttachInfo &attach_info); 100 101 virtual lldb_private::Error 102 DoAttachToProcessWithName (const char *process_name, bool wait_for_launch, const lldb_private::ProcessAttachInfo &attach_info); 103 104 virtual void 105 DidAttach (); 106 107 lldb::addr_t 108 GetImageInfoAddress(); 109 110 lldb_private::DynamicLoader * 111 GetDynamicLoader (); 112 113 //------------------------------------------------------------------ 114 // PluginInterface protocol 115 //------------------------------------------------------------------ 116 virtual const char * 117 GetPluginName(); 118 119 virtual const char * 120 GetShortPluginName(); 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 (); 139 140 virtual lldb_private::Error 141 DoSignal (int signal); 142 143 virtual lldb_private::Error 144 WillDestroy (); 145 146 virtual lldb_private::Error 147 DoDestroy (); 148 149 virtual void 150 RefreshStateAfterStop(); 151 152 //------------------------------------------------------------------ 153 // Process Queries 154 //------------------------------------------------------------------ 155 virtual bool 156 IsAlive (); 157 158 //------------------------------------------------------------------ 159 // Process Memory 160 //------------------------------------------------------------------ 161 virtual size_t 162 DoReadMemory (lldb::addr_t addr, void *buf, size_t size, lldb_private::Error &error); 163 164 virtual size_t 165 DoWriteMemory (lldb::addr_t addr, const void *buf, size_t size, lldb_private::Error &error); 166 167 virtual lldb::addr_t 168 DoAllocateMemory (size_t size, uint32_t permissions, lldb_private::Error &error); 169 170 virtual lldb_private::Error 171 DoDeallocateMemory (lldb::addr_t ptr); 172 173 //---------------------------------------------------------------------- 174 // Process Breakpoints 175 //---------------------------------------------------------------------- 176 virtual lldb_private::Error 177 EnableBreakpoint (lldb_private::BreakpointSite *bp_site); 178 179 virtual lldb_private::Error 180 DisableBreakpoint (lldb_private::BreakpointSite *bp_site); 181 182 //---------------------------------------------------------------------- 183 // Process Watchpoints 184 //---------------------------------------------------------------------- 185 virtual lldb_private::Error 186 EnableWatchpoint (lldb_private::Watchpoint *wp, bool notify = true); 187 188 virtual lldb_private::Error 189 DisableWatchpoint (lldb_private::Watchpoint *wp, bool notify = true); 190 191 CommunicationKDP & 192 GetCommunication() 193 { 194 return m_comm; 195 } 196 197 protected: 198 friend class ThreadKDP; 199 friend class CommunicationKDP; 200 201 //---------------------------------------------------------------------- 202 // Accessors 203 //---------------------------------------------------------------------- 204 bool 205 IsRunning ( lldb::StateType state ) 206 { 207 return state == lldb::eStateRunning || IsStepping(state); 208 } 209 210 bool 211 IsStepping ( lldb::StateType state) 212 { 213 return state == lldb::eStateStepping; 214 } 215 216 bool 217 CanResume ( lldb::StateType state) 218 { 219 return state == lldb::eStateStopped; 220 } 221 222 bool 223 HasExited (lldb::StateType state) 224 { 225 return state == lldb::eStateExited; 226 } 227 228 bool 229 ProcessIDIsValid ( ) const; 230 231 // static void 232 // STDIOReadThreadBytesReceived (void *baton, const void *src, size_t src_len); 233 234 // void 235 // AppendSTDOUT (const char* s, size_t len); 236 237 void 238 Clear ( ); 239 240 virtual bool 241 UpdateThreadList (lldb_private::ThreadList &old_thread_list, 242 lldb_private::ThreadList &new_thread_list); 243 244 enum 245 { 246 eBroadcastBitAsyncContinue = (1 << 0), 247 eBroadcastBitAsyncThreadShouldExit = (1 << 1) 248 }; 249 250 lldb::ThreadSP 251 GetKernelThread (lldb_private::ThreadList &old_thread_list, 252 lldb_private::ThreadList &new_thread_list); 253 254 //------------------------------------------------------------------ 255 /// Broadcaster event bits definitions. 256 //------------------------------------------------------------------ 257 CommunicationKDP m_comm; 258 lldb_private::Broadcaster m_async_broadcaster; 259 lldb::thread_t m_async_thread; 260 bool m_destroy_in_process; 261 std::string m_dyld_plugin_name; 262 lldb::addr_t m_kernel_load_addr; 263 lldb::CommandObjectSP m_command_sp; 264 265 266 bool 267 StartAsyncThread (); 268 269 void 270 StopAsyncThread (); 271 272 static void * 273 AsyncThread (void *arg); 274 275 private: 276 //------------------------------------------------------------------ 277 // For ProcessKDP only 278 //------------------------------------------------------------------ 279 280 DISALLOW_COPY_AND_ASSIGN (ProcessKDP); 281 282 }; 283 284 #endif // liblldb_ProcessKDP_h_ 285