Greg Clayton | 59ec512 | 2011-07-15 18:02:58 +0000 | [diff] [blame] | 1 | //===-- ProcessKDP.h --------------------------------------------*- C++ -*-===// |
Greg Clayton | f9765ac | 2011-07-15 03:27:12 +0000 | [diff] [blame] | 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" |
Jason Molenda | 2e56a25 | 2013-05-11 03:09:05 +0000 | [diff] [blame] | 22 | #include "lldb/Core/ConstString.h" |
Greg Clayton | f9765ac | 2011-07-15 03:27:12 +0000 | [diff] [blame] | 23 | #include "lldb/Core/Error.h" |
Greg Clayton | f9765ac | 2011-07-15 03:27:12 +0000 | [diff] [blame] | 24 | #include "lldb/Core/StreamString.h" |
| 25 | #include "lldb/Core/StringList.h" |
| 26 | #include "lldb/Core/ThreadSafeValue.h" |
Zachary Turner | 39de311 | 2014-09-09 20:54:56 +0000 | [diff] [blame] | 27 | #include "lldb/Host/HostThread.h" |
Greg Clayton | f9765ac | 2011-07-15 03:27:12 +0000 | [diff] [blame] | 28 | #include "lldb/Target/Process.h" |
| 29 | #include "lldb/Target/Thread.h" |
| 30 | |
| 31 | #include "CommunicationKDP.h" |
Greg Clayton | f9765ac | 2011-07-15 03:27:12 +0000 | [diff] [blame] | 32 | |
| 33 | class ThreadKDP; |
| 34 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 35 | class ProcessKDP : public lldb_private::Process { |
Greg Clayton | f9765ac | 2011-07-15 03:27:12 +0000 | [diff] [blame] | 36 | public: |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 37 | //------------------------------------------------------------------ |
| 38 | // Constructors and Destructors |
| 39 | //------------------------------------------------------------------ |
| 40 | static lldb::ProcessSP |
| 41 | CreateInstance(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp, |
| 42 | const lldb_private::FileSpec *crash_file_path); |
Greg Clayton | 7f98240 | 2013-07-15 22:54:20 +0000 | [diff] [blame] | 43 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 44 | static void Initialize(); |
Jason Molenda | 5e8534e | 2012-10-03 01:29:34 +0000 | [diff] [blame] | 45 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 46 | static void DebuggerInitialize(lldb_private::Debugger &debugger); |
Jason Molenda | 5e8534e | 2012-10-03 01:29:34 +0000 | [diff] [blame] | 47 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 48 | static void Terminate(); |
Greg Clayton | f9765ac | 2011-07-15 03:27:12 +0000 | [diff] [blame] | 49 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 50 | static lldb_private::ConstString GetPluginNameStatic(); |
| 51 | |
| 52 | static const char *GetPluginDescriptionStatic(); |
| 53 | |
| 54 | //------------------------------------------------------------------ |
| 55 | // Constructors and Destructors |
| 56 | //------------------------------------------------------------------ |
| 57 | ProcessKDP(lldb::TargetSP target_sp, lldb::ListenerSP listener); |
| 58 | |
Greg Clayton | 3ce7e99 | 2016-12-07 23:51:49 +0000 | [diff] [blame] | 59 | ~ProcessKDP() override; |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 60 | |
| 61 | //------------------------------------------------------------------ |
| 62 | // Check if a given Process |
| 63 | //------------------------------------------------------------------ |
Greg Clayton | 3ce7e99 | 2016-12-07 23:51:49 +0000 | [diff] [blame] | 64 | bool CanDebug(lldb::TargetSP target_sp, |
| 65 | bool plugin_specified_by_name) override; |
| 66 | lldb_private::CommandObject *GetPluginCommandObject() override; |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 67 | |
| 68 | //------------------------------------------------------------------ |
| 69 | // Creating a new process, or attaching to an existing one |
| 70 | //------------------------------------------------------------------ |
Greg Clayton | 3ce7e99 | 2016-12-07 23:51:49 +0000 | [diff] [blame] | 71 | lldb_private::Error WillLaunch(lldb_private::Module *module) override; |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 72 | |
Greg Clayton | 3ce7e99 | 2016-12-07 23:51:49 +0000 | [diff] [blame] | 73 | lldb_private::Error |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 74 | DoLaunch(lldb_private::Module *exe_module, |
Greg Clayton | 3ce7e99 | 2016-12-07 23:51:49 +0000 | [diff] [blame] | 75 | lldb_private::ProcessLaunchInfo &launch_info) override; |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 76 | |
Greg Clayton | 3ce7e99 | 2016-12-07 23:51:49 +0000 | [diff] [blame] | 77 | lldb_private::Error WillAttachToProcessWithID(lldb::pid_t pid) override; |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 78 | |
Greg Clayton | 3ce7e99 | 2016-12-07 23:51:49 +0000 | [diff] [blame] | 79 | lldb_private::Error |
| 80 | WillAttachToProcessWithName(const char *process_name, |
| 81 | bool wait_for_launch) override; |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 82 | |
Greg Clayton | 3ce7e99 | 2016-12-07 23:51:49 +0000 | [diff] [blame] | 83 | lldb_private::Error DoConnectRemote(lldb_private::Stream *strm, |
| 84 | llvm::StringRef remote_url) override; |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 85 | |
Greg Clayton | 3ce7e99 | 2016-12-07 23:51:49 +0000 | [diff] [blame] | 86 | lldb_private::Error DoAttachToProcessWithID( |
| 87 | lldb::pid_t pid, |
| 88 | const lldb_private::ProcessAttachInfo &attach_info) override; |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 89 | |
Greg Clayton | 3ce7e99 | 2016-12-07 23:51:49 +0000 | [diff] [blame] | 90 | lldb_private::Error DoAttachToProcessWithName( |
| 91 | const char *process_name, |
| 92 | const lldb_private::ProcessAttachInfo &attach_info) override; |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 93 | |
Greg Clayton | 3ce7e99 | 2016-12-07 23:51:49 +0000 | [diff] [blame] | 94 | void DidAttach(lldb_private::ArchSpec &process_arch) override; |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 95 | |
Greg Clayton | 3ce7e99 | 2016-12-07 23:51:49 +0000 | [diff] [blame] | 96 | lldb::addr_t GetImageInfoAddress() override; |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 97 | |
Greg Clayton | 3ce7e99 | 2016-12-07 23:51:49 +0000 | [diff] [blame] | 98 | lldb_private::DynamicLoader *GetDynamicLoader() override; |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 99 | |
| 100 | //------------------------------------------------------------------ |
| 101 | // PluginInterface protocol |
| 102 | //------------------------------------------------------------------ |
Greg Clayton | 3ce7e99 | 2016-12-07 23:51:49 +0000 | [diff] [blame] | 103 | lldb_private::ConstString GetPluginName() override; |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 104 | |
Greg Clayton | 3ce7e99 | 2016-12-07 23:51:49 +0000 | [diff] [blame] | 105 | uint32_t GetPluginVersion() override; |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 106 | |
| 107 | //------------------------------------------------------------------ |
| 108 | // Process Control |
| 109 | //------------------------------------------------------------------ |
Greg Clayton | 3ce7e99 | 2016-12-07 23:51:49 +0000 | [diff] [blame] | 110 | lldb_private::Error WillResume() override; |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 111 | |
Greg Clayton | 3ce7e99 | 2016-12-07 23:51:49 +0000 | [diff] [blame] | 112 | lldb_private::Error DoResume() override; |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 113 | |
Greg Clayton | 3ce7e99 | 2016-12-07 23:51:49 +0000 | [diff] [blame] | 114 | lldb_private::Error DoHalt(bool &caused_stop) override; |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 115 | |
Greg Clayton | 3ce7e99 | 2016-12-07 23:51:49 +0000 | [diff] [blame] | 116 | lldb_private::Error DoDetach(bool keep_stopped) override; |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 117 | |
Greg Clayton | 3ce7e99 | 2016-12-07 23:51:49 +0000 | [diff] [blame] | 118 | lldb_private::Error DoSignal(int signal) override; |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 119 | |
Greg Clayton | 3ce7e99 | 2016-12-07 23:51:49 +0000 | [diff] [blame] | 120 | lldb_private::Error DoDestroy() override; |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 121 | |
Greg Clayton | 3ce7e99 | 2016-12-07 23:51:49 +0000 | [diff] [blame] | 122 | void RefreshStateAfterStop() override; |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 123 | |
| 124 | //------------------------------------------------------------------ |
| 125 | // Process Queries |
| 126 | //------------------------------------------------------------------ |
Greg Clayton | 3ce7e99 | 2016-12-07 23:51:49 +0000 | [diff] [blame] | 127 | bool IsAlive() override; |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 128 | |
| 129 | //------------------------------------------------------------------ |
| 130 | // Process Memory |
| 131 | //------------------------------------------------------------------ |
Greg Clayton | 3ce7e99 | 2016-12-07 23:51:49 +0000 | [diff] [blame] | 132 | size_t DoReadMemory(lldb::addr_t addr, void *buf, size_t size, |
| 133 | lldb_private::Error &error) override; |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 134 | |
Greg Clayton | 3ce7e99 | 2016-12-07 23:51:49 +0000 | [diff] [blame] | 135 | size_t DoWriteMemory(lldb::addr_t addr, const void *buf, size_t size, |
| 136 | lldb_private::Error &error) override; |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 137 | |
Greg Clayton | 3ce7e99 | 2016-12-07 23:51:49 +0000 | [diff] [blame] | 138 | lldb::addr_t DoAllocateMemory(size_t size, uint32_t permissions, |
| 139 | lldb_private::Error &error) override; |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 140 | |
Greg Clayton | 3ce7e99 | 2016-12-07 23:51:49 +0000 | [diff] [blame] | 141 | lldb_private::Error DoDeallocateMemory(lldb::addr_t ptr) override; |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 142 | |
| 143 | //---------------------------------------------------------------------- |
| 144 | // Process Breakpoints |
| 145 | //---------------------------------------------------------------------- |
Greg Clayton | 3ce7e99 | 2016-12-07 23:51:49 +0000 | [diff] [blame] | 146 | lldb_private::Error |
| 147 | EnableBreakpointSite(lldb_private::BreakpointSite *bp_site) override; |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 148 | |
Greg Clayton | 3ce7e99 | 2016-12-07 23:51:49 +0000 | [diff] [blame] | 149 | lldb_private::Error |
| 150 | DisableBreakpointSite(lldb_private::BreakpointSite *bp_site) override; |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 151 | |
| 152 | //---------------------------------------------------------------------- |
| 153 | // Process Watchpoints |
| 154 | //---------------------------------------------------------------------- |
Greg Clayton | 3ce7e99 | 2016-12-07 23:51:49 +0000 | [diff] [blame] | 155 | lldb_private::Error EnableWatchpoint(lldb_private::Watchpoint *wp, |
| 156 | bool notify = true) override; |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 157 | |
Greg Clayton | 3ce7e99 | 2016-12-07 23:51:49 +0000 | [diff] [blame] | 158 | lldb_private::Error DisableWatchpoint(lldb_private::Watchpoint *wp, |
| 159 | bool notify = true) override; |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 160 | |
| 161 | CommunicationKDP &GetCommunication() { return m_comm; } |
Greg Clayton | a63d08c | 2011-07-19 03:57:15 +0000 | [diff] [blame] | 162 | |
Greg Clayton | f9765ac | 2011-07-15 03:27:12 +0000 | [diff] [blame] | 163 | protected: |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 164 | friend class ThreadKDP; |
| 165 | friend class CommunicationKDP; |
Greg Clayton | f9765ac | 2011-07-15 03:27:12 +0000 | [diff] [blame] | 166 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 167 | //---------------------------------------------------------------------- |
| 168 | // Accessors |
| 169 | //---------------------------------------------------------------------- |
| 170 | bool IsRunning(lldb::StateType state) { |
| 171 | return state == lldb::eStateRunning || IsStepping(state); |
| 172 | } |
Greg Clayton | a370688 | 2015-10-28 23:26:59 +0000 | [diff] [blame] | 173 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 174 | bool IsStepping(lldb::StateType state) { |
| 175 | return state == lldb::eStateStepping; |
| 176 | } |
Greg Clayton | a370688 | 2015-10-28 23:26:59 +0000 | [diff] [blame] | 177 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 178 | bool CanResume(lldb::StateType state) { return state == lldb::eStateStopped; } |
Greg Clayton | f9765ac | 2011-07-15 03:27:12 +0000 | [diff] [blame] | 179 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 180 | bool HasExited(lldb::StateType state) { return state == lldb::eStateExited; } |
Greg Clayton | 1d19a2f | 2012-10-19 22:22:57 +0000 | [diff] [blame] | 181 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 182 | bool GetHostArchitecture(lldb_private::ArchSpec &arch); |
Greg Clayton | f9765ac | 2011-07-15 03:27:12 +0000 | [diff] [blame] | 183 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 184 | bool ProcessIDIsValid() const; |
| 185 | |
| 186 | void Clear(); |
| 187 | |
Greg Clayton | 3ce7e99 | 2016-12-07 23:51:49 +0000 | [diff] [blame] | 188 | bool UpdateThreadList(lldb_private::ThreadList &old_thread_list, |
| 189 | lldb_private::ThreadList &new_thread_list) override; |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 190 | |
| 191 | enum { |
| 192 | eBroadcastBitAsyncContinue = (1 << 0), |
| 193 | eBroadcastBitAsyncThreadShouldExit = (1 << 1) |
| 194 | }; |
| 195 | |
| 196 | lldb::ThreadSP GetKernelThread(); |
| 197 | |
| 198 | //------------------------------------------------------------------ |
| 199 | /// Broadcaster event bits definitions. |
| 200 | //------------------------------------------------------------------ |
| 201 | CommunicationKDP m_comm; |
| 202 | lldb_private::Broadcaster m_async_broadcaster; |
| 203 | lldb_private::HostThread m_async_thread; |
| 204 | lldb_private::ConstString m_dyld_plugin_name; |
| 205 | lldb::addr_t m_kernel_load_addr; |
| 206 | lldb::CommandObjectSP m_command_sp; |
| 207 | lldb::ThreadWP m_kernel_thread_wp; |
| 208 | |
| 209 | bool StartAsyncThread(); |
| 210 | |
| 211 | void StopAsyncThread(); |
| 212 | |
| 213 | static void *AsyncThread(void *arg); |
| 214 | |
Greg Clayton | f9765ac | 2011-07-15 03:27:12 +0000 | [diff] [blame] | 215 | private: |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 216 | //------------------------------------------------------------------ |
| 217 | // For ProcessKDP only |
| 218 | //------------------------------------------------------------------ |
| 219 | |
| 220 | DISALLOW_COPY_AND_ASSIGN(ProcessKDP); |
Greg Clayton | f9765ac | 2011-07-15 03:27:12 +0000 | [diff] [blame] | 221 | }; |
| 222 | |
Kate Stone | b9c1b51 | 2016-09-06 20:57:50 +0000 | [diff] [blame] | 223 | #endif // liblldb_ProcessKDP_h_ |