blob: fa5d2bd27feb247e541cf8e18e882bc6a5172da7 [file] [log] [blame]
Greg Clayton59ec5122011-07-15 18:02:58 +00001//===-- ProcessKDP.h --------------------------------------------*- C++ -*-===//
Greg Claytonf9765ac2011-07-15 03:27:12 +00002//
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 Molenda2e56a252013-05-11 03:09:05 +000022#include "lldb/Core/ConstString.h"
Greg Claytonf9765ac2011-07-15 03:27:12 +000023#include "lldb/Core/Error.h"
Greg Claytonf9765ac2011-07-15 03:27:12 +000024#include "lldb/Core/StreamString.h"
25#include "lldb/Core/StringList.h"
26#include "lldb/Core/ThreadSafeValue.h"
Zachary Turner39de3112014-09-09 20:54:56 +000027#include "lldb/Host/HostThread.h"
Greg Claytonf9765ac2011-07-15 03:27:12 +000028#include "lldb/Target/Process.h"
29#include "lldb/Target/Thread.h"
30
31#include "CommunicationKDP.h"
Greg Claytonf9765ac2011-07-15 03:27:12 +000032
33class ThreadKDP;
34
Kate Stoneb9c1b512016-09-06 20:57:50 +000035class ProcessKDP : public lldb_private::Process {
Greg Claytonf9765ac2011-07-15 03:27:12 +000036public:
Kate Stoneb9c1b512016-09-06 20:57:50 +000037 //------------------------------------------------------------------
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 Clayton7f982402013-07-15 22:54:20 +000043
Kate Stoneb9c1b512016-09-06 20:57:50 +000044 static void Initialize();
Jason Molenda5e8534e2012-10-03 01:29:34 +000045
Kate Stoneb9c1b512016-09-06 20:57:50 +000046 static void DebuggerInitialize(lldb_private::Debugger &debugger);
Jason Molenda5e8534e2012-10-03 01:29:34 +000047
Kate Stoneb9c1b512016-09-06 20:57:50 +000048 static void Terminate();
Greg Claytonf9765ac2011-07-15 03:27:12 +000049
Kate Stoneb9c1b512016-09-06 20:57:50 +000050 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 Clayton3ce7e992016-12-07 23:51:49 +000059 ~ProcessKDP() override;
Kate Stoneb9c1b512016-09-06 20:57:50 +000060
61 //------------------------------------------------------------------
62 // Check if a given Process
63 //------------------------------------------------------------------
Greg Clayton3ce7e992016-12-07 23:51:49 +000064 bool CanDebug(lldb::TargetSP target_sp,
65 bool plugin_specified_by_name) override;
66 lldb_private::CommandObject *GetPluginCommandObject() override;
Kate Stoneb9c1b512016-09-06 20:57:50 +000067
68 //------------------------------------------------------------------
69 // Creating a new process, or attaching to an existing one
70 //------------------------------------------------------------------
Greg Clayton3ce7e992016-12-07 23:51:49 +000071 lldb_private::Error WillLaunch(lldb_private::Module *module) override;
Kate Stoneb9c1b512016-09-06 20:57:50 +000072
Greg Clayton3ce7e992016-12-07 23:51:49 +000073 lldb_private::Error
Kate Stoneb9c1b512016-09-06 20:57:50 +000074 DoLaunch(lldb_private::Module *exe_module,
Greg Clayton3ce7e992016-12-07 23:51:49 +000075 lldb_private::ProcessLaunchInfo &launch_info) override;
Kate Stoneb9c1b512016-09-06 20:57:50 +000076
Greg Clayton3ce7e992016-12-07 23:51:49 +000077 lldb_private::Error WillAttachToProcessWithID(lldb::pid_t pid) override;
Kate Stoneb9c1b512016-09-06 20:57:50 +000078
Greg Clayton3ce7e992016-12-07 23:51:49 +000079 lldb_private::Error
80 WillAttachToProcessWithName(const char *process_name,
81 bool wait_for_launch) override;
Kate Stoneb9c1b512016-09-06 20:57:50 +000082
Greg Clayton3ce7e992016-12-07 23:51:49 +000083 lldb_private::Error DoConnectRemote(lldb_private::Stream *strm,
84 llvm::StringRef remote_url) override;
Kate Stoneb9c1b512016-09-06 20:57:50 +000085
Greg Clayton3ce7e992016-12-07 23:51:49 +000086 lldb_private::Error DoAttachToProcessWithID(
87 lldb::pid_t pid,
88 const lldb_private::ProcessAttachInfo &attach_info) override;
Kate Stoneb9c1b512016-09-06 20:57:50 +000089
Greg Clayton3ce7e992016-12-07 23:51:49 +000090 lldb_private::Error DoAttachToProcessWithName(
91 const char *process_name,
92 const lldb_private::ProcessAttachInfo &attach_info) override;
Kate Stoneb9c1b512016-09-06 20:57:50 +000093
Greg Clayton3ce7e992016-12-07 23:51:49 +000094 void DidAttach(lldb_private::ArchSpec &process_arch) override;
Kate Stoneb9c1b512016-09-06 20:57:50 +000095
Greg Clayton3ce7e992016-12-07 23:51:49 +000096 lldb::addr_t GetImageInfoAddress() override;
Kate Stoneb9c1b512016-09-06 20:57:50 +000097
Greg Clayton3ce7e992016-12-07 23:51:49 +000098 lldb_private::DynamicLoader *GetDynamicLoader() override;
Kate Stoneb9c1b512016-09-06 20:57:50 +000099
100 //------------------------------------------------------------------
101 // PluginInterface protocol
102 //------------------------------------------------------------------
Greg Clayton3ce7e992016-12-07 23:51:49 +0000103 lldb_private::ConstString GetPluginName() override;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000104
Greg Clayton3ce7e992016-12-07 23:51:49 +0000105 uint32_t GetPluginVersion() override;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000106
107 //------------------------------------------------------------------
108 // Process Control
109 //------------------------------------------------------------------
Greg Clayton3ce7e992016-12-07 23:51:49 +0000110 lldb_private::Error WillResume() override;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000111
Greg Clayton3ce7e992016-12-07 23:51:49 +0000112 lldb_private::Error DoResume() override;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000113
Greg Clayton3ce7e992016-12-07 23:51:49 +0000114 lldb_private::Error DoHalt(bool &caused_stop) override;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000115
Greg Clayton3ce7e992016-12-07 23:51:49 +0000116 lldb_private::Error DoDetach(bool keep_stopped) override;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000117
Greg Clayton3ce7e992016-12-07 23:51:49 +0000118 lldb_private::Error DoSignal(int signal) override;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000119
Greg Clayton3ce7e992016-12-07 23:51:49 +0000120 lldb_private::Error DoDestroy() override;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000121
Greg Clayton3ce7e992016-12-07 23:51:49 +0000122 void RefreshStateAfterStop() override;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000123
124 //------------------------------------------------------------------
125 // Process Queries
126 //------------------------------------------------------------------
Greg Clayton3ce7e992016-12-07 23:51:49 +0000127 bool IsAlive() override;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000128
129 //------------------------------------------------------------------
130 // Process Memory
131 //------------------------------------------------------------------
Greg Clayton3ce7e992016-12-07 23:51:49 +0000132 size_t DoReadMemory(lldb::addr_t addr, void *buf, size_t size,
133 lldb_private::Error &error) override;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000134
Greg Clayton3ce7e992016-12-07 23:51:49 +0000135 size_t DoWriteMemory(lldb::addr_t addr, const void *buf, size_t size,
136 lldb_private::Error &error) override;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000137
Greg Clayton3ce7e992016-12-07 23:51:49 +0000138 lldb::addr_t DoAllocateMemory(size_t size, uint32_t permissions,
139 lldb_private::Error &error) override;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000140
Greg Clayton3ce7e992016-12-07 23:51:49 +0000141 lldb_private::Error DoDeallocateMemory(lldb::addr_t ptr) override;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000142
143 //----------------------------------------------------------------------
144 // Process Breakpoints
145 //----------------------------------------------------------------------
Greg Clayton3ce7e992016-12-07 23:51:49 +0000146 lldb_private::Error
147 EnableBreakpointSite(lldb_private::BreakpointSite *bp_site) override;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000148
Greg Clayton3ce7e992016-12-07 23:51:49 +0000149 lldb_private::Error
150 DisableBreakpointSite(lldb_private::BreakpointSite *bp_site) override;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000151
152 //----------------------------------------------------------------------
153 // Process Watchpoints
154 //----------------------------------------------------------------------
Greg Clayton3ce7e992016-12-07 23:51:49 +0000155 lldb_private::Error EnableWatchpoint(lldb_private::Watchpoint *wp,
156 bool notify = true) override;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000157
Greg Clayton3ce7e992016-12-07 23:51:49 +0000158 lldb_private::Error DisableWatchpoint(lldb_private::Watchpoint *wp,
159 bool notify = true) override;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000160
161 CommunicationKDP &GetCommunication() { return m_comm; }
Greg Claytona63d08c2011-07-19 03:57:15 +0000162
Greg Claytonf9765ac2011-07-15 03:27:12 +0000163protected:
Kate Stoneb9c1b512016-09-06 20:57:50 +0000164 friend class ThreadKDP;
165 friend class CommunicationKDP;
Greg Claytonf9765ac2011-07-15 03:27:12 +0000166
Kate Stoneb9c1b512016-09-06 20:57:50 +0000167 //----------------------------------------------------------------------
168 // Accessors
169 //----------------------------------------------------------------------
170 bool IsRunning(lldb::StateType state) {
171 return state == lldb::eStateRunning || IsStepping(state);
172 }
Greg Claytona3706882015-10-28 23:26:59 +0000173
Kate Stoneb9c1b512016-09-06 20:57:50 +0000174 bool IsStepping(lldb::StateType state) {
175 return state == lldb::eStateStepping;
176 }
Greg Claytona3706882015-10-28 23:26:59 +0000177
Kate Stoneb9c1b512016-09-06 20:57:50 +0000178 bool CanResume(lldb::StateType state) { return state == lldb::eStateStopped; }
Greg Claytonf9765ac2011-07-15 03:27:12 +0000179
Kate Stoneb9c1b512016-09-06 20:57:50 +0000180 bool HasExited(lldb::StateType state) { return state == lldb::eStateExited; }
Greg Clayton1d19a2f2012-10-19 22:22:57 +0000181
Kate Stoneb9c1b512016-09-06 20:57:50 +0000182 bool GetHostArchitecture(lldb_private::ArchSpec &arch);
Greg Claytonf9765ac2011-07-15 03:27:12 +0000183
Kate Stoneb9c1b512016-09-06 20:57:50 +0000184 bool ProcessIDIsValid() const;
185
186 void Clear();
187
Greg Clayton3ce7e992016-12-07 23:51:49 +0000188 bool UpdateThreadList(lldb_private::ThreadList &old_thread_list,
189 lldb_private::ThreadList &new_thread_list) override;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000190
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 Claytonf9765ac2011-07-15 03:27:12 +0000215private:
Kate Stoneb9c1b512016-09-06 20:57:50 +0000216 //------------------------------------------------------------------
217 // For ProcessKDP only
218 //------------------------------------------------------------------
219
220 DISALLOW_COPY_AND_ASSIGN(ProcessKDP);
Greg Claytonf9765ac2011-07-15 03:27:12 +0000221};
222
Kate Stoneb9c1b512016-09-06 20:57:50 +0000223#endif // liblldb_ProcessKDP_h_