1 //===-- ProcessGDBRemote.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_ProcessGDBRemote_h_
11 #define liblldb_ProcessGDBRemote_h_
12 
13 // C Includes
14 // C++ Includes
15 #include <atomic>
16 #include <map>
17 #include <string>
18 #include <vector>
19 
20 // Other libraries and framework includes
21 // Project includes
22 #include "lldb/Core/ArchSpec.h"
23 #include "lldb/Core/Broadcaster.h"
24 #include "lldb/Core/ConstString.h"
25 #include "lldb/Core/Error.h"
26 #include "lldb/Core/StreamString.h"
27 #include "lldb/Core/StringList.h"
28 #include "lldb/Core/StructuredData.h"
29 #include "lldb/Core/ThreadSafeValue.h"
30 #include "lldb/Host/HostThread.h"
31 #include "lldb/lldb-private-forward.h"
32 #include "lldb/Utility/StringExtractor.h"
33 #include "lldb/Target/Process.h"
34 #include "lldb/Target/Thread.h"
35 
36 #include "GDBRemoteCommunicationClient.h"
37 #include "GDBRemoteRegisterContext.h"
38 
39 namespace lldb_private {
40 namespace process_gdb_remote {
41 
42 class ThreadGDBRemote;
43 
44 class ProcessGDBRemote : public Process
45 {
46 public:
47     ProcessGDBRemote(lldb::TargetSP target_sp, Listener &listener);
48 
49     ~ProcessGDBRemote() override;
50 
51     static lldb::ProcessSP
52     CreateInstance (lldb::TargetSP target_sp,
53                     Listener &listener,
54                     const FileSpec *crash_file_path);
55 
56     static void
57     Initialize();
58 
59     static void
60     DebuggerInitialize (Debugger &debugger);
61 
62     static void
63     Terminate();
64 
65     static ConstString
66     GetPluginNameStatic();
67 
68     static const char *
69     GetPluginDescriptionStatic();
70 
71     //------------------------------------------------------------------
72     // Check if a given Process
73     //------------------------------------------------------------------
74     bool
75     CanDebug (lldb::TargetSP target_sp, bool plugin_specified_by_name) override;
76 
77     CommandObject *
78     GetPluginCommandObject() override;
79 
80     //------------------------------------------------------------------
81     // Creating a new process, or attaching to an existing one
82     //------------------------------------------------------------------
83     Error
84     WillLaunch (Module* module) override;
85 
86     Error
87     DoLaunch (Module *exe_module, ProcessLaunchInfo &launch_info) override;
88 
89     void
90     DidLaunch () override;
91 
92     Error
93     WillAttachToProcessWithID (lldb::pid_t pid) override;
94 
95     Error
96     WillAttachToProcessWithName (const char *process_name, bool wait_for_launch) override;
97 
98     Error
99     DoConnectRemote (Stream *strm, const char *remote_url) override;
100 
101     Error
102     WillLaunchOrAttach ();
103 
104     Error
105     DoAttachToProcessWithID (lldb::pid_t pid, const ProcessAttachInfo &attach_info) override;
106 
107     Error
108     DoAttachToProcessWithName (const char *process_name,
109                                const ProcessAttachInfo &attach_info) override;
110 
111     void
112     DidAttach (ArchSpec &process_arch) override;
113 
114     //------------------------------------------------------------------
115     // PluginInterface protocol
116     //------------------------------------------------------------------
117     ConstString
118     GetPluginName() override;
119 
120     uint32_t
121     GetPluginVersion() override;
122 
123     //------------------------------------------------------------------
124     // Process Control
125     //------------------------------------------------------------------
126     Error
127     WillResume () override;
128 
129     Error
130     DoResume () override;
131 
132     Error
133     DoHalt (bool &caused_stop) override;
134 
135     Error
136     DoDetach (bool keep_stopped) override;
137 
138     bool
139     DetachRequiresHalt() override { return true; }
140 
141     Error
142     DoSignal (int signal) override;
143 
144     Error
145     DoDestroy () override;
146 
147     void
148     RefreshStateAfterStop() override;
149 
150     void
151     SetUnixSignals(const lldb::UnixSignalsSP &signals_sp);
152 
153     //------------------------------------------------------------------
154     // Process Queries
155     //------------------------------------------------------------------
156     bool
157     IsAlive () override;
158 
159     lldb::addr_t
160     GetImageInfoAddress() override;
161 
162     void
163     WillPublicStop () override;
164 
165     //------------------------------------------------------------------
166     // Process Memory
167     //------------------------------------------------------------------
168     size_t
169     DoReadMemory (lldb::addr_t addr, void *buf, size_t size, Error &error) override;
170 
171     size_t
172     DoWriteMemory (lldb::addr_t addr, const void *buf, size_t size, Error &error) override;
173 
174     lldb::addr_t
175     DoAllocateMemory (size_t size, uint32_t permissions, Error &error) override;
176 
177     Error
178     GetMemoryRegionInfo (lldb::addr_t load_addr, MemoryRegionInfo &region_info) override;
179 
180     Error
181     DoDeallocateMemory (lldb::addr_t ptr) override;
182 
183     //------------------------------------------------------------------
184     // Process STDIO
185     //------------------------------------------------------------------
186     size_t
187     PutSTDIN (const char *buf, size_t buf_size, Error &error) override;
188 
189     //----------------------------------------------------------------------
190     // Process Breakpoints
191     //----------------------------------------------------------------------
192     Error
193     EnableBreakpointSite (BreakpointSite *bp_site) override;
194 
195     Error
196     DisableBreakpointSite (BreakpointSite *bp_site) override;
197 
198     //----------------------------------------------------------------------
199     // Process Watchpoints
200     //----------------------------------------------------------------------
201     Error
202     EnableWatchpoint (Watchpoint *wp, bool notify = true) override;
203 
204     Error
205     DisableWatchpoint (Watchpoint *wp, bool notify = true) override;
206 
207     Error
208     GetWatchpointSupportInfo (uint32_t &num) override;
209 
210     Error
211     GetWatchpointSupportInfo (uint32_t &num, bool& after) override;
212 
213     bool
214     StartNoticingNewThreads() override;
215 
216     bool
217     StopNoticingNewThreads() override;
218 
219     GDBRemoteCommunicationClient &
220     GetGDBRemote()
221     {
222         return m_gdb_comm;
223     }
224 
225     Error
226     SendEventData(const char *data) override;
227 
228     //----------------------------------------------------------------------
229     // Override DidExit so we can disconnect from the remote GDB server
230     //----------------------------------------------------------------------
231     void
232     DidExit () override;
233 
234     void
235     SetUserSpecifiedMaxMemoryTransferSize (uint64_t user_specified_max);
236 
237     bool
238     GetModuleSpec(const FileSpec& module_file_spec,
239                   const ArchSpec& arch,
240                   ModuleSpec &module_spec) override;
241 
242     bool
243     GetHostOSVersion(uint32_t &major,
244                      uint32_t &minor,
245                      uint32_t &update) override;
246 
247     size_t
248     LoadModules() override;
249 
250     Error
251     GetFileLoadAddress(const FileSpec& file, bool& is_loaded, lldb::addr_t& load_addr) override;
252 
253     void
254     ModulesDidLoad (ModuleList &module_list) override;
255 
256     StructuredData::ObjectSP
257     GetLoadedDynamicLibrariesInfos (lldb::addr_t image_list_address, lldb::addr_t image_count) override;
258 
259 protected:
260     friend class ThreadGDBRemote;
261     friend class GDBRemoteCommunicationClient;
262     friend class GDBRemoteRegisterContext;
263 
264     class GDBLoadedModuleInfoList;
265 
266     //------------------------------------------------------------------
267     /// Broadcaster event bits definitions.
268     //------------------------------------------------------------------
269     enum
270     {
271         eBroadcastBitAsyncContinue                  = (1 << 0),
272         eBroadcastBitAsyncThreadShouldExit          = (1 << 1),
273         eBroadcastBitAsyncThreadDidExit             = (1 << 2)
274     };
275 
276     Flags m_flags;            // Process specific flags (see eFlags enums)
277     GDBRemoteCommunicationClient m_gdb_comm;
278     std::atomic<lldb::pid_t> m_debugserver_pid;
279     std::vector<StringExtractorGDBRemote> m_stop_packet_stack;  // The stop packet stack replaces the last stop packet variable
280     Mutex m_last_stop_packet_mutex;
281     GDBRemoteDynamicRegisterInfo m_register_info;
282     Broadcaster m_async_broadcaster;
283     Listener m_async_listener;
284     HostThread m_async_thread;
285     Mutex m_async_thread_state_mutex;
286     typedef std::vector<lldb::tid_t> tid_collection;
287     typedef std::vector< std::pair<lldb::tid_t,int> > tid_sig_collection;
288     typedef std::map<lldb::addr_t, lldb::addr_t> MMapMap;
289     typedef std::map<uint32_t, std::string> ExpeditedRegisterMap;
290     tid_collection m_thread_ids; // Thread IDs for all threads. This list gets updated after stopping
291     StructuredData::ObjectSP m_jstopinfo_sp; // Stop info only for any threads that have valid stop infos
292     StructuredData::ObjectSP m_jthreadsinfo_sp; // Full stop info, expedited registers and memory for all threads if "jThreadsInfo" packet is supported
293     tid_collection m_continue_c_tids;                  // 'c' for continue
294     tid_sig_collection m_continue_C_tids; // 'C' for continue with signal
295     tid_collection m_continue_s_tids;                  // 's' for step
296     tid_sig_collection m_continue_S_tids; // 'S' for step with signal
297     uint64_t m_max_memory_size;       // The maximum number of bytes to read/write when reading and writing memory
298     uint64_t m_remote_stub_max_memory_size;    // The maximum memory size the remote gdb stub can handle
299     MMapMap m_addr_to_mmap_size;
300     lldb::BreakpointSP m_thread_create_bp_sp;
301     bool m_waiting_for_attach;
302     bool m_destroy_tried_resuming;
303     lldb::CommandObjectSP m_command_sp;
304     int64_t m_breakpoint_pc_offset;
305     lldb::tid_t m_initial_tid; // The initial thread ID, given by stub on attach
306 
307     //----------------------------------------------------------------------
308     // Accessors
309     //----------------------------------------------------------------------
310     bool
311     IsRunning ( lldb::StateType state )
312     {
313         return state == lldb::eStateRunning || IsStepping(state);
314     }
315 
316     bool
317     IsStepping ( lldb::StateType state)
318     {
319         return state == lldb::eStateStepping;
320     }
321 
322     bool
323     CanResume ( lldb::StateType state)
324     {
325         return state == lldb::eStateStopped;
326     }
327 
328     bool
329     HasExited (lldb::StateType state)
330     {
331         return state == lldb::eStateExited;
332     }
333 
334     bool
335     ProcessIDIsValid ( ) const;
336 
337     void
338     Clear ( );
339 
340     Flags &
341     GetFlags ()
342     {
343         return m_flags;
344     }
345 
346     const Flags &
347     GetFlags () const
348     {
349         return m_flags;
350     }
351 
352     bool
353     UpdateThreadList (ThreadList &old_thread_list,
354                       ThreadList &new_thread_list) override;
355 
356     Error
357     EstablishConnectionIfNeeded (const ProcessInfo &process_info);
358 
359     Error
360     LaunchAndConnectToDebugserver (const ProcessInfo &process_info);
361 
362     void
363     KillDebugserverProcess ();
364 
365     void
366     BuildDynamicRegisterInfo (bool force);
367 
368     void
369     SetLastStopPacket (const StringExtractorGDBRemote &response);
370 
371     bool
372     ParsePythonTargetDefinition(const FileSpec &target_definition_fspec);
373 
374     const lldb::DataBufferSP
375     GetAuxvData() override;
376 
377     StructuredData::ObjectSP
378     GetExtendedInfoForThread (lldb::tid_t tid);
379 
380     void
381     GetMaxMemorySize();
382 
383     bool
384     CalculateThreadStopInfo (ThreadGDBRemote *thread);
385 
386     size_t
387     UpdateThreadIDsFromStopReplyThreadsValue (std::string &value);
388 
389     bool
390     HandleNotifyPacket(StringExtractorGDBRemote &packet);
391 
392     bool
393     StartAsyncThread ();
394 
395     void
396     StopAsyncThread ();
397 
398     static lldb::thread_result_t
399     AsyncThread (void *arg);
400 
401     static bool
402     MonitorDebugserverProcess (void *callback_baton,
403                                lldb::pid_t pid,
404                                bool exited,
405                                int signo,
406                                int exit_status);
407 
408     lldb::StateType
409     SetThreadStopInfo (StringExtractor& stop_packet);
410 
411     bool
412     GetThreadStopInfoFromJSON (ThreadGDBRemote *thread, const StructuredData::ObjectSP &thread_infos_sp);
413 
414     lldb::ThreadSP
415     SetThreadStopInfo (StructuredData::Dictionary *thread_dict);
416 
417     lldb::ThreadSP
418     SetThreadStopInfo (lldb::tid_t tid,
419                        ExpeditedRegisterMap &expedited_register_map,
420                        uint8_t signo,
421                        const std::string &thread_name,
422                        const std::string &reason,
423                        const std::string &description,
424                        uint32_t exc_type,
425                        const std::vector<lldb::addr_t> &exc_data,
426                        lldb::addr_t thread_dispatch_qaddr,
427                        bool queue_vars_valid,
428                        std::string &queue_name,
429                        lldb::QueueKind queue_kind,
430                        uint64_t queue_serial);
431 
432     void
433     HandleStopReplySequence ();
434 
435     void
436     ClearThreadIDList ();
437 
438     bool
439     UpdateThreadIDList ();
440 
441     void
442     DidLaunchOrAttach (ArchSpec& process_arch);
443 
444     Error
445     ConnectToDebugserver (const char *host_port);
446 
447     const char *
448     GetDispatchQueueNameForThread (lldb::addr_t thread_dispatch_qaddr,
449                                    std::string &dispatch_queue_name);
450 
451     DynamicLoader *
452     GetDynamicLoader () override;
453 
454     // Query remote GDBServer for register information
455     bool
456     GetGDBServerRegisterInfo ();
457 
458     // Query remote GDBServer for a detailed loaded library list
459     Error
460     GetLoadedModuleList (GDBLoadedModuleInfoList &);
461 
462     lldb::ModuleSP
463     LoadModuleAtAddress (const FileSpec &file, lldb::addr_t base_addr, bool value_is_offset);
464 
465 private:
466     //------------------------------------------------------------------
467     // For ProcessGDBRemote only
468     //------------------------------------------------------------------
469     static bool
470     NewThreadNotifyBreakpointHit (void *baton,
471                          StoppointCallbackContext *context,
472                          lldb::user_id_t break_id,
473                          lldb::user_id_t break_loc_id);
474 
475     DISALLOW_COPY_AND_ASSIGN (ProcessGDBRemote);
476 };
477 
478 } // namespace process_gdb_remote
479 } // namespace lldb_private
480 
481 #endif // liblldb_ProcessGDBRemote_h_
482