1 //===-- ProcessGDBRemote.cpp ------------------------------------*- 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 // C Includes
11 #include <errno.h>
12 #include <spawn.h>
13 #include <stdlib.h>
14 #include <netinet/in.h>
15 #include <sys/mman.h>       // for mmap
16 #include <sys/stat.h>
17 #include <sys/types.h>
18 #include <time.h>
19 
20 // C++ Includes
21 #include <algorithm>
22 #include <map>
23 
24 // Other libraries and framework includes
25 
26 #include "lldb/Breakpoint/Watchpoint.h"
27 #include "lldb/Interpreter/Args.h"
28 #include "lldb/Core/ArchSpec.h"
29 #include "lldb/Core/Debugger.h"
30 #include "lldb/Core/ConnectionFileDescriptor.h"
31 #include "lldb/Host/FileSpec.h"
32 #include "lldb/Core/InputReader.h"
33 #include "lldb/Core/Module.h"
34 #include "lldb/Core/PluginManager.h"
35 #include "lldb/Core/State.h"
36 #include "lldb/Core/StreamFile.h"
37 #include "lldb/Core/StreamString.h"
38 #include "lldb/Core/Timer.h"
39 #include "lldb/Core/Value.h"
40 #include "lldb/Host/TimeValue.h"
41 #include "lldb/Symbol/ObjectFile.h"
42 #include "lldb/Target/DynamicLoader.h"
43 #include "lldb/Target/Target.h"
44 #include "lldb/Target/TargetList.h"
45 #include "lldb/Target/ThreadPlanCallFunction.h"
46 #include "lldb/Utility/PseudoTerminal.h"
47 
48 // Project includes
49 #include "lldb/Host/Host.h"
50 #include "Plugins/Process/Utility/InferiorCallPOSIX.h"
51 #include "Plugins/Process/Utility/StopInfoMachException.h"
52 #include "Plugins/Platform/MacOSX/PlatformRemoteiOS.h"
53 #include "Utility/StringExtractorGDBRemote.h"
54 #include "GDBRemoteRegisterContext.h"
55 #include "ProcessGDBRemote.h"
56 #include "ProcessGDBRemoteLog.h"
57 #include "ThreadGDBRemote.h"
58 
59 namespace lldb
60 {
61     // Provide a function that can easily dump the packet history if we know a
62     // ProcessGDBRemote * value (which we can get from logs or from debugging).
63     // We need the function in the lldb namespace so it makes it into the final
64     // executable since the LLDB shared library only exports stuff in the lldb
65     // namespace. This allows you to attach with a debugger and call this
66     // function and get the packet history dumped to a file.
67     void
68     DumpProcessGDBRemotePacketHistory (void *p, const char *path)
69     {
70         lldb_private::StreamFile strm;
71         lldb_private::Error error (strm.GetFile().Open(path, lldb_private::File::eOpenOptionWrite | lldb_private::File::eOpenOptionCanCreate));
72         if (error.Success())
73             ((ProcessGDBRemote *)p)->GetGDBRemote().DumpHistory (strm);
74     }
75 }
76 
77 
78 #define DEBUGSERVER_BASENAME    "debugserver"
79 using namespace lldb;
80 using namespace lldb_private;
81 
82 static bool rand_initialized = false;
83 
84 // TODO Randomly assigning a port is unsafe.  We should get an unused
85 // ephemeral port from the kernel and make sure we reserve it before passing
86 // it to debugserver.
87 
88 #if defined (__APPLE__)
89 #define LOW_PORT    (IPPORT_RESERVED)
90 #define HIGH_PORT   (IPPORT_HIFIRSTAUTO)
91 #else
92 #define LOW_PORT    (1024u)
93 #define HIGH_PORT   (49151u)
94 #endif
95 
96 static inline uint16_t
97 get_random_port ()
98 {
99     if (!rand_initialized)
100     {
101         time_t seed = time(NULL);
102 
103         rand_initialized = true;
104         srand(seed);
105     }
106     return (rand() % (HIGH_PORT - LOW_PORT)) + LOW_PORT;
107 }
108 
109 
110 const char *
111 ProcessGDBRemote::GetPluginNameStatic()
112 {
113     return "gdb-remote";
114 }
115 
116 const char *
117 ProcessGDBRemote::GetPluginDescriptionStatic()
118 {
119     return "GDB Remote protocol based debugging plug-in.";
120 }
121 
122 void
123 ProcessGDBRemote::Terminate()
124 {
125     PluginManager::UnregisterPlugin (ProcessGDBRemote::CreateInstance);
126 }
127 
128 
129 lldb::ProcessSP
130 ProcessGDBRemote::CreateInstance (Target &target, Listener &listener, const FileSpec *crash_file_path)
131 {
132     lldb::ProcessSP process_sp;
133     if (crash_file_path == NULL)
134         process_sp.reset (new ProcessGDBRemote (target, listener));
135     return process_sp;
136 }
137 
138 bool
139 ProcessGDBRemote::CanDebug (Target &target, bool plugin_specified_by_name)
140 {
141     if (plugin_specified_by_name)
142         return true;
143 
144     // For now we are just making sure the file exists for a given module
145     Module *exe_module = target.GetExecutableModulePointer();
146     if (exe_module)
147     {
148         ObjectFile *exe_objfile = exe_module->GetObjectFile();
149         // We can't debug core files...
150         switch (exe_objfile->GetType())
151         {
152             case ObjectFile::eTypeInvalid:
153             case ObjectFile::eTypeCoreFile:
154             case ObjectFile::eTypeDebugInfo:
155             case ObjectFile::eTypeObjectFile:
156             case ObjectFile::eTypeSharedLibrary:
157             case ObjectFile::eTypeStubLibrary:
158                 return false;
159             case ObjectFile::eTypeExecutable:
160             case ObjectFile::eTypeDynamicLinker:
161             case ObjectFile::eTypeUnknown:
162                 break;
163         }
164         return exe_module->GetFileSpec().Exists();
165     }
166     // However, if there is no executable module, we return true since we might be preparing to attach.
167     return true;
168 }
169 
170 //----------------------------------------------------------------------
171 // ProcessGDBRemote constructor
172 //----------------------------------------------------------------------
173 ProcessGDBRemote::ProcessGDBRemote(Target& target, Listener &listener) :
174     Process (target, listener),
175     m_flags (0),
176     m_gdb_comm(false),
177     m_debugserver_pid (LLDB_INVALID_PROCESS_ID),
178     m_last_stop_packet (),
179     m_last_stop_packet_mutex (Mutex::eMutexTypeNormal),
180     m_register_info (),
181     m_async_broadcaster (NULL, "lldb.process.gdb-remote.async-broadcaster"),
182     m_async_thread (LLDB_INVALID_HOST_THREAD),
183     m_thread_ids (),
184     m_continue_c_tids (),
185     m_continue_C_tids (),
186     m_continue_s_tids (),
187     m_continue_S_tids (),
188     m_dispatch_queue_offsets_addr (LLDB_INVALID_ADDRESS),
189     m_max_memory_size (512),
190     m_addr_to_mmap_size (),
191     m_thread_create_bp_sp (),
192     m_waiting_for_attach (false),
193     m_destroy_tried_resuming (false)
194 {
195     m_async_broadcaster.SetEventName (eBroadcastBitAsyncThreadShouldExit,   "async thread should exit");
196     m_async_broadcaster.SetEventName (eBroadcastBitAsyncContinue,           "async thread continue");
197     m_async_broadcaster.SetEventName (eBroadcastBitAsyncThreadDidExit,      "async thread did exit");
198 }
199 
200 //----------------------------------------------------------------------
201 // Destructor
202 //----------------------------------------------------------------------
203 ProcessGDBRemote::~ProcessGDBRemote()
204 {
205     //  m_mach_process.UnregisterNotificationCallbacks (this);
206     Clear();
207     // We need to call finalize on the process before destroying ourselves
208     // to make sure all of the broadcaster cleanup goes as planned. If we
209     // destruct this class, then Process::~Process() might have problems
210     // trying to fully destroy the broadcaster.
211     Finalize();
212 }
213 
214 //----------------------------------------------------------------------
215 // PluginInterface
216 //----------------------------------------------------------------------
217 const char *
218 ProcessGDBRemote::GetPluginName()
219 {
220     return "Process debugging plug-in that uses the GDB remote protocol";
221 }
222 
223 const char *
224 ProcessGDBRemote::GetShortPluginName()
225 {
226     return GetPluginNameStatic();
227 }
228 
229 uint32_t
230 ProcessGDBRemote::GetPluginVersion()
231 {
232     return 1;
233 }
234 
235 void
236 ProcessGDBRemote::BuildDynamicRegisterInfo (bool force)
237 {
238     if (!force && m_register_info.GetNumRegisters() > 0)
239         return;
240 
241     char packet[128];
242     m_register_info.Clear();
243     uint32_t reg_offset = 0;
244     uint32_t reg_num = 0;
245     for (StringExtractorGDBRemote::ResponseType response_type = StringExtractorGDBRemote::eResponse;
246          response_type == StringExtractorGDBRemote::eResponse;
247          ++reg_num)
248     {
249         const int packet_len = ::snprintf (packet, sizeof(packet), "qRegisterInfo%x", reg_num);
250         assert (packet_len < sizeof(packet));
251         StringExtractorGDBRemote response;
252         if (m_gdb_comm.SendPacketAndWaitForResponse(packet, packet_len, response, false))
253         {
254             response_type = response.GetResponseType();
255             if (response_type == StringExtractorGDBRemote::eResponse)
256             {
257                 std::string name;
258                 std::string value;
259                 ConstString reg_name;
260                 ConstString alt_name;
261                 ConstString set_name;
262                 RegisterInfo reg_info = { NULL,                 // Name
263                     NULL,                 // Alt name
264                     0,                    // byte size
265                     reg_offset,           // offset
266                     eEncodingUint,        // encoding
267                     eFormatHex,           // formate
268                     {
269                         LLDB_INVALID_REGNUM, // GCC reg num
270                         LLDB_INVALID_REGNUM, // DWARF reg num
271                         LLDB_INVALID_REGNUM, // generic reg num
272                         reg_num,             // GDB reg num
273                         reg_num           // native register number
274                     },
275                     NULL,
276                     NULL
277                 };
278 
279                 while (response.GetNameColonValue(name, value))
280                 {
281                     if (name.compare("name") == 0)
282                     {
283                         reg_name.SetCString(value.c_str());
284                     }
285                     else if (name.compare("alt-name") == 0)
286                     {
287                         alt_name.SetCString(value.c_str());
288                     }
289                     else if (name.compare("bitsize") == 0)
290                     {
291                         reg_info.byte_size = Args::StringToUInt32(value.c_str(), 0, 0) / CHAR_BIT;
292                     }
293                     else if (name.compare("offset") == 0)
294                     {
295                         uint32_t offset = Args::StringToUInt32(value.c_str(), UINT32_MAX, 0);
296                         if (reg_offset != offset)
297                         {
298                             reg_offset = offset;
299                         }
300                     }
301                     else if (name.compare("encoding") == 0)
302                     {
303                         if (value.compare("uint") == 0)
304                             reg_info.encoding = eEncodingUint;
305                         else if (value.compare("sint") == 0)
306                             reg_info.encoding = eEncodingSint;
307                         else if (value.compare("ieee754") == 0)
308                             reg_info.encoding = eEncodingIEEE754;
309                         else if (value.compare("vector") == 0)
310                             reg_info.encoding = eEncodingVector;
311                     }
312                     else if (name.compare("format") == 0)
313                     {
314                         if (value.compare("binary") == 0)
315                             reg_info.format = eFormatBinary;
316                         else if (value.compare("decimal") == 0)
317                             reg_info.format = eFormatDecimal;
318                         else if (value.compare("hex") == 0)
319                             reg_info.format = eFormatHex;
320                         else if (value.compare("float") == 0)
321                             reg_info.format = eFormatFloat;
322                         else if (value.compare("vector-sint8") == 0)
323                             reg_info.format = eFormatVectorOfSInt8;
324                         else if (value.compare("vector-uint8") == 0)
325                             reg_info.format = eFormatVectorOfUInt8;
326                         else if (value.compare("vector-sint16") == 0)
327                             reg_info.format = eFormatVectorOfSInt16;
328                         else if (value.compare("vector-uint16") == 0)
329                             reg_info.format = eFormatVectorOfUInt16;
330                         else if (value.compare("vector-sint32") == 0)
331                             reg_info.format = eFormatVectorOfSInt32;
332                         else if (value.compare("vector-uint32") == 0)
333                             reg_info.format = eFormatVectorOfUInt32;
334                         else if (value.compare("vector-float32") == 0)
335                             reg_info.format = eFormatVectorOfFloat32;
336                         else if (value.compare("vector-uint128") == 0)
337                             reg_info.format = eFormatVectorOfUInt128;
338                     }
339                     else if (name.compare("set") == 0)
340                     {
341                         set_name.SetCString(value.c_str());
342                     }
343                     else if (name.compare("gcc") == 0)
344                     {
345                         reg_info.kinds[eRegisterKindGCC] = Args::StringToUInt32(value.c_str(), LLDB_INVALID_REGNUM, 0);
346                     }
347                     else if (name.compare("dwarf") == 0)
348                     {
349                         reg_info.kinds[eRegisterKindDWARF] = Args::StringToUInt32(value.c_str(), LLDB_INVALID_REGNUM, 0);
350                     }
351                     else if (name.compare("generic") == 0)
352                     {
353                         if (value.compare("pc") == 0)
354                             reg_info.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_PC;
355                         else if (value.compare("sp") == 0)
356                             reg_info.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_SP;
357                         else if (value.compare("fp") == 0)
358                             reg_info.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_FP;
359                         else if (value.compare("ra") == 0)
360                             reg_info.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_RA;
361                         else if (value.compare("flags") == 0)
362                             reg_info.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_FLAGS;
363                         else if (value.find("arg") == 0)
364                         {
365                             if (value.size() == 4)
366                             {
367                                 switch (value[3])
368                                 {
369                                     case '1': reg_info.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_ARG1; break;
370                                     case '2': reg_info.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_ARG2; break;
371                                     case '3': reg_info.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_ARG3; break;
372                                     case '4': reg_info.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_ARG4; break;
373                                     case '5': reg_info.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_ARG5; break;
374                                     case '6': reg_info.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_ARG6; break;
375                                     case '7': reg_info.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_ARG7; break;
376                                     case '8': reg_info.kinds[eRegisterKindGeneric] = LLDB_REGNUM_GENERIC_ARG8; break;
377                                 }
378                             }
379                         }
380                     }
381                 }
382 
383                 reg_info.byte_offset = reg_offset;
384                 assert (reg_info.byte_size != 0);
385                 reg_offset += reg_info.byte_size;
386                 m_register_info.AddRegister(reg_info, reg_name, alt_name, set_name);
387             }
388         }
389         else
390         {
391             break;
392         }
393     }
394 
395     // We didn't get anything if the accumulated reg_num is zero.  See if we are
396     // debugging ARM and fill with a hard coded register set until we can get an
397     // updated debugserver down on the devices.
398     // On the other hand, if the accumulated reg_num is positive, see if we can
399     // add composite registers to the existing primordial ones.
400     bool from_scratch = (reg_num == 0);
401 
402     const ArchSpec &target_arch = GetTarget().GetArchitecture();
403     const ArchSpec &remote_arch = m_gdb_comm.GetHostArchitecture();
404     if (!target_arch.IsValid())
405     {
406         if (remote_arch.IsValid()
407               && remote_arch.GetMachine() == llvm::Triple::arm
408               && remote_arch.GetTriple().getVendor() == llvm::Triple::Apple)
409             m_register_info.HardcodeARMRegisters(from_scratch);
410     }
411     else if (target_arch.GetMachine() == llvm::Triple::arm)
412     {
413         m_register_info.HardcodeARMRegisters(from_scratch);
414     }
415 
416     // Add some convenience registers (eax, ebx, ecx, edx, esi, edi, ebp, esp) to x86_64.
417     if ((target_arch.IsValid() && target_arch.GetMachine() == llvm::Triple::x86_64)
418         || (remote_arch.IsValid() && remote_arch.GetMachine() == llvm::Triple::x86_64))
419         m_register_info.Addx86_64ConvenienceRegisters();
420 
421     // At this point, we can finalize our register info.
422     m_register_info.Finalize ();
423 }
424 
425 Error
426 ProcessGDBRemote::WillLaunch (Module* module)
427 {
428     return WillLaunchOrAttach ();
429 }
430 
431 Error
432 ProcessGDBRemote::WillAttachToProcessWithID (lldb::pid_t pid)
433 {
434     return WillLaunchOrAttach ();
435 }
436 
437 Error
438 ProcessGDBRemote::WillAttachToProcessWithName (const char *process_name, bool wait_for_launch)
439 {
440     return WillLaunchOrAttach ();
441 }
442 
443 Error
444 ProcessGDBRemote::DoConnectRemote (const char *remote_url)
445 {
446     Error error (WillLaunchOrAttach ());
447 
448     if (error.Fail())
449         return error;
450 
451     error = ConnectToDebugserver (remote_url);
452 
453     if (error.Fail())
454         return error;
455     StartAsyncThread ();
456 
457     lldb::pid_t pid = m_gdb_comm.GetCurrentProcessID ();
458     if (pid == LLDB_INVALID_PROCESS_ID)
459     {
460         // We don't have a valid process ID, so note that we are connected
461         // and could now request to launch or attach, or get remote process
462         // listings...
463         SetPrivateState (eStateConnected);
464     }
465     else
466     {
467         // We have a valid process
468         SetID (pid);
469         GetThreadList();
470         if (m_gdb_comm.SendPacketAndWaitForResponse("?", 1, m_last_stop_packet, false))
471         {
472             const StateType state = SetThreadStopInfo (m_last_stop_packet);
473             if (state == eStateStopped)
474             {
475                 SetPrivateState (state);
476             }
477             else
478                 error.SetErrorStringWithFormat ("Process %llu was reported after connecting to '%s', but state was not stopped: %s", pid, remote_url, StateAsCString (state));
479         }
480         else
481             error.SetErrorStringWithFormat ("Process %llu was reported after connecting to '%s', but no stop reply packet was received", pid, remote_url);
482     }
483 
484     if (error.Success()
485         && !GetTarget().GetArchitecture().IsValid()
486         && m_gdb_comm.GetHostArchitecture().IsValid())
487     {
488         GetTarget().SetArchitecture(m_gdb_comm.GetHostArchitecture());
489     }
490 
491     return error;
492 }
493 
494 Error
495 ProcessGDBRemote::WillLaunchOrAttach ()
496 {
497     Error error;
498     m_stdio_communication.Clear ();
499     return error;
500 }
501 
502 //----------------------------------------------------------------------
503 // Process Control
504 //----------------------------------------------------------------------
505 Error
506 ProcessGDBRemote::DoLaunch (Module *exe_module, const ProcessLaunchInfo &launch_info)
507 {
508     Error error;
509 
510     uint32_t launch_flags = launch_info.GetFlags().Get();
511     const char *stdin_path = NULL;
512     const char *stdout_path = NULL;
513     const char *stderr_path = NULL;
514     const char *working_dir = launch_info.GetWorkingDirectory();
515 
516     const ProcessLaunchInfo::FileAction *file_action;
517     file_action = launch_info.GetFileActionForFD (STDIN_FILENO);
518     if (file_action)
519     {
520         if (file_action->GetAction () == ProcessLaunchInfo::FileAction::eFileActionOpen)
521             stdin_path = file_action->GetPath();
522     }
523     file_action = launch_info.GetFileActionForFD (STDOUT_FILENO);
524     if (file_action)
525     {
526         if (file_action->GetAction () == ProcessLaunchInfo::FileAction::eFileActionOpen)
527             stdout_path = file_action->GetPath();
528     }
529     file_action = launch_info.GetFileActionForFD (STDERR_FILENO);
530     if (file_action)
531     {
532         if (file_action->GetAction () == ProcessLaunchInfo::FileAction::eFileActionOpen)
533             stderr_path = file_action->GetPath();
534     }
535 
536     //  ::LogSetBitMask (GDBR_LOG_DEFAULT);
537     //  ::LogSetOptions (LLDB_LOG_OPTION_THREADSAFE | LLDB_LOG_OPTION_PREPEND_TIMESTAMP | LLDB_LOG_OPTION_PREPEND_PROC_AND_THREAD);
538     //  ::LogSetLogFile ("/dev/stdout");
539     LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PROCESS));
540 
541     ObjectFile * object_file = exe_module->GetObjectFile();
542     if (object_file)
543     {
544         char host_port[128];
545         snprintf (host_port, sizeof(host_port), "localhost:%u", get_random_port ());
546         char connect_url[128];
547         snprintf (connect_url, sizeof(connect_url), "connect://%s", host_port);
548 
549         // Make sure we aren't already connected?
550         if (!m_gdb_comm.IsConnected())
551         {
552             error = StartDebugserverProcess (host_port, launch_info);
553             if (error.Fail())
554             {
555                 if (log)
556                     log->Printf("failed to start debugserver process: %s", error.AsCString());
557                 return error;
558             }
559 
560             error = ConnectToDebugserver (connect_url);
561         }
562 
563         if (error.Success())
564         {
565             lldb_utility::PseudoTerminal pty;
566             const bool disable_stdio = (launch_flags & eLaunchFlagDisableSTDIO) != 0;
567 
568             // If the debugserver is local and we aren't disabling STDIO, lets use
569             // a pseudo terminal to instead of relying on the 'O' packets for stdio
570             // since 'O' packets can really slow down debugging if the inferior
571             // does a lot of output.
572             PlatformSP platform_sp (m_target.GetPlatform());
573             if (platform_sp && platform_sp->IsHost() && !disable_stdio)
574             {
575                 const char *slave_name = NULL;
576                 if (stdin_path == NULL || stdout_path == NULL || stderr_path == NULL)
577                 {
578                     if (pty.OpenFirstAvailableMaster(O_RDWR|O_NOCTTY, NULL, 0))
579                         slave_name = pty.GetSlaveName (NULL, 0);
580                 }
581                 if (stdin_path == NULL)
582                     stdin_path = slave_name;
583 
584                 if (stdout_path == NULL)
585                     stdout_path = slave_name;
586 
587                 if (stderr_path == NULL)
588                     stderr_path = slave_name;
589             }
590 
591             // Set STDIN to /dev/null if we want STDIO disabled or if either
592             // STDOUT or STDERR have been set to something and STDIN hasn't
593             if (disable_stdio || (stdin_path == NULL && (stdout_path || stderr_path)))
594                 stdin_path = "/dev/null";
595 
596             // Set STDOUT to /dev/null if we want STDIO disabled or if either
597             // STDIN or STDERR have been set to something and STDOUT hasn't
598             if (disable_stdio || (stdout_path == NULL && (stdin_path || stderr_path)))
599                 stdout_path = "/dev/null";
600 
601             // Set STDERR to /dev/null if we want STDIO disabled or if either
602             // STDIN or STDOUT have been set to something and STDERR hasn't
603             if (disable_stdio || (stderr_path == NULL && (stdin_path || stdout_path)))
604                 stderr_path = "/dev/null";
605 
606             if (stdin_path)
607                 m_gdb_comm.SetSTDIN (stdin_path);
608             if (stdout_path)
609                 m_gdb_comm.SetSTDOUT (stdout_path);
610             if (stderr_path)
611                 m_gdb_comm.SetSTDERR (stderr_path);
612 
613             m_gdb_comm.SetDisableASLR (launch_flags & eLaunchFlagDisableASLR);
614 
615             m_gdb_comm.SendLaunchArchPacket (m_target.GetArchitecture().GetArchitectureName());
616 
617             if (working_dir && working_dir[0])
618             {
619                 m_gdb_comm.SetWorkingDir (working_dir);
620             }
621 
622             // Send the environment and the program + arguments after we connect
623             const Args &environment = launch_info.GetEnvironmentEntries();
624             if (environment.GetArgumentCount())
625             {
626                 size_t num_environment_entries = environment.GetArgumentCount();
627                 for (size_t i=0; i<num_environment_entries; ++i)
628                 {
629                     const char *env_entry = environment.GetArgumentAtIndex(i);
630                     if (env_entry == NULL || m_gdb_comm.SendEnvironmentPacket(env_entry) != 0)
631                         break;
632                 }
633             }
634 
635             const uint32_t old_packet_timeout = m_gdb_comm.SetPacketTimeout (10);
636             int arg_packet_err = m_gdb_comm.SendArgumentsPacket (launch_info.GetArguments().GetConstArgumentVector());
637             if (arg_packet_err == 0)
638             {
639                 std::string error_str;
640                 if (m_gdb_comm.GetLaunchSuccess (error_str))
641                 {
642                     SetID (m_gdb_comm.GetCurrentProcessID ());
643                 }
644                 else
645                 {
646                     error.SetErrorString (error_str.c_str());
647                 }
648             }
649             else
650             {
651                 error.SetErrorStringWithFormat("'A' packet returned an error: %i", arg_packet_err);
652             }
653 
654             m_gdb_comm.SetPacketTimeout (old_packet_timeout);
655 
656             if (GetID() == LLDB_INVALID_PROCESS_ID)
657             {
658                 if (log)
659                     log->Printf("failed to connect to debugserver: %s", error.AsCString());
660                 KillDebugserverProcess ();
661                 return error;
662             }
663 
664             if (m_gdb_comm.SendPacketAndWaitForResponse("?", 1, m_last_stop_packet, false))
665             {
666                 SetPrivateState (SetThreadStopInfo (m_last_stop_packet));
667 
668                 if (!disable_stdio)
669                 {
670                     if (pty.GetMasterFileDescriptor() != lldb_utility::PseudoTerminal::invalid_fd)
671                         SetSTDIOFileDescriptor (pty.ReleaseMasterFileDescriptor());
672                 }
673             }
674         }
675         else
676         {
677             if (log)
678                 log->Printf("failed to connect to debugserver: %s", error.AsCString());
679         }
680     }
681     else
682     {
683         // Set our user ID to an invalid process ID.
684         SetID(LLDB_INVALID_PROCESS_ID);
685         error.SetErrorStringWithFormat ("failed to get object file from '%s' for arch %s",
686                                         exe_module->GetFileSpec().GetFilename().AsCString(),
687                                         exe_module->GetArchitecture().GetArchitectureName());
688     }
689     return error;
690 
691 }
692 
693 
694 Error
695 ProcessGDBRemote::ConnectToDebugserver (const char *connect_url)
696 {
697     Error error;
698     // Sleep and wait a bit for debugserver to start to listen...
699     std::auto_ptr<ConnectionFileDescriptor> conn_ap(new ConnectionFileDescriptor());
700     if (conn_ap.get())
701     {
702         const uint32_t max_retry_count = 50;
703         uint32_t retry_count = 0;
704         while (!m_gdb_comm.IsConnected())
705         {
706             if (conn_ap->Connect(connect_url, &error) == eConnectionStatusSuccess)
707             {
708                 m_gdb_comm.SetConnection (conn_ap.release());
709                 break;
710             }
711             retry_count++;
712 
713             if (retry_count >= max_retry_count)
714                 break;
715 
716             usleep (100000);
717         }
718     }
719 
720     if (!m_gdb_comm.IsConnected())
721     {
722         if (error.Success())
723             error.SetErrorString("not connected to remote gdb server");
724         return error;
725     }
726 
727     // We always seem to be able to open a connection to a local port
728     // so we need to make sure we can then send data to it. If we can't
729     // then we aren't actually connected to anything, so try and do the
730     // handshake with the remote GDB server and make sure that goes
731     // alright.
732     if (!m_gdb_comm.HandshakeWithServer (NULL))
733     {
734         m_gdb_comm.Disconnect();
735         if (error.Success())
736             error.SetErrorString("not connected to remote gdb server");
737         return error;
738     }
739     m_gdb_comm.ResetDiscoverableSettings();
740     m_gdb_comm.QueryNoAckModeSupported ();
741     m_gdb_comm.GetThreadSuffixSupported ();
742     m_gdb_comm.GetListThreadsInStopReplySupported ();
743     m_gdb_comm.GetHostInfo ();
744     m_gdb_comm.GetVContSupported ('c');
745     m_gdb_comm.GetVAttachOrWaitSupported();
746 
747     size_t num_cmds = GetExtraStartupCommands().GetArgumentCount();
748     for (size_t idx = 0; idx < num_cmds; idx++)
749     {
750         StringExtractorGDBRemote response;
751         printf ("Sending command: \%s.\n", GetExtraStartupCommands().GetArgumentAtIndex(idx));
752         m_gdb_comm.SendPacketAndWaitForResponse (GetExtraStartupCommands().GetArgumentAtIndex(idx), response, false);
753     }
754     return error;
755 }
756 
757 void
758 ProcessGDBRemote::DidLaunchOrAttach ()
759 {
760     LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PROCESS));
761     if (log)
762         log->Printf ("ProcessGDBRemote::DidLaunch()");
763     if (GetID() != LLDB_INVALID_PROCESS_ID)
764     {
765         m_dispatch_queue_offsets_addr = LLDB_INVALID_ADDRESS;
766 
767         BuildDynamicRegisterInfo (false);
768 
769         // See if the GDB server supports the qHostInfo information
770 
771         const ArchSpec &gdb_remote_arch = m_gdb_comm.GetHostArchitecture();
772         if (gdb_remote_arch.IsValid())
773         {
774             ArchSpec &target_arch = GetTarget().GetArchitecture();
775 
776             if (target_arch.IsValid())
777             {
778                 // If the remote host is ARM and we have apple as the vendor, then
779                 // ARM executables and shared libraries can have mixed ARM architectures.
780                 // You can have an armv6 executable, and if the host is armv7, then the
781                 // system will load the best possible architecture for all shared libraries
782                 // it has, so we really need to take the remote host architecture as our
783                 // defacto architecture in this case.
784 
785                 if (gdb_remote_arch.GetMachine() == llvm::Triple::arm &&
786                     gdb_remote_arch.GetTriple().getVendor() == llvm::Triple::Apple)
787                 {
788                     target_arch = gdb_remote_arch;
789                 }
790                 else
791                 {
792                     // Fill in what is missing in the triple
793                     const llvm::Triple &remote_triple = gdb_remote_arch.GetTriple();
794                     llvm::Triple &target_triple = target_arch.GetTriple();
795                     if (target_triple.getVendorName().size() == 0)
796                     {
797                         target_triple.setVendor (remote_triple.getVendor());
798 
799                         if (target_triple.getOSName().size() == 0)
800                         {
801                             target_triple.setOS (remote_triple.getOS());
802 
803                             if (target_triple.getEnvironmentName().size() == 0)
804                                 target_triple.setEnvironment (remote_triple.getEnvironment());
805                         }
806                     }
807                 }
808             }
809             else
810             {
811                 // The target doesn't have a valid architecture yet, set it from
812                 // the architecture we got from the remote GDB server
813                 target_arch = gdb_remote_arch;
814             }
815         }
816     }
817 }
818 
819 void
820 ProcessGDBRemote::DidLaunch ()
821 {
822     DidLaunchOrAttach ();
823 }
824 
825 Error
826 ProcessGDBRemote::DoAttachToProcessWithID (lldb::pid_t attach_pid)
827 {
828     ProcessAttachInfo attach_info;
829     return DoAttachToProcessWithID(attach_pid, attach_info);
830 }
831 
832 Error
833 ProcessGDBRemote::DoAttachToProcessWithID (lldb::pid_t attach_pid, const ProcessAttachInfo &attach_info)
834 {
835     Error error;
836     // Clear out and clean up from any current state
837     Clear();
838     if (attach_pid != LLDB_INVALID_PROCESS_ID)
839     {
840         // Make sure we aren't already connected?
841         if (!m_gdb_comm.IsConnected())
842         {
843             char host_port[128];
844             snprintf (host_port, sizeof(host_port), "localhost:%u", get_random_port ());
845             char connect_url[128];
846             snprintf (connect_url, sizeof(connect_url), "connect://%s", host_port);
847 
848             error = StartDebugserverProcess (host_port, attach_info);
849 
850             if (error.Fail())
851             {
852                 const char *error_string = error.AsCString();
853                 if (error_string == NULL)
854                     error_string = "unable to launch " DEBUGSERVER_BASENAME;
855 
856                 SetExitStatus (-1, error_string);
857             }
858             else
859             {
860                 error = ConnectToDebugserver (connect_url);
861             }
862         }
863 
864         if (error.Success())
865         {
866             char packet[64];
867             const int packet_len = ::snprintf (packet, sizeof(packet), "vAttach;%llx", attach_pid);
868             SetID (attach_pid);
869             m_async_broadcaster.BroadcastEvent (eBroadcastBitAsyncContinue, new EventDataBytes (packet, packet_len));
870         }
871     }
872     return error;
873 }
874 
875 size_t
876 ProcessGDBRemote::AttachInputReaderCallback
877 (
878     void *baton,
879     InputReader *reader,
880     lldb::InputReaderAction notification,
881     const char *bytes,
882     size_t bytes_len
883 )
884 {
885     if (notification == eInputReaderGotToken)
886     {
887         ProcessGDBRemote *gdb_process = (ProcessGDBRemote *)baton;
888         if (gdb_process->m_waiting_for_attach)
889             gdb_process->m_waiting_for_attach = false;
890         reader->SetIsDone(true);
891         return 1;
892     }
893     return 0;
894 }
895 
896 Error
897 ProcessGDBRemote::DoAttachToProcessWithName (const char *process_name, bool wait_for_launch, const ProcessAttachInfo &attach_info)
898 {
899     Error error;
900     // Clear out and clean up from any current state
901     Clear();
902 
903     if (process_name && process_name[0])
904     {
905         // Make sure we aren't already connected?
906         if (!m_gdb_comm.IsConnected())
907         {
908             char host_port[128];
909             snprintf (host_port, sizeof(host_port), "localhost:%u", get_random_port ());
910             char connect_url[128];
911             snprintf (connect_url, sizeof(connect_url), "connect://%s", host_port);
912 
913             error = StartDebugserverProcess (host_port, attach_info);
914             if (error.Fail())
915             {
916                 const char *error_string = error.AsCString();
917                 if (error_string == NULL)
918                     error_string = "unable to launch " DEBUGSERVER_BASENAME;
919 
920                 SetExitStatus (-1, error_string);
921             }
922             else
923             {
924                 error = ConnectToDebugserver (connect_url);
925             }
926         }
927 
928         if (error.Success())
929         {
930             StreamString packet;
931 
932             if (wait_for_launch)
933             {
934                 if (!m_gdb_comm.GetVAttachOrWaitSupported())
935                 {
936                     packet.PutCString ("vAttachWait");
937                 }
938                 else
939                 {
940                     if (attach_info.GetIgnoreExisting())
941                         packet.PutCString("vAttachWait");
942                     else
943                         packet.PutCString ("vAttachOrWait");
944                 }
945             }
946             else
947                 packet.PutCString("vAttachName");
948             packet.PutChar(';');
949             packet.PutBytesAsRawHex8(process_name, strlen(process_name), lldb::endian::InlHostByteOrder(), lldb::endian::InlHostByteOrder());
950 
951             m_async_broadcaster.BroadcastEvent (eBroadcastBitAsyncContinue, new EventDataBytes (packet.GetData(), packet.GetSize()));
952 
953         }
954     }
955     return error;
956 }
957 
958 
959 void
960 ProcessGDBRemote::DidAttach ()
961 {
962     DidLaunchOrAttach ();
963 }
964 
965 Error
966 ProcessGDBRemote::WillResume ()
967 {
968     m_continue_c_tids.clear();
969     m_continue_C_tids.clear();
970     m_continue_s_tids.clear();
971     m_continue_S_tids.clear();
972     return Error();
973 }
974 
975 Error
976 ProcessGDBRemote::DoResume ()
977 {
978     Error error;
979     LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PROCESS));
980     if (log)
981         log->Printf ("ProcessGDBRemote::Resume()");
982 
983     Listener listener ("gdb-remote.resume-packet-sent");
984     if (listener.StartListeningForEvents (&m_gdb_comm, GDBRemoteCommunication::eBroadcastBitRunPacketSent))
985     {
986         listener.StartListeningForEvents (&m_async_broadcaster, ProcessGDBRemote::eBroadcastBitAsyncThreadDidExit);
987 
988         StreamString continue_packet;
989         bool continue_packet_error = false;
990         if (m_gdb_comm.HasAnyVContSupport ())
991         {
992             continue_packet.PutCString ("vCont");
993 
994             if (!m_continue_c_tids.empty())
995             {
996                 if (m_gdb_comm.GetVContSupported ('c'))
997                 {
998                     for (tid_collection::const_iterator t_pos = m_continue_c_tids.begin(), t_end = m_continue_c_tids.end(); t_pos != t_end; ++t_pos)
999                         continue_packet.Printf(";c:%4.4llx", *t_pos);
1000                 }
1001                 else
1002                     continue_packet_error = true;
1003             }
1004 
1005             if (!continue_packet_error && !m_continue_C_tids.empty())
1006             {
1007                 if (m_gdb_comm.GetVContSupported ('C'))
1008                 {
1009                     for (tid_sig_collection::const_iterator s_pos = m_continue_C_tids.begin(), s_end = m_continue_C_tids.end(); s_pos != s_end; ++s_pos)
1010                         continue_packet.Printf(";C%2.2x:%4.4llx", s_pos->second, s_pos->first);
1011                 }
1012                 else
1013                     continue_packet_error = true;
1014             }
1015 
1016             if (!continue_packet_error && !m_continue_s_tids.empty())
1017             {
1018                 if (m_gdb_comm.GetVContSupported ('s'))
1019                 {
1020                     for (tid_collection::const_iterator t_pos = m_continue_s_tids.begin(), t_end = m_continue_s_tids.end(); t_pos != t_end; ++t_pos)
1021                         continue_packet.Printf(";s:%4.4llx", *t_pos);
1022                 }
1023                 else
1024                     continue_packet_error = true;
1025             }
1026 
1027             if (!continue_packet_error && !m_continue_S_tids.empty())
1028             {
1029                 if (m_gdb_comm.GetVContSupported ('S'))
1030                 {
1031                     for (tid_sig_collection::const_iterator s_pos = m_continue_S_tids.begin(), s_end = m_continue_S_tids.end(); s_pos != s_end; ++s_pos)
1032                         continue_packet.Printf(";S%2.2x:%4.4llx", s_pos->second, s_pos->first);
1033                 }
1034                 else
1035                     continue_packet_error = true;
1036             }
1037 
1038             if (continue_packet_error)
1039                 continue_packet.GetString().clear();
1040         }
1041         else
1042             continue_packet_error = true;
1043 
1044         if (continue_packet_error)
1045         {
1046             // Either no vCont support, or we tried to use part of the vCont
1047             // packet that wasn't supported by the remote GDB server.
1048             // We need to try and make a simple packet that can do our continue
1049             const size_t num_threads = GetThreadList().GetSize();
1050             const size_t num_continue_c_tids = m_continue_c_tids.size();
1051             const size_t num_continue_C_tids = m_continue_C_tids.size();
1052             const size_t num_continue_s_tids = m_continue_s_tids.size();
1053             const size_t num_continue_S_tids = m_continue_S_tids.size();
1054             if (num_continue_c_tids > 0)
1055             {
1056                 if (num_continue_c_tids == num_threads)
1057                 {
1058                     // All threads are resuming...
1059                     m_gdb_comm.SetCurrentThreadForRun (-1);
1060                     continue_packet.PutChar ('c');
1061                     continue_packet_error = false;
1062                 }
1063                 else if (num_continue_c_tids == 1 &&
1064                          num_continue_C_tids == 0 &&
1065                          num_continue_s_tids == 0 &&
1066                          num_continue_S_tids == 0 )
1067                 {
1068                     // Only one thread is continuing
1069                     m_gdb_comm.SetCurrentThreadForRun (m_continue_c_tids.front());
1070                     continue_packet.PutChar ('c');
1071                     continue_packet_error = false;
1072                 }
1073             }
1074 
1075             if (continue_packet_error && num_continue_C_tids > 0)
1076             {
1077                 if ((num_continue_C_tids + num_continue_c_tids) == num_threads &&
1078                     num_continue_C_tids > 0 &&
1079                     num_continue_s_tids == 0 &&
1080                     num_continue_S_tids == 0 )
1081                 {
1082                     const int continue_signo = m_continue_C_tids.front().second;
1083                     // Only one thread is continuing
1084                     if (num_continue_C_tids > 1)
1085                     {
1086                         // More that one thread with a signal, yet we don't have
1087                         // vCont support and we are being asked to resume each
1088                         // thread with a signal, we need to make sure they are
1089                         // all the same signal, or we can't issue the continue
1090                         // accurately with the current support...
1091                         if (num_continue_C_tids > 1)
1092                         {
1093                             continue_packet_error = false;
1094                             for (size_t i=1; i<m_continue_C_tids.size(); ++i)
1095                             {
1096                                 if (m_continue_C_tids[i].second != continue_signo)
1097                                     continue_packet_error = true;
1098                             }
1099                         }
1100                         if (!continue_packet_error)
1101                             m_gdb_comm.SetCurrentThreadForRun (-1);
1102                     }
1103                     else
1104                     {
1105                         // Set the continue thread ID
1106                         continue_packet_error = false;
1107                         m_gdb_comm.SetCurrentThreadForRun (m_continue_C_tids.front().first);
1108                     }
1109                     if (!continue_packet_error)
1110                     {
1111                         // Add threads continuing with the same signo...
1112                         continue_packet.Printf("C%2.2x", continue_signo);
1113                     }
1114                 }
1115             }
1116 
1117             if (continue_packet_error && num_continue_s_tids > 0)
1118             {
1119                 if (num_continue_s_tids == num_threads)
1120                 {
1121                     // All threads are resuming...
1122                     m_gdb_comm.SetCurrentThreadForRun (-1);
1123                     continue_packet.PutChar ('s');
1124                     continue_packet_error = false;
1125                 }
1126                 else if (num_continue_c_tids == 0 &&
1127                          num_continue_C_tids == 0 &&
1128                          num_continue_s_tids == 1 &&
1129                          num_continue_S_tids == 0 )
1130                 {
1131                     // Only one thread is stepping
1132                     m_gdb_comm.SetCurrentThreadForRun (m_continue_s_tids.front());
1133                     continue_packet.PutChar ('s');
1134                     continue_packet_error = false;
1135                 }
1136             }
1137 
1138             if (!continue_packet_error && num_continue_S_tids > 0)
1139             {
1140                 if (num_continue_S_tids == num_threads)
1141                 {
1142                     const int step_signo = m_continue_S_tids.front().second;
1143                     // Are all threads trying to step with the same signal?
1144                     continue_packet_error = false;
1145                     if (num_continue_S_tids > 1)
1146                     {
1147                         for (size_t i=1; i<num_threads; ++i)
1148                         {
1149                             if (m_continue_S_tids[i].second != step_signo)
1150                                 continue_packet_error = true;
1151                         }
1152                     }
1153                     if (!continue_packet_error)
1154                     {
1155                         // Add threads stepping with the same signo...
1156                         m_gdb_comm.SetCurrentThreadForRun (-1);
1157                         continue_packet.Printf("S%2.2x", step_signo);
1158                     }
1159                 }
1160                 else if (num_continue_c_tids == 0 &&
1161                          num_continue_C_tids == 0 &&
1162                          num_continue_s_tids == 0 &&
1163                          num_continue_S_tids == 1 )
1164                 {
1165                     // Only one thread is stepping with signal
1166                     m_gdb_comm.SetCurrentThreadForRun (m_continue_S_tids.front().first);
1167                     continue_packet.Printf("S%2.2x", m_continue_S_tids.front().second);
1168                     continue_packet_error = false;
1169                 }
1170             }
1171         }
1172 
1173         if (continue_packet_error)
1174         {
1175             error.SetErrorString ("can't make continue packet for this resume");
1176         }
1177         else
1178         {
1179             EventSP event_sp;
1180             TimeValue timeout;
1181             timeout = TimeValue::Now();
1182             timeout.OffsetWithSeconds (5);
1183             if (!IS_VALID_LLDB_HOST_THREAD(m_async_thread))
1184             {
1185                 error.SetErrorString ("Trying to resume but the async thread is dead.");
1186                 if (log)
1187                     log->Printf ("ProcessGDBRemote::DoResume: Trying to resume but the async thread is dead.");
1188                 return error;
1189             }
1190 
1191             m_async_broadcaster.BroadcastEvent (eBroadcastBitAsyncContinue, new EventDataBytes (continue_packet.GetData(), continue_packet.GetSize()));
1192 
1193             if (listener.WaitForEvent (&timeout, event_sp) == false)
1194             {
1195                 error.SetErrorString("Resume timed out.");
1196                 if (log)
1197                     log->Printf ("ProcessGDBRemote::DoResume: Resume timed out.");
1198             }
1199             else if (event_sp->BroadcasterIs (&m_async_broadcaster))
1200             {
1201                 error.SetErrorString ("Broadcast continue, but the async thread was killed before we got an ack back.");
1202                 if (log)
1203                     log->Printf ("ProcessGDBRemote::DoResume: Broadcast continue, but the async thread was killed before we got an ack back.");
1204                 return error;
1205             }
1206         }
1207     }
1208 
1209     return error;
1210 }
1211 
1212 void
1213 ProcessGDBRemote::ClearThreadIDList ()
1214 {
1215     Mutex::Locker locker(m_thread_list.GetMutex());
1216     m_thread_ids.clear();
1217 }
1218 
1219 bool
1220 ProcessGDBRemote::UpdateThreadIDList ()
1221 {
1222     Mutex::Locker locker(m_thread_list.GetMutex());
1223     bool sequence_mutex_unavailable = false;
1224     m_gdb_comm.GetCurrentThreadIDs (m_thread_ids, sequence_mutex_unavailable);
1225     if (sequence_mutex_unavailable)
1226     {
1227         return false; // We just didn't get the list
1228     }
1229     return true;
1230 }
1231 
1232 bool
1233 ProcessGDBRemote::UpdateThreadList (ThreadList &old_thread_list, ThreadList &new_thread_list)
1234 {
1235     // locker will keep a mutex locked until it goes out of scope
1236     LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_THREAD));
1237     if (log && log->GetMask().Test(GDBR_LOG_VERBOSE))
1238         log->Printf ("ProcessGDBRemote::%s (pid = %llu)", __FUNCTION__, GetID());
1239 
1240     size_t num_thread_ids = m_thread_ids.size();
1241     // The "m_thread_ids" thread ID list should always be updated after each stop
1242     // reply packet, but in case it isn't, update it here.
1243     if (num_thread_ids == 0)
1244     {
1245         if (!UpdateThreadIDList ())
1246             return false;
1247         num_thread_ids = m_thread_ids.size();
1248     }
1249 
1250     if (num_thread_ids > 0)
1251     {
1252         for (size_t i=0; i<num_thread_ids; ++i)
1253         {
1254             tid_t tid = m_thread_ids[i];
1255             ThreadSP thread_sp (old_thread_list.FindThreadByID (tid, false));
1256             if (!thread_sp)
1257                 thread_sp.reset (new ThreadGDBRemote (shared_from_this(), tid));
1258             new_thread_list.AddThread(thread_sp);
1259         }
1260     }
1261 
1262     return true;
1263 }
1264 
1265 
1266 StateType
1267 ProcessGDBRemote::SetThreadStopInfo (StringExtractor& stop_packet)
1268 {
1269     stop_packet.SetFilePos (0);
1270     const char stop_type = stop_packet.GetChar();
1271     switch (stop_type)
1272     {
1273     case 'T':
1274     case 'S':
1275         {
1276             if (GetStopID() == 0)
1277             {
1278                 // Our first stop, make sure we have a process ID, and also make
1279                 // sure we know about our registers
1280                 if (GetID() == LLDB_INVALID_PROCESS_ID)
1281                 {
1282                     lldb::pid_t pid = m_gdb_comm.GetCurrentProcessID ();
1283                     if (pid != LLDB_INVALID_PROCESS_ID)
1284                         SetID (pid);
1285                 }
1286                 BuildDynamicRegisterInfo (true);
1287             }
1288             // Stop with signal and thread info
1289             const uint8_t signo = stop_packet.GetHexU8();
1290             std::string name;
1291             std::string value;
1292             std::string thread_name;
1293             std::string reason;
1294             std::string description;
1295             uint32_t exc_type = 0;
1296             std::vector<addr_t> exc_data;
1297             addr_t thread_dispatch_qaddr = LLDB_INVALID_ADDRESS;
1298             ThreadSP thread_sp;
1299 
1300             while (stop_packet.GetNameColonValue(name, value))
1301             {
1302                 if (name.compare("metype") == 0)
1303                 {
1304                     // exception type in big endian hex
1305                     exc_type = Args::StringToUInt32 (value.c_str(), 0, 16);
1306                 }
1307                 else if (name.compare("medata") == 0)
1308                 {
1309                     // exception data in big endian hex
1310                     exc_data.push_back(Args::StringToUInt64 (value.c_str(), 0, 16));
1311                 }
1312                 else if (name.compare("thread") == 0)
1313                 {
1314                     // thread in big endian hex
1315                     lldb::tid_t tid = Args::StringToUInt64 (value.c_str(), LLDB_INVALID_THREAD_ID, 16);
1316                     // m_thread_list does have its own mutex, but we need to
1317                     // hold onto the mutex between the call to m_thread_list.FindThreadByID(...)
1318                     // and the m_thread_list.AddThread(...) so it doesn't change on us
1319                     Mutex::Locker locker (m_thread_list.GetMutex ());
1320                     thread_sp = m_thread_list.FindThreadByID(tid, false);
1321                     if (!thread_sp)
1322                     {
1323                         // Create the thread if we need to
1324                         thread_sp.reset (new ThreadGDBRemote (shared_from_this(), tid));
1325                         m_thread_list.AddThread(thread_sp);
1326                     }
1327                 }
1328                 else if (name.compare("threads") == 0)
1329                 {
1330                     Mutex::Locker locker(m_thread_list.GetMutex());
1331                     m_thread_ids.clear();
1332                     // A comma separated list of all threads in the current
1333                     // process that includes the thread for this stop reply
1334                     // packet
1335                     size_t comma_pos;
1336                     lldb::tid_t tid;
1337                     while ((comma_pos = value.find(',')) != std::string::npos)
1338                     {
1339                         value[comma_pos] = '\0';
1340                         // thread in big endian hex
1341                         tid = Args::StringToUInt64 (value.c_str(), LLDB_INVALID_THREAD_ID, 16);
1342                         if (tid != LLDB_INVALID_THREAD_ID)
1343                             m_thread_ids.push_back (tid);
1344                         value.erase(0, comma_pos + 1);
1345 
1346                     }
1347                     tid = Args::StringToUInt64 (value.c_str(), LLDB_INVALID_THREAD_ID, 16);
1348                     if (tid != LLDB_INVALID_THREAD_ID)
1349                         m_thread_ids.push_back (tid);
1350                 }
1351                 else if (name.compare("hexname") == 0)
1352                 {
1353                     StringExtractor name_extractor;
1354                     // Swap "value" over into "name_extractor"
1355                     name_extractor.GetStringRef().swap(value);
1356                     // Now convert the HEX bytes into a string value
1357                     name_extractor.GetHexByteString (value);
1358                     thread_name.swap (value);
1359                 }
1360                 else if (name.compare("name") == 0)
1361                 {
1362                     thread_name.swap (value);
1363                 }
1364                 else if (name.compare("qaddr") == 0)
1365                 {
1366                     thread_dispatch_qaddr = Args::StringToUInt64 (value.c_str(), 0, 16);
1367                 }
1368                 else if (name.compare("reason") == 0)
1369                 {
1370                     reason.swap(value);
1371                 }
1372                 else if (name.compare("description") == 0)
1373                 {
1374                     StringExtractor desc_extractor;
1375                     // Swap "value" over into "name_extractor"
1376                     desc_extractor.GetStringRef().swap(value);
1377                     // Now convert the HEX bytes into a string value
1378                     desc_extractor.GetHexByteString (thread_name);
1379                 }
1380                 else if (name.size() == 2 && ::isxdigit(name[0]) && ::isxdigit(name[1]))
1381                 {
1382                     // We have a register number that contains an expedited
1383                     // register value. Lets supply this register to our thread
1384                     // so it won't have to go and read it.
1385                     if (thread_sp)
1386                     {
1387                         uint32_t reg = Args::StringToUInt32 (name.c_str(), UINT32_MAX, 16);
1388 
1389                         if (reg != UINT32_MAX)
1390                         {
1391                             StringExtractor reg_value_extractor;
1392                             // Swap "value" over into "reg_value_extractor"
1393                             reg_value_extractor.GetStringRef().swap(value);
1394                             if (!static_cast<ThreadGDBRemote *> (thread_sp.get())->PrivateSetRegisterValue (reg, reg_value_extractor))
1395                             {
1396                                 Host::SetCrashDescriptionWithFormat("Setting thread register '%s' (decoded to %u (0x%x)) with value '%s' for stop packet: '%s'",
1397                                                                     name.c_str(),
1398                                                                     reg,
1399                                                                     reg,
1400                                                                     reg_value_extractor.GetStringRef().c_str(),
1401                                                                     stop_packet.GetStringRef().c_str());
1402                             }
1403                         }
1404                     }
1405                 }
1406             }
1407 
1408             if (thread_sp)
1409             {
1410                 ThreadGDBRemote *gdb_thread = static_cast<ThreadGDBRemote *> (thread_sp.get());
1411 
1412                 gdb_thread->SetThreadDispatchQAddr (thread_dispatch_qaddr);
1413                 gdb_thread->SetName (thread_name.empty() ? NULL : thread_name.c_str());
1414                 if (exc_type != 0)
1415                 {
1416                     const size_t exc_data_size = exc_data.size();
1417 
1418                     gdb_thread->SetStopInfo (StopInfoMachException::CreateStopReasonWithMachException (*thread_sp,
1419                                                                                                        exc_type,
1420                                                                                                        exc_data_size,
1421                                                                                                        exc_data_size >= 1 ? exc_data[0] : 0,
1422                                                                                                        exc_data_size >= 2 ? exc_data[1] : 0,
1423                                                                                                        exc_data_size >= 3 ? exc_data[2] : 0));
1424                 }
1425                 else
1426                 {
1427                     bool handled = false;
1428                     if (!reason.empty())
1429                     {
1430                         if (reason.compare("trace") == 0)
1431                         {
1432                             gdb_thread->SetStopInfo (StopInfo::CreateStopReasonToTrace (*thread_sp));
1433                             handled = true;
1434                         }
1435                         else if (reason.compare("breakpoint") == 0)
1436                         {
1437                             addr_t pc = gdb_thread->GetRegisterContext()->GetPC();
1438                             lldb::BreakpointSiteSP bp_site_sp = gdb_thread->GetProcess()->GetBreakpointSiteList().FindByAddress(pc);
1439                             if (bp_site_sp)
1440                             {
1441                                 // If the breakpoint is for this thread, then we'll report the hit, but if it is for another thread,
1442                                 // we can just report no reason.  We don't need to worry about stepping over the breakpoint here, that
1443                                 // will be taken care of when the thread resumes and notices that there's a breakpoint under the pc.
1444                                 handled = true;
1445                                 if (bp_site_sp->ValidForThisThread (gdb_thread))
1446                                 {
1447                                     gdb_thread->SetStopInfo (StopInfo::CreateStopReasonWithBreakpointSiteID (*thread_sp, bp_site_sp->GetID()));
1448                                 }
1449                                 else
1450                                 {
1451                                     StopInfoSP invalid_stop_info_sp;
1452                                     gdb_thread->SetStopInfo (invalid_stop_info_sp);
1453                                 }
1454                             }
1455 
1456                         }
1457                         else if (reason.compare("trap") == 0)
1458                         {
1459                             // Let the trap just use the standard signal stop reason below...
1460                         }
1461                         else if (reason.compare("watchpoint") == 0)
1462                         {
1463                             break_id_t watch_id = LLDB_INVALID_WATCH_ID;
1464                             // TODO: locate the watchpoint somehow...
1465                             gdb_thread->SetStopInfo (StopInfo::CreateStopReasonWithWatchpointID (*thread_sp, watch_id));
1466                             handled = true;
1467                         }
1468                         else if (reason.compare("exception") == 0)
1469                         {
1470                             gdb_thread->SetStopInfo (StopInfo::CreateStopReasonWithException(*thread_sp, description.c_str()));
1471                             handled = true;
1472                         }
1473                     }
1474 
1475                     if (signo)
1476                     {
1477                         if (signo == SIGTRAP)
1478                         {
1479                             // Currently we are going to assume SIGTRAP means we are either
1480                             // hitting a breakpoint or hardware single stepping.
1481                             handled = true;
1482                             addr_t pc = gdb_thread->GetRegisterContext()->GetPC();
1483                             lldb::BreakpointSiteSP bp_site_sp = gdb_thread->GetProcess()->GetBreakpointSiteList().FindByAddress(pc);
1484 
1485                             if (bp_site_sp)
1486                             {
1487                                 // If the breakpoint is for this thread, then we'll report the hit, but if it is for another thread,
1488                                 // we can just report no reason.  We don't need to worry about stepping over the breakpoint here, that
1489                                 // will be taken care of when the thread resumes and notices that there's a breakpoint under the pc.
1490                                 if (bp_site_sp->ValidForThisThread (gdb_thread))
1491                                 {
1492                                     gdb_thread->SetStopInfo (StopInfo::CreateStopReasonWithBreakpointSiteID (*thread_sp, bp_site_sp->GetID()));
1493                                 }
1494                                 else
1495                                 {
1496                                     StopInfoSP invalid_stop_info_sp;
1497                                     gdb_thread->SetStopInfo (invalid_stop_info_sp);
1498                                 }
1499                             }
1500                             else
1501                             {
1502                                 // TODO: check for breakpoint or trap opcode in case there is a hard
1503                                 // coded software trap
1504                                 gdb_thread->SetStopInfo (StopInfo::CreateStopReasonToTrace (*thread_sp));
1505                             }
1506                         }
1507                         if (!handled)
1508                             gdb_thread->SetStopInfo (StopInfo::CreateStopReasonWithSignal (*thread_sp, signo));
1509                 }
1510                 else
1511                 {
1512                     StopInfoSP invalid_stop_info_sp;
1513                     gdb_thread->SetStopInfo (invalid_stop_info_sp);
1514                 }
1515 
1516                     if (!description.empty())
1517                     {
1518                         lldb::StopInfoSP stop_info_sp (gdb_thread->GetStopInfo ());
1519                         if (stop_info_sp)
1520                         {
1521                             stop_info_sp->SetDescription (description.c_str());
1522                         }
1523                         else
1524                         {
1525                             gdb_thread->SetStopInfo (StopInfo::CreateStopReasonWithException (*thread_sp, description.c_str()));
1526                         }
1527                     }
1528                 }
1529             }
1530             return eStateStopped;
1531         }
1532         break;
1533 
1534     case 'W':
1535         // process exited
1536         return eStateExited;
1537 
1538     default:
1539         break;
1540     }
1541     return eStateInvalid;
1542 }
1543 
1544 void
1545 ProcessGDBRemote::RefreshStateAfterStop ()
1546 {
1547     Mutex::Locker locker(m_thread_list.GetMutex());
1548     m_thread_ids.clear();
1549     // Set the thread stop info. It might have a "threads" key whose value is
1550     // a list of all thread IDs in the current process, so m_thread_ids might
1551     // get set.
1552     SetThreadStopInfo (m_last_stop_packet);
1553     // Check to see if SetThreadStopInfo() filled in m_thread_ids?
1554     if (m_thread_ids.empty())
1555     {
1556         // No, we need to fetch the thread list manually
1557         UpdateThreadIDList();
1558     }
1559 
1560     // Let all threads recover from stopping and do any clean up based
1561     // on the previous thread state (if any).
1562     m_thread_list.RefreshStateAfterStop();
1563 
1564 }
1565 
1566 Error
1567 ProcessGDBRemote::DoHalt (bool &caused_stop)
1568 {
1569     Error error;
1570 
1571     bool timed_out = false;
1572     Mutex::Locker locker;
1573 
1574     if (m_public_state.GetValue() == eStateAttaching)
1575     {
1576         // We are being asked to halt during an attach. We need to just close
1577         // our file handle and debugserver will go away, and we can be done...
1578         m_gdb_comm.Disconnect();
1579     }
1580     else
1581     {
1582         if (!m_gdb_comm.SendInterrupt (locker, 2, timed_out))
1583         {
1584             if (timed_out)
1585                 error.SetErrorString("timed out sending interrupt packet");
1586             else
1587                 error.SetErrorString("unknown error sending interrupt packet");
1588         }
1589 
1590         caused_stop = m_gdb_comm.GetInterruptWasSent ();
1591     }
1592     return error;
1593 }
1594 
1595 Error
1596 ProcessGDBRemote::InterruptIfRunning
1597 (
1598     bool discard_thread_plans,
1599     bool catch_stop_event,
1600     EventSP &stop_event_sp
1601 )
1602 {
1603     Error error;
1604 
1605     LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_PROCESS));
1606 
1607     bool paused_private_state_thread = false;
1608     const bool is_running = m_gdb_comm.IsRunning();
1609     if (log)
1610         log->Printf ("ProcessGDBRemote::InterruptIfRunning(discard_thread_plans=%i, catch_stop_event=%i) is_running=%i",
1611                      discard_thread_plans,
1612                      catch_stop_event,
1613                      is_running);
1614 
1615     if (discard_thread_plans)
1616     {
1617         if (log)
1618             log->Printf ("ProcessGDBRemote::InterruptIfRunning() discarding all thread plans");
1619         m_thread_list.DiscardThreadPlans();
1620     }
1621     if (is_running)
1622     {
1623         if (catch_stop_event)
1624         {
1625             if (log)
1626                 log->Printf ("ProcessGDBRemote::InterruptIfRunning() pausing private state thread");
1627             PausePrivateStateThread();
1628             paused_private_state_thread = true;
1629         }
1630 
1631         bool timed_out = false;
1632         Mutex::Locker locker;
1633 
1634         if (!m_gdb_comm.SendInterrupt (locker, 1, timed_out))
1635         {
1636             if (timed_out)
1637                 error.SetErrorString("timed out sending interrupt packet");
1638             else
1639                 error.SetErrorString("unknown error sending interrupt packet");
1640             if (paused_private_state_thread)
1641                 ResumePrivateStateThread();
1642             return error;
1643         }
1644 
1645         if (catch_stop_event)
1646         {
1647             // LISTEN HERE
1648             TimeValue timeout_time;
1649             timeout_time = TimeValue::Now();
1650             timeout_time.OffsetWithSeconds(5);
1651             StateType state = WaitForStateChangedEventsPrivate (&timeout_time, stop_event_sp);
1652 
1653             timed_out = state == eStateInvalid;
1654             if (log)
1655                 log->Printf ("ProcessGDBRemote::InterruptIfRunning() catch stop event: state = %s, timed-out=%i", StateAsCString(state), timed_out);
1656 
1657             if (timed_out)
1658                 error.SetErrorString("unable to verify target stopped");
1659         }
1660 
1661         if (paused_private_state_thread)
1662         {
1663             if (log)
1664                 log->Printf ("ProcessGDBRemote::InterruptIfRunning() resuming private state thread");
1665             ResumePrivateStateThread();
1666         }
1667     }
1668     return error;
1669 }
1670 
1671 Error
1672 ProcessGDBRemote::WillDetach ()
1673 {
1674     LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_PROCESS));
1675     if (log)
1676         log->Printf ("ProcessGDBRemote::WillDetach()");
1677 
1678     bool discard_thread_plans = true;
1679     bool catch_stop_event = true;
1680     EventSP event_sp;
1681 
1682     // FIXME: InterruptIfRunning should be done in the Process base class, or better still make Halt do what is
1683     // needed.  This shouldn't be a feature of a particular plugin.
1684 
1685     return InterruptIfRunning (discard_thread_plans, catch_stop_event, event_sp);
1686 }
1687 
1688 Error
1689 ProcessGDBRemote::DoDetach()
1690 {
1691     Error error;
1692     LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_PROCESS));
1693     if (log)
1694         log->Printf ("ProcessGDBRemote::DoDetach()");
1695 
1696     DisableAllBreakpointSites ();
1697 
1698     m_thread_list.DiscardThreadPlans();
1699 
1700     bool success = m_gdb_comm.Detach ();
1701     if (log)
1702     {
1703         if (success)
1704             log->PutCString ("ProcessGDBRemote::DoDetach() detach packet sent successfully");
1705         else
1706             log->PutCString ("ProcessGDBRemote::DoDetach() detach packet send failed");
1707     }
1708     // Sleep for one second to let the process get all detached...
1709     StopAsyncThread ();
1710 
1711     SetPrivateState (eStateDetached);
1712     ResumePrivateStateThread();
1713 
1714     //KillDebugserverProcess ();
1715     return error;
1716 }
1717 
1718 
1719 Error
1720 ProcessGDBRemote::DoDestroy ()
1721 {
1722     Error error;
1723     LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_PROCESS));
1724     if (log)
1725         log->Printf ("ProcessGDBRemote::DoDestroy()");
1726 
1727     // There is a bug in older iOS debugservers where they don't shut down the process
1728     // they are debugging properly.  If the process is sitting at a breakpoint or an exception,
1729     // this can cause problems with restarting.  So we check to see if any of our threads are stopped
1730     // at a breakpoint, and if so we remove all the breakpoints, resume the process, and THEN
1731     // destroy it again.
1732     //
1733     // Note, we don't have a good way to test the version of debugserver, but I happen to know that
1734     // the set of all the iOS debugservers which don't support GetThreadSuffixSupported() and that of
1735     // the debugservers with this bug are equal.  There really should be a better way to test this!
1736     //
1737     // We also use m_destroy_tried_resuming to make sure we only do this once, if we resume and then halt and
1738     // get called here to destroy again and we're still at a breakpoint or exception, then we should
1739     // just do the straight-forward kill.
1740     //
1741     // And of course, if we weren't able to stop the process by the time we get here, it isn't
1742     // necessary (or helpful) to do any of this.
1743 
1744     if (!m_gdb_comm.GetThreadSuffixSupported() && m_public_state.GetValue() != eStateRunning)
1745     {
1746         PlatformSP platform_sp = GetTarget().GetPlatform();
1747 
1748         // FIXME: These should be ConstStrings so we aren't doing strcmp'ing.
1749         if (platform_sp
1750             && platform_sp->GetName()
1751             && strcmp (platform_sp->GetName(), PlatformRemoteiOS::GetShortPluginNameStatic()) == 0)
1752         {
1753             if (m_destroy_tried_resuming)
1754             {
1755                 if (log)
1756                     log->PutCString ("ProcessGDBRemote::DoDestroy()Tried resuming to destroy once already, not doing it again.");
1757             }
1758             else
1759             {
1760                 // At present, the plans are discarded and the breakpoints disabled Process::Destroy,
1761                 // but we really need it to happen here and it doesn't matter if we do it twice.
1762                 m_thread_list.DiscardThreadPlans();
1763                 DisableAllBreakpointSites();
1764 
1765                 bool stop_looks_like_crash = false;
1766                 ThreadList &threads = GetThreadList();
1767 
1768                 {
1769                     Mutex::Locker(threads.GetMutex());
1770 
1771                     size_t num_threads = threads.GetSize();
1772                     for (size_t i = 0; i < num_threads; i++)
1773                     {
1774                         ThreadSP thread_sp = threads.GetThreadAtIndex(i);
1775                         StopInfoSP stop_info_sp = thread_sp->GetPrivateStopReason();
1776                         StopReason reason = eStopReasonInvalid;
1777                         if (stop_info_sp)
1778                             reason = stop_info_sp->GetStopReason();
1779                         if (reason == eStopReasonBreakpoint
1780                             || reason == eStopReasonException)
1781                         {
1782                             if (log)
1783                                 log->Printf ("ProcessGDBRemote::DoDestroy() - thread: %lld stopped with reason: %s.",
1784                                              thread_sp->GetID(),
1785                                              stop_info_sp->GetDescription());
1786                             stop_looks_like_crash = true;
1787                             break;
1788                         }
1789                     }
1790                 }
1791 
1792                 if (stop_looks_like_crash)
1793                 {
1794                     if (log)
1795                         log->PutCString ("ProcessGDBRemote::DoDestroy() - Stopped at a breakpoint, continue and then kill.");
1796                     m_destroy_tried_resuming = true;
1797 
1798                     // If we are going to run again before killing, it would be good to suspend all the threads
1799                     // before resuming so they won't get into more trouble.  Sadly, for the threads stopped with
1800                     // the breakpoint or exception, the exception doesn't get cleared if it is suspended, so we do
1801                     // have to run the risk of letting those threads proceed a bit.
1802 
1803                     {
1804                         Mutex::Locker(threads.GetMutex());
1805 
1806                         size_t num_threads = threads.GetSize();
1807                         for (size_t i = 0; i < num_threads; i++)
1808                         {
1809                             ThreadSP thread_sp = threads.GetThreadAtIndex(i);
1810                             StopInfoSP stop_info_sp = thread_sp->GetPrivateStopReason();
1811                             StopReason reason = eStopReasonInvalid;
1812                             if (stop_info_sp)
1813                                 reason = stop_info_sp->GetStopReason();
1814                             if (reason != eStopReasonBreakpoint
1815                                 && reason != eStopReasonException)
1816                             {
1817                                 if (log)
1818                                     log->Printf ("ProcessGDBRemote::DoDestroy() - Suspending thread: %lld before running.",
1819                                                  thread_sp->GetID());
1820                                 thread_sp->SetResumeState(eStateSuspended);
1821                             }
1822                         }
1823                     }
1824                     Resume ();
1825                     return Destroy();
1826                 }
1827             }
1828         }
1829     }
1830 
1831     // Interrupt if our inferior is running...
1832     int exit_status = SIGABRT;
1833     std::string exit_string;
1834 
1835     if (m_gdb_comm.IsConnected())
1836     {
1837         if (m_public_state.GetValue() != eStateAttaching)
1838         {
1839 
1840             StringExtractorGDBRemote response;
1841             bool send_async = true;
1842             if (m_gdb_comm.SendPacketAndWaitForResponse("k", 1, response, send_async))
1843             {
1844                 char packet_cmd = response.GetChar(0);
1845 
1846                 if (packet_cmd == 'W' || packet_cmd == 'X')
1847                 {
1848                     SetLastStopPacket (response);
1849                     ClearThreadIDList ();
1850                     exit_status = response.GetHexU8();
1851                 }
1852                 else
1853                 {
1854                     if (log)
1855                         log->Printf ("ProcessGDBRemote::DoDestroy - got unexpected response to k packet: %s", response.GetStringRef().c_str());
1856                     exit_string.assign("got unexpected response to k packet: ");
1857                     exit_string.append(response.GetStringRef());
1858                 }
1859             }
1860             else
1861             {
1862                 if (log)
1863                     log->Printf ("ProcessGDBRemote::DoDestroy - failed to send k packet");
1864                 exit_string.assign("failed to send the k packet");
1865             }
1866         }
1867         else
1868         {
1869             if (log)
1870                 log->Printf ("ProcessGDBRemote::DoDestroy - failed to send k packet");
1871             exit_string.assign ("killed or interrupted while attaching.");
1872         }
1873     }
1874     else
1875     {
1876         // If we missed setting the exit status on the way out, do it here.
1877         // NB set exit status can be called multiple times, the first one sets the status.
1878         exit_string.assign("destroying when not connected to debugserver");
1879     }
1880 
1881     SetExitStatus(exit_status, exit_string.c_str());
1882 
1883     StopAsyncThread ();
1884     KillDebugserverProcess ();
1885     return error;
1886 }
1887 
1888 //------------------------------------------------------------------
1889 // Process Queries
1890 //------------------------------------------------------------------
1891 
1892 bool
1893 ProcessGDBRemote::IsAlive ()
1894 {
1895     return m_gdb_comm.IsConnected() && m_private_state.GetValue() != eStateExited;
1896 }
1897 
1898 addr_t
1899 ProcessGDBRemote::GetImageInfoAddress()
1900 {
1901     return m_gdb_comm.GetShlibInfoAddr();
1902 }
1903 
1904 //------------------------------------------------------------------
1905 // Process Memory
1906 //------------------------------------------------------------------
1907 size_t
1908 ProcessGDBRemote::DoReadMemory (addr_t addr, void *buf, size_t size, Error &error)
1909 {
1910     if (size > m_max_memory_size)
1911     {
1912         // Keep memory read sizes down to a sane limit. This function will be
1913         // called multiple times in order to complete the task by
1914         // lldb_private::Process so it is ok to do this.
1915         size = m_max_memory_size;
1916     }
1917 
1918     char packet[64];
1919     const int packet_len = ::snprintf (packet, sizeof(packet), "m%llx,%zx", (uint64_t)addr, size);
1920     assert (packet_len + 1 < sizeof(packet));
1921     StringExtractorGDBRemote response;
1922     if (m_gdb_comm.SendPacketAndWaitForResponse(packet, packet_len, response, true))
1923     {
1924         if (response.IsNormalResponse())
1925         {
1926             error.Clear();
1927             return response.GetHexBytes(buf, size, '\xdd');
1928         }
1929         else if (response.IsErrorResponse())
1930             error.SetErrorStringWithFormat("gdb remote returned an error: %s", response.GetStringRef().c_str());
1931         else if (response.IsUnsupportedResponse())
1932             error.SetErrorStringWithFormat("'%s' packet unsupported", packet);
1933         else
1934             error.SetErrorStringWithFormat("unexpected response to '%s': '%s'", packet, response.GetStringRef().c_str());
1935     }
1936     else
1937     {
1938         error.SetErrorStringWithFormat("failed to sent packet: '%s'", packet);
1939     }
1940     return 0;
1941 }
1942 
1943 size_t
1944 ProcessGDBRemote::DoWriteMemory (addr_t addr, const void *buf, size_t size, Error &error)
1945 {
1946     if (size > m_max_memory_size)
1947     {
1948         // Keep memory read sizes down to a sane limit. This function will be
1949         // called multiple times in order to complete the task by
1950         // lldb_private::Process so it is ok to do this.
1951         size = m_max_memory_size;
1952     }
1953 
1954     StreamString packet;
1955     packet.Printf("M%llx,%zx:", addr, size);
1956     packet.PutBytesAsRawHex8(buf, size, lldb::endian::InlHostByteOrder(), lldb::endian::InlHostByteOrder());
1957     StringExtractorGDBRemote response;
1958     if (m_gdb_comm.SendPacketAndWaitForResponse(packet.GetData(), packet.GetSize(), response, true))
1959     {
1960         if (response.IsOKResponse())
1961         {
1962             error.Clear();
1963             return size;
1964         }
1965         else if (response.IsErrorResponse())
1966             error.SetErrorStringWithFormat("gdb remote returned an error: %s", response.GetStringRef().c_str());
1967         else if (response.IsUnsupportedResponse())
1968             error.SetErrorStringWithFormat("'%s' packet unsupported", packet.GetString().c_str());
1969         else
1970             error.SetErrorStringWithFormat("unexpected response to '%s': '%s'", packet.GetString().c_str(), response.GetStringRef().c_str());
1971     }
1972     else
1973     {
1974         error.SetErrorStringWithFormat("failed to sent packet: '%s'", packet.GetString().c_str());
1975     }
1976     return 0;
1977 }
1978 
1979 lldb::addr_t
1980 ProcessGDBRemote::DoAllocateMemory (size_t size, uint32_t permissions, Error &error)
1981 {
1982     addr_t allocated_addr = LLDB_INVALID_ADDRESS;
1983 
1984     LazyBool supported = m_gdb_comm.SupportsAllocDeallocMemory();
1985     switch (supported)
1986     {
1987         case eLazyBoolCalculate:
1988         case eLazyBoolYes:
1989             allocated_addr = m_gdb_comm.AllocateMemory (size, permissions);
1990             if (allocated_addr != LLDB_INVALID_ADDRESS || supported == eLazyBoolYes)
1991                 return allocated_addr;
1992 
1993         case eLazyBoolNo:
1994             // Call mmap() to create memory in the inferior..
1995             unsigned prot = 0;
1996             if (permissions & lldb::ePermissionsReadable)
1997                 prot |= eMmapProtRead;
1998             if (permissions & lldb::ePermissionsWritable)
1999                 prot |= eMmapProtWrite;
2000             if (permissions & lldb::ePermissionsExecutable)
2001                 prot |= eMmapProtExec;
2002 
2003             if (InferiorCallMmap(this, allocated_addr, 0, size, prot,
2004                                  eMmapFlagsAnon | eMmapFlagsPrivate, -1, 0))
2005                 m_addr_to_mmap_size[allocated_addr] = size;
2006             else
2007                 allocated_addr = LLDB_INVALID_ADDRESS;
2008             break;
2009     }
2010 
2011     if (allocated_addr == LLDB_INVALID_ADDRESS)
2012         error.SetErrorStringWithFormat("unable to allocate %zu bytes of memory with permissions %s", size, GetPermissionsAsCString (permissions));
2013     else
2014         error.Clear();
2015     return allocated_addr;
2016 }
2017 
2018 Error
2019 ProcessGDBRemote::GetMemoryRegionInfo (addr_t load_addr,
2020                                        MemoryRegionInfo &region_info)
2021 {
2022 
2023     Error error (m_gdb_comm.GetMemoryRegionInfo (load_addr, region_info));
2024     return error;
2025 }
2026 
2027 Error
2028 ProcessGDBRemote::GetWatchpointSupportInfo (uint32_t &num)
2029 {
2030 
2031     Error error (m_gdb_comm.GetWatchpointSupportInfo (num));
2032     return error;
2033 }
2034 
2035 Error
2036 ProcessGDBRemote::GetWatchpointSupportInfo (uint32_t &num, bool& after)
2037 {
2038     Error error (m_gdb_comm.GetWatchpointSupportInfo (num, after));
2039     return error;
2040 }
2041 
2042 Error
2043 ProcessGDBRemote::DoDeallocateMemory (lldb::addr_t addr)
2044 {
2045     Error error;
2046     LazyBool supported = m_gdb_comm.SupportsAllocDeallocMemory();
2047 
2048     switch (supported)
2049     {
2050         case eLazyBoolCalculate:
2051             // We should never be deallocating memory without allocating memory
2052             // first so we should never get eLazyBoolCalculate
2053             error.SetErrorString ("tried to deallocate memory without ever allocating memory");
2054             break;
2055 
2056         case eLazyBoolYes:
2057             if (!m_gdb_comm.DeallocateMemory (addr))
2058                 error.SetErrorStringWithFormat("unable to deallocate memory at 0x%llx", addr);
2059             break;
2060 
2061         case eLazyBoolNo:
2062             // Call munmap() to deallocate memory in the inferior..
2063             {
2064                 MMapMap::iterator pos = m_addr_to_mmap_size.find(addr);
2065                 if (pos != m_addr_to_mmap_size.end() &&
2066                     InferiorCallMunmap(this, addr, pos->second))
2067                     m_addr_to_mmap_size.erase (pos);
2068                 else
2069                     error.SetErrorStringWithFormat("unable to deallocate memory at 0x%llx", addr);
2070             }
2071             break;
2072     }
2073 
2074     return error;
2075 }
2076 
2077 
2078 //------------------------------------------------------------------
2079 // Process STDIO
2080 //------------------------------------------------------------------
2081 size_t
2082 ProcessGDBRemote::PutSTDIN (const char *src, size_t src_len, Error &error)
2083 {
2084     if (m_stdio_communication.IsConnected())
2085     {
2086         ConnectionStatus status;
2087         m_stdio_communication.Write(src, src_len, status, NULL);
2088     }
2089     return 0;
2090 }
2091 
2092 Error
2093 ProcessGDBRemote::EnableBreakpoint (BreakpointSite *bp_site)
2094 {
2095     Error error;
2096     assert (bp_site != NULL);
2097 
2098     LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_BREAKPOINTS));
2099     user_id_t site_id = bp_site->GetID();
2100     const addr_t addr = bp_site->GetLoadAddress();
2101     if (log)
2102         log->Printf ("ProcessGDBRemote::EnableBreakpoint (size_id = %llu) address = 0x%llx", site_id, (uint64_t)addr);
2103 
2104     if (bp_site->IsEnabled())
2105     {
2106         if (log)
2107             log->Printf ("ProcessGDBRemote::EnableBreakpoint (size_id = %llu) address = 0x%llx -- SUCCESS (already enabled)", site_id, (uint64_t)addr);
2108         return error;
2109     }
2110     else
2111     {
2112         const size_t bp_op_size = GetSoftwareBreakpointTrapOpcode (bp_site);
2113 
2114         if (bp_site->HardwarePreferred())
2115         {
2116             // Try and set hardware breakpoint, and if that fails, fall through
2117             // and set a software breakpoint?
2118             if (m_gdb_comm.SupportsGDBStoppointPacket (eBreakpointHardware))
2119             {
2120                 if (m_gdb_comm.SendGDBStoppointTypePacket(eBreakpointHardware, true, addr, bp_op_size) == 0)
2121                 {
2122                     bp_site->SetEnabled(true);
2123                     bp_site->SetType (BreakpointSite::eHardware);
2124                     return error;
2125                 }
2126             }
2127         }
2128 
2129         if (m_gdb_comm.SupportsGDBStoppointPacket (eBreakpointSoftware))
2130         {
2131             if (m_gdb_comm.SendGDBStoppointTypePacket(eBreakpointSoftware, true, addr, bp_op_size) == 0)
2132             {
2133                 bp_site->SetEnabled(true);
2134                 bp_site->SetType (BreakpointSite::eExternal);
2135                 return error;
2136             }
2137         }
2138 
2139         return EnableSoftwareBreakpoint (bp_site);
2140     }
2141 
2142     if (log)
2143     {
2144         const char *err_string = error.AsCString();
2145         log->Printf ("ProcessGDBRemote::EnableBreakpoint() error for breakpoint at 0x%8.8llx: %s",
2146                      bp_site->GetLoadAddress(),
2147                      err_string ? err_string : "NULL");
2148     }
2149     // We shouldn't reach here on a successful breakpoint enable...
2150     if (error.Success())
2151         error.SetErrorToGenericError();
2152     return error;
2153 }
2154 
2155 Error
2156 ProcessGDBRemote::DisableBreakpoint (BreakpointSite *bp_site)
2157 {
2158     Error error;
2159     assert (bp_site != NULL);
2160     addr_t addr = bp_site->GetLoadAddress();
2161     user_id_t site_id = bp_site->GetID();
2162     LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_BREAKPOINTS));
2163     if (log)
2164         log->Printf ("ProcessGDBRemote::DisableBreakpoint (site_id = %llu) addr = 0x%8.8llx", site_id, (uint64_t)addr);
2165 
2166     if (bp_site->IsEnabled())
2167     {
2168         const size_t bp_op_size = GetSoftwareBreakpointTrapOpcode (bp_site);
2169 
2170         BreakpointSite::Type bp_type = bp_site->GetType();
2171         switch (bp_type)
2172         {
2173         case BreakpointSite::eSoftware:
2174             error = DisableSoftwareBreakpoint (bp_site);
2175             break;
2176 
2177         case BreakpointSite::eHardware:
2178             if (m_gdb_comm.SendGDBStoppointTypePacket(eBreakpointSoftware, false, addr, bp_op_size))
2179                 error.SetErrorToGenericError();
2180             break;
2181 
2182         case BreakpointSite::eExternal:
2183             if (m_gdb_comm.SendGDBStoppointTypePacket(eBreakpointSoftware, false, addr, bp_op_size))
2184                 error.SetErrorToGenericError();
2185             break;
2186         }
2187         if (error.Success())
2188             bp_site->SetEnabled(false);
2189     }
2190     else
2191     {
2192         if (log)
2193             log->Printf ("ProcessGDBRemote::DisableBreakpoint (site_id = %llu) addr = 0x%8.8llx -- SUCCESS (already disabled)", site_id, (uint64_t)addr);
2194         return error;
2195     }
2196 
2197     if (error.Success())
2198         error.SetErrorToGenericError();
2199     return error;
2200 }
2201 
2202 // Pre-requisite: wp != NULL.
2203 static GDBStoppointType
2204 GetGDBStoppointType (Watchpoint *wp)
2205 {
2206     assert(wp);
2207     bool watch_read = wp->WatchpointRead();
2208     bool watch_write = wp->WatchpointWrite();
2209 
2210     // watch_read and watch_write cannot both be false.
2211     assert(watch_read || watch_write);
2212     if (watch_read && watch_write)
2213         return eWatchpointReadWrite;
2214     else if (watch_read)
2215         return eWatchpointRead;
2216     else // Must be watch_write, then.
2217         return eWatchpointWrite;
2218 }
2219 
2220 Error
2221 ProcessGDBRemote::EnableWatchpoint (Watchpoint *wp)
2222 {
2223     Error error;
2224     if (wp)
2225     {
2226         user_id_t watchID = wp->GetID();
2227         addr_t addr = wp->GetLoadAddress();
2228         LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_WATCHPOINTS));
2229         if (log)
2230             log->Printf ("ProcessGDBRemote::EnableWatchpoint(watchID = %llu)", watchID);
2231         if (wp->IsEnabled())
2232         {
2233             if (log)
2234                 log->Printf("ProcessGDBRemote::EnableWatchpoint(watchID = %llu) addr = 0x%8.8llx: watchpoint already enabled.", watchID, (uint64_t)addr);
2235             return error;
2236         }
2237 
2238         GDBStoppointType type = GetGDBStoppointType(wp);
2239         // Pass down an appropriate z/Z packet...
2240         if (m_gdb_comm.SupportsGDBStoppointPacket (type))
2241         {
2242             if (m_gdb_comm.SendGDBStoppointTypePacket(type, true, addr, wp->GetByteSize()) == 0)
2243             {
2244                 wp->SetEnabled(true);
2245                 return error;
2246             }
2247             else
2248                 error.SetErrorString("sending gdb watchpoint packet failed");
2249         }
2250         else
2251             error.SetErrorString("watchpoints not supported");
2252     }
2253     else
2254     {
2255         error.SetErrorString("Watchpoint argument was NULL.");
2256     }
2257     if (error.Success())
2258         error.SetErrorToGenericError();
2259     return error;
2260 }
2261 
2262 Error
2263 ProcessGDBRemote::DisableWatchpoint (Watchpoint *wp)
2264 {
2265     Error error;
2266     if (wp)
2267     {
2268         user_id_t watchID = wp->GetID();
2269 
2270         LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_WATCHPOINTS));
2271 
2272         addr_t addr = wp->GetLoadAddress();
2273         if (log)
2274             log->Printf ("ProcessGDBRemote::DisableWatchpoint (watchID = %llu) addr = 0x%8.8llx", watchID, (uint64_t)addr);
2275 
2276         if (!wp->IsEnabled())
2277         {
2278             if (log)
2279                 log->Printf ("ProcessGDBRemote::DisableWatchpoint (watchID = %llu) addr = 0x%8.8llx -- SUCCESS (already disabled)", watchID, (uint64_t)addr);
2280             return error;
2281         }
2282 
2283         if (wp->IsHardware())
2284         {
2285             GDBStoppointType type = GetGDBStoppointType(wp);
2286             // Pass down an appropriate z/Z packet...
2287             if (m_gdb_comm.SendGDBStoppointTypePacket(type, false, addr, wp->GetByteSize()) == 0)
2288             {
2289                 wp->SetEnabled(false);
2290                 return error;
2291             }
2292             else
2293                 error.SetErrorString("sending gdb watchpoint packet failed");
2294         }
2295         // TODO: clear software watchpoints if we implement them
2296     }
2297     else
2298     {
2299         error.SetErrorString("Watchpoint argument was NULL.");
2300     }
2301     if (error.Success())
2302         error.SetErrorToGenericError();
2303     return error;
2304 }
2305 
2306 void
2307 ProcessGDBRemote::Clear()
2308 {
2309     m_flags = 0;
2310     m_thread_list.Clear();
2311 }
2312 
2313 Error
2314 ProcessGDBRemote::DoSignal (int signo)
2315 {
2316     Error error;
2317     LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_PROCESS));
2318     if (log)
2319         log->Printf ("ProcessGDBRemote::DoSignal (signal = %d)", signo);
2320 
2321     if (!m_gdb_comm.SendAsyncSignal (signo))
2322         error.SetErrorStringWithFormat("failed to send signal %i", signo);
2323     return error;
2324 }
2325 
2326 Error
2327 ProcessGDBRemote::StartDebugserverProcess (const char *debugserver_url)
2328 {
2329     ProcessLaunchInfo launch_info;
2330     return StartDebugserverProcess(debugserver_url, launch_info);
2331 }
2332 
2333 Error
2334 ProcessGDBRemote::StartDebugserverProcess (const char *debugserver_url, const ProcessInfo &process_info)    // The connection string to use in the spawned debugserver ("localhost:1234" or "/dev/tty...")
2335 {
2336     Error error;
2337     if (m_debugserver_pid == LLDB_INVALID_PROCESS_ID)
2338     {
2339         // If we locate debugserver, keep that located version around
2340         static FileSpec g_debugserver_file_spec;
2341 
2342         ProcessLaunchInfo debugserver_launch_info;
2343         char debugserver_path[PATH_MAX];
2344         FileSpec &debugserver_file_spec = debugserver_launch_info.GetExecutableFile();
2345 
2346         // Always check to see if we have an environment override for the path
2347         // to the debugserver to use and use it if we do.
2348         const char *env_debugserver_path = getenv("LLDB_DEBUGSERVER_PATH");
2349         if (env_debugserver_path)
2350             debugserver_file_spec.SetFile (env_debugserver_path, false);
2351         else
2352             debugserver_file_spec = g_debugserver_file_spec;
2353         bool debugserver_exists = debugserver_file_spec.Exists();
2354         if (!debugserver_exists)
2355         {
2356             // The debugserver binary is in the LLDB.framework/Resources
2357             // directory.
2358             if (Host::GetLLDBPath (ePathTypeSupportExecutableDir, debugserver_file_spec))
2359             {
2360                 debugserver_file_spec.GetFilename().SetCString(DEBUGSERVER_BASENAME);
2361                 debugserver_exists = debugserver_file_spec.Exists();
2362                 if (debugserver_exists)
2363                 {
2364                     g_debugserver_file_spec = debugserver_file_spec;
2365                 }
2366                 else
2367                 {
2368                     g_debugserver_file_spec.Clear();
2369                     debugserver_file_spec.Clear();
2370                 }
2371             }
2372         }
2373 
2374         if (debugserver_exists)
2375         {
2376             debugserver_file_spec.GetPath (debugserver_path, sizeof(debugserver_path));
2377 
2378             m_stdio_communication.Clear();
2379 
2380             LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PROCESS));
2381 
2382             Args &debugserver_args = debugserver_launch_info.GetArguments();
2383             char arg_cstr[PATH_MAX];
2384 
2385             // Start args with "debugserver /file/path -r --"
2386             debugserver_args.AppendArgument(debugserver_path);
2387             debugserver_args.AppendArgument(debugserver_url);
2388             // use native registers, not the GDB registers
2389             debugserver_args.AppendArgument("--native-regs");
2390             // make debugserver run in its own session so signals generated by
2391             // special terminal key sequences (^C) don't affect debugserver
2392             debugserver_args.AppendArgument("--setsid");
2393 
2394             const char *env_debugserver_log_file = getenv("LLDB_DEBUGSERVER_LOG_FILE");
2395             if (env_debugserver_log_file)
2396             {
2397                 ::snprintf (arg_cstr, sizeof(arg_cstr), "--log-file=%s", env_debugserver_log_file);
2398                 debugserver_args.AppendArgument(arg_cstr);
2399             }
2400 
2401             const char *env_debugserver_log_flags = getenv("LLDB_DEBUGSERVER_LOG_FLAGS");
2402             if (env_debugserver_log_flags)
2403             {
2404                 ::snprintf (arg_cstr, sizeof(arg_cstr), "--log-flags=%s", env_debugserver_log_flags);
2405                 debugserver_args.AppendArgument(arg_cstr);
2406             }
2407 //            debugserver_args.AppendArgument("--log-file=/tmp/debugserver.txt");
2408 //            debugserver_args.AppendArgument("--log-flags=0x802e0e");
2409 
2410             // We currently send down all arguments, attach pids, or attach
2411             // process names in dedicated GDB server packets, so we don't need
2412             // to pass them as arguments. This is currently because of all the
2413             // things we need to setup prior to launching: the environment,
2414             // current working dir, file actions, etc.
2415 #if 0
2416             // Now append the program arguments
2417             if (inferior_argv)
2418             {
2419                 // Terminate the debugserver args so we can now append the inferior args
2420                 debugserver_args.AppendArgument("--");
2421 
2422                 for (int i = 0; inferior_argv[i] != NULL; ++i)
2423                     debugserver_args.AppendArgument (inferior_argv[i]);
2424             }
2425             else if (attach_pid != LLDB_INVALID_PROCESS_ID)
2426             {
2427                 ::snprintf (arg_cstr, sizeof(arg_cstr), "--attach=%u", attach_pid);
2428                 debugserver_args.AppendArgument (arg_cstr);
2429             }
2430             else if (attach_name && attach_name[0])
2431             {
2432                 if (wait_for_launch)
2433                     debugserver_args.AppendArgument ("--waitfor");
2434                 else
2435                     debugserver_args.AppendArgument ("--attach");
2436                 debugserver_args.AppendArgument (attach_name);
2437             }
2438 #endif
2439 
2440             ProcessLaunchInfo::FileAction file_action;
2441 
2442             // Close STDIN, STDOUT and STDERR. We might need to redirect them
2443             // to "/dev/null" if we run into any problems.
2444             file_action.Close (STDIN_FILENO);
2445             debugserver_launch_info.AppendFileAction (file_action);
2446             file_action.Close (STDOUT_FILENO);
2447             debugserver_launch_info.AppendFileAction (file_action);
2448             file_action.Close (STDERR_FILENO);
2449             debugserver_launch_info.AppendFileAction (file_action);
2450 
2451             if (log)
2452             {
2453                 StreamString strm;
2454                 debugserver_args.Dump (&strm);
2455                 log->Printf("%s arguments:\n%s", debugserver_args.GetArgumentAtIndex(0), strm.GetData());
2456             }
2457 
2458             debugserver_launch_info.SetMonitorProcessCallback (MonitorDebugserverProcess, this, false);
2459             debugserver_launch_info.SetUserID(process_info.GetUserID());
2460 
2461             error = Host::LaunchProcess(debugserver_launch_info);
2462 
2463             if (error.Success ())
2464                 m_debugserver_pid = debugserver_launch_info.GetProcessID();
2465             else
2466                 m_debugserver_pid = LLDB_INVALID_PROCESS_ID;
2467 
2468             if (error.Fail() || log)
2469                 error.PutToLog(log.get(), "Host::LaunchProcess (launch_info) => pid=%llu, path='%s'", m_debugserver_pid, debugserver_path);
2470         }
2471         else
2472         {
2473             error.SetErrorStringWithFormat ("unable to locate " DEBUGSERVER_BASENAME);
2474         }
2475 
2476         if (m_debugserver_pid != LLDB_INVALID_PROCESS_ID)
2477             StartAsyncThread ();
2478     }
2479     return error;
2480 }
2481 
2482 bool
2483 ProcessGDBRemote::MonitorDebugserverProcess
2484 (
2485     void *callback_baton,
2486     lldb::pid_t debugserver_pid,
2487     bool exited,        // True if the process did exit
2488     int signo,          // Zero for no signal
2489     int exit_status     // Exit value of process if signal is zero
2490 )
2491 {
2492     // The baton is a "ProcessGDBRemote *". Now this class might be gone
2493     // and might not exist anymore, so we need to carefully try to get the
2494     // target for this process first since we have a race condition when
2495     // we are done running between getting the notice that the inferior
2496     // process has died and the debugserver that was debugging this process.
2497     // In our test suite, we are also continually running process after
2498     // process, so we must be very careful to make sure:
2499     // 1 - process object hasn't been deleted already
2500     // 2 - that a new process object hasn't been recreated in its place
2501 
2502     // "debugserver_pid" argument passed in is the process ID for
2503     // debugserver that we are tracking...
2504     LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_PROCESS));
2505 
2506     ProcessGDBRemote *process = (ProcessGDBRemote *)callback_baton;
2507 
2508     // Get a shared pointer to the target that has a matching process pointer.
2509     // This target could be gone, or the target could already have a new process
2510     // object inside of it
2511     TargetSP target_sp (Debugger::FindTargetWithProcess(process));
2512 
2513     if (log)
2514         log->Printf ("ProcessGDBRemote::MonitorDebugserverProcess (baton=%p, pid=%llu, signo=%i (0x%x), exit_status=%i)", callback_baton, debugserver_pid, signo, signo, exit_status);
2515 
2516     if (target_sp)
2517     {
2518         // We found a process in a target that matches, but another thread
2519         // might be in the process of launching a new process that will
2520         // soon replace it, so get a shared pointer to the process so we
2521         // can keep it alive.
2522         ProcessSP process_sp (target_sp->GetProcessSP());
2523         // Now we have a shared pointer to the process that can't go away on us
2524         // so we now make sure it was the same as the one passed in, and also make
2525         // sure that our previous "process *" didn't get deleted and have a new
2526         // "process *" created in its place with the same pointer. To verify this
2527         // we make sure the process has our debugserver process ID. If we pass all
2528         // of these tests, then we are sure that this process is the one we were
2529         // looking for.
2530         if (process_sp && process == process_sp.get() && process->m_debugserver_pid == debugserver_pid)
2531         {
2532             // Sleep for a half a second to make sure our inferior process has
2533             // time to set its exit status before we set it incorrectly when
2534             // both the debugserver and the inferior process shut down.
2535             usleep (500000);
2536             // If our process hasn't yet exited, debugserver might have died.
2537             // If the process did exit, the we are reaping it.
2538             const StateType state = process->GetState();
2539 
2540             if (process->m_debugserver_pid != LLDB_INVALID_PROCESS_ID &&
2541                 state != eStateInvalid &&
2542                 state != eStateUnloaded &&
2543                 state != eStateExited &&
2544                 state != eStateDetached)
2545             {
2546                 char error_str[1024];
2547                 if (signo)
2548                 {
2549                     const char *signal_cstr = process->GetUnixSignals().GetSignalAsCString (signo);
2550                     if (signal_cstr)
2551                         ::snprintf (error_str, sizeof (error_str), DEBUGSERVER_BASENAME " died with signal %s", signal_cstr);
2552                     else
2553                         ::snprintf (error_str, sizeof (error_str), DEBUGSERVER_BASENAME " died with signal %i", signo);
2554                 }
2555                 else
2556                 {
2557                     ::snprintf (error_str, sizeof (error_str), DEBUGSERVER_BASENAME " died with an exit status of 0x%8.8x", exit_status);
2558                 }
2559 
2560                 process->SetExitStatus (-1, error_str);
2561             }
2562             // Debugserver has exited we need to let our ProcessGDBRemote
2563             // know that it no longer has a debugserver instance
2564             process->m_debugserver_pid = LLDB_INVALID_PROCESS_ID;
2565         }
2566     }
2567     return true;
2568 }
2569 
2570 void
2571 ProcessGDBRemote::KillDebugserverProcess ()
2572 {
2573     if (m_debugserver_pid != LLDB_INVALID_PROCESS_ID)
2574     {
2575         ::kill (m_debugserver_pid, SIGINT);
2576         m_debugserver_pid = LLDB_INVALID_PROCESS_ID;
2577     }
2578 }
2579 
2580 void
2581 ProcessGDBRemote::Initialize()
2582 {
2583     static bool g_initialized = false;
2584 
2585     if (g_initialized == false)
2586     {
2587         g_initialized = true;
2588         PluginManager::RegisterPlugin (GetPluginNameStatic(),
2589                                        GetPluginDescriptionStatic(),
2590                                        CreateInstance);
2591 
2592         Log::Callbacks log_callbacks = {
2593             ProcessGDBRemoteLog::DisableLog,
2594             ProcessGDBRemoteLog::EnableLog,
2595             ProcessGDBRemoteLog::ListLogCategories
2596         };
2597 
2598         Log::RegisterLogChannel (ProcessGDBRemote::GetPluginNameStatic(), log_callbacks);
2599     }
2600 }
2601 
2602 bool
2603 ProcessGDBRemote::StartAsyncThread ()
2604 {
2605     LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_PROCESS));
2606 
2607     if (log)
2608         log->Printf ("ProcessGDBRemote::%s ()", __FUNCTION__);
2609 
2610     // Create a thread that watches our internal state and controls which
2611     // events make it to clients (into the DCProcess event queue).
2612     m_async_thread = Host::ThreadCreate ("<lldb.process.gdb-remote.async>", ProcessGDBRemote::AsyncThread, this, NULL);
2613     return IS_VALID_LLDB_HOST_THREAD(m_async_thread);
2614 }
2615 
2616 void
2617 ProcessGDBRemote::StopAsyncThread ()
2618 {
2619     LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_PROCESS));
2620 
2621     if (log)
2622         log->Printf ("ProcessGDBRemote::%s ()", __FUNCTION__);
2623 
2624     m_async_broadcaster.BroadcastEvent (eBroadcastBitAsyncThreadShouldExit);
2625 
2626     //  This will shut down the async thread.
2627     m_gdb_comm.Disconnect();    // Disconnect from the debug server.
2628 
2629     // Stop the stdio thread
2630     if (IS_VALID_LLDB_HOST_THREAD(m_async_thread))
2631     {
2632         Host::ThreadJoin (m_async_thread, NULL, NULL);
2633     }
2634 }
2635 
2636 
2637 void *
2638 ProcessGDBRemote::AsyncThread (void *arg)
2639 {
2640     ProcessGDBRemote *process = (ProcessGDBRemote*) arg;
2641 
2642     LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PROCESS));
2643     if (log)
2644         log->Printf ("ProcessGDBRemote::%s (arg = %p, pid = %llu) thread starting...", __FUNCTION__, arg, process->GetID());
2645 
2646     Listener listener ("ProcessGDBRemote::AsyncThread");
2647     EventSP event_sp;
2648     const uint32_t desired_event_mask = eBroadcastBitAsyncContinue |
2649                                         eBroadcastBitAsyncThreadShouldExit;
2650 
2651     if (listener.StartListeningForEvents (&process->m_async_broadcaster, desired_event_mask) == desired_event_mask)
2652     {
2653         listener.StartListeningForEvents (&process->m_gdb_comm, Communication::eBroadcastBitReadThreadDidExit);
2654 
2655         bool done = false;
2656         while (!done)
2657         {
2658             if (log)
2659                 log->Printf ("ProcessGDBRemote::%s (arg = %p, pid = %llu) listener.WaitForEvent (NULL, event_sp)...", __FUNCTION__, arg, process->GetID());
2660             if (listener.WaitForEvent (NULL, event_sp))
2661             {
2662                 const uint32_t event_type = event_sp->GetType();
2663                 if (event_sp->BroadcasterIs (&process->m_async_broadcaster))
2664                 {
2665                     if (log)
2666                         log->Printf ("ProcessGDBRemote::%s (arg = %p, pid = %llu) Got an event of type: %d...", __FUNCTION__, arg, process->GetID(), event_type);
2667 
2668                     switch (event_type)
2669                     {
2670                         case eBroadcastBitAsyncContinue:
2671                             {
2672                                 const EventDataBytes *continue_packet = EventDataBytes::GetEventDataFromEvent(event_sp.get());
2673 
2674                                 if (continue_packet)
2675                                 {
2676                                     const char *continue_cstr = (const char *)continue_packet->GetBytes ();
2677                                     const size_t continue_cstr_len = continue_packet->GetByteSize ();
2678                                     if (log)
2679                                         log->Printf ("ProcessGDBRemote::%s (arg = %p, pid = %llu) got eBroadcastBitAsyncContinue: %s", __FUNCTION__, arg, process->GetID(), continue_cstr);
2680 
2681                                     if (::strstr (continue_cstr, "vAttach") == NULL)
2682                                         process->SetPrivateState(eStateRunning);
2683                                     StringExtractorGDBRemote response;
2684                                     StateType stop_state = process->GetGDBRemote().SendContinuePacketAndWaitForResponse (process, continue_cstr, continue_cstr_len, response);
2685 
2686                                     // We need to immediately clear the thread ID list so we are sure to get a valid list of threads.
2687                                     // The thread ID list might be contained within the "response", or the stop reply packet that
2688                                     // caused the stop. So clear it now before we give the stop reply packet to the process
2689                                     // using the process->SetLastStopPacket()...
2690                                     process->ClearThreadIDList ();
2691 
2692                                     switch (stop_state)
2693                                     {
2694                                     case eStateStopped:
2695                                     case eStateCrashed:
2696                                     case eStateSuspended:
2697                                         process->SetLastStopPacket (response);
2698                                         process->SetPrivateState (stop_state);
2699                                         break;
2700 
2701                                     case eStateExited:
2702                                         process->SetLastStopPacket (response);
2703                                         process->ClearThreadIDList();
2704                                         response.SetFilePos(1);
2705                                         process->SetExitStatus(response.GetHexU8(), NULL);
2706                                         done = true;
2707                                         break;
2708 
2709                                     case eStateInvalid:
2710                                         process->SetExitStatus(-1, "lost connection");
2711                                         break;
2712 
2713                                     default:
2714                                         process->SetPrivateState (stop_state);
2715                                         break;
2716                                     }
2717                                 }
2718                             }
2719                             break;
2720 
2721                         case eBroadcastBitAsyncThreadShouldExit:
2722                             if (log)
2723                                 log->Printf ("ProcessGDBRemote::%s (arg = %p, pid = %llu) got eBroadcastBitAsyncThreadShouldExit...", __FUNCTION__, arg, process->GetID());
2724                             done = true;
2725                             break;
2726 
2727                         default:
2728                             if (log)
2729                                 log->Printf ("ProcessGDBRemote::%s (arg = %p, pid = %llu) got unknown event 0x%8.8x", __FUNCTION__, arg, process->GetID(), event_type);
2730                             done = true;
2731                             break;
2732                     }
2733                 }
2734                 else if (event_sp->BroadcasterIs (&process->m_gdb_comm))
2735                 {
2736                     if (event_type & Communication::eBroadcastBitReadThreadDidExit)
2737                     {
2738                         process->SetExitStatus (-1, "lost connection");
2739                         done = true;
2740                     }
2741                 }
2742             }
2743             else
2744             {
2745                 if (log)
2746                     log->Printf ("ProcessGDBRemote::%s (arg = %p, pid = %llu) listener.WaitForEvent (NULL, event_sp) => false", __FUNCTION__, arg, process->GetID());
2747                 done = true;
2748             }
2749         }
2750     }
2751 
2752     if (log)
2753         log->Printf ("ProcessGDBRemote::%s (arg = %p, pid = %llu) thread exiting...", __FUNCTION__, arg, process->GetID());
2754 
2755     process->m_async_thread = LLDB_INVALID_HOST_THREAD;
2756     return NULL;
2757 }
2758 
2759 const char *
2760 ProcessGDBRemote::GetDispatchQueueNameForThread
2761 (
2762     addr_t thread_dispatch_qaddr,
2763     std::string &dispatch_queue_name
2764 )
2765 {
2766     dispatch_queue_name.clear();
2767     if (thread_dispatch_qaddr != 0 && thread_dispatch_qaddr != LLDB_INVALID_ADDRESS)
2768     {
2769         // Cache the dispatch_queue_offsets_addr value so we don't always have
2770         // to look it up
2771         if (m_dispatch_queue_offsets_addr == LLDB_INVALID_ADDRESS)
2772         {
2773             static ConstString g_dispatch_queue_offsets_symbol_name ("dispatch_queue_offsets");
2774             const Symbol *dispatch_queue_offsets_symbol = NULL;
2775             ModuleSpec libSystem_module_spec (FileSpec("libSystem.B.dylib", false));
2776             ModuleSP module_sp(GetTarget().GetImages().FindFirstModule (libSystem_module_spec));
2777             if (module_sp)
2778                 dispatch_queue_offsets_symbol = module_sp->FindFirstSymbolWithNameAndType (g_dispatch_queue_offsets_symbol_name, eSymbolTypeData);
2779 
2780             if (dispatch_queue_offsets_symbol == NULL)
2781             {
2782                 ModuleSpec libdispatch_module_spec (FileSpec("libdispatch.dylib", false));
2783                 module_sp = GetTarget().GetImages().FindFirstModule (libdispatch_module_spec);
2784                 if (module_sp)
2785                     dispatch_queue_offsets_symbol = module_sp->FindFirstSymbolWithNameAndType (g_dispatch_queue_offsets_symbol_name, eSymbolTypeData);
2786             }
2787             if (dispatch_queue_offsets_symbol)
2788                 m_dispatch_queue_offsets_addr = dispatch_queue_offsets_symbol->GetAddress().GetLoadAddress(&m_target);
2789 
2790             if (m_dispatch_queue_offsets_addr == LLDB_INVALID_ADDRESS)
2791                 return NULL;
2792         }
2793 
2794         uint8_t memory_buffer[8];
2795         DataExtractor data (memory_buffer,
2796                             sizeof(memory_buffer),
2797                             m_target.GetArchitecture().GetByteOrder(),
2798                             m_target.GetArchitecture().GetAddressByteSize());
2799 
2800         // Excerpt from src/queue_private.h
2801         struct dispatch_queue_offsets_s
2802         {
2803             uint16_t dqo_version;
2804             uint16_t dqo_label;
2805             uint16_t dqo_label_size;
2806         } dispatch_queue_offsets;
2807 
2808 
2809         Error error;
2810         if (ReadMemory (m_dispatch_queue_offsets_addr, memory_buffer, sizeof(dispatch_queue_offsets), error) == sizeof(dispatch_queue_offsets))
2811         {
2812             uint32_t data_offset = 0;
2813             if (data.GetU16(&data_offset, &dispatch_queue_offsets.dqo_version, sizeof(dispatch_queue_offsets)/sizeof(uint16_t)))
2814             {
2815                 if (ReadMemory (thread_dispatch_qaddr, &memory_buffer, data.GetAddressByteSize(), error) == data.GetAddressByteSize())
2816                 {
2817                     data_offset = 0;
2818                     lldb::addr_t queue_addr = data.GetAddress(&data_offset);
2819                     lldb::addr_t label_addr = queue_addr + dispatch_queue_offsets.dqo_label;
2820                     dispatch_queue_name.resize(dispatch_queue_offsets.dqo_label_size, '\0');
2821                     size_t bytes_read = ReadMemory (label_addr, &dispatch_queue_name[0], dispatch_queue_offsets.dqo_label_size, error);
2822                     if (bytes_read < dispatch_queue_offsets.dqo_label_size)
2823                         dispatch_queue_name.erase (bytes_read);
2824                 }
2825             }
2826         }
2827     }
2828     if (dispatch_queue_name.empty())
2829         return NULL;
2830     return dispatch_queue_name.c_str();
2831 }
2832 
2833 //uint32_t
2834 //ProcessGDBRemote::ListProcessesMatchingName (const char *name, StringList &matches, std::vector<lldb::pid_t> &pids)
2835 //{
2836 //    // If we are planning to launch the debugserver remotely, then we need to fire up a debugserver
2837 //    // process and ask it for the list of processes. But if we are local, we can let the Host do it.
2838 //    if (m_local_debugserver)
2839 //    {
2840 //        return Host::ListProcessesMatchingName (name, matches, pids);
2841 //    }
2842 //    else
2843 //    {
2844 //        // FIXME: Implement talking to the remote debugserver.
2845 //        return 0;
2846 //    }
2847 //
2848 //}
2849 //
2850 bool
2851 ProcessGDBRemote::NewThreadNotifyBreakpointHit (void *baton,
2852                              lldb_private::StoppointCallbackContext *context,
2853                              lldb::user_id_t break_id,
2854                              lldb::user_id_t break_loc_id)
2855 {
2856     // I don't think I have to do anything here, just make sure I notice the new thread when it starts to
2857     // run so I can stop it if that's what I want to do.
2858     LogSP log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP));
2859     if (log)
2860         log->Printf("Hit New Thread Notification breakpoint.");
2861     return false;
2862 }
2863 
2864 
2865 bool
2866 ProcessGDBRemote::StartNoticingNewThreads()
2867 {
2868     LogSP log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP));
2869     if (m_thread_create_bp_sp)
2870     {
2871         if (log && log->GetVerbose())
2872             log->Printf("Enabled noticing new thread breakpoint.");
2873         m_thread_create_bp_sp->SetEnabled(true);
2874     }
2875     else
2876     {
2877         PlatformSP platform_sp (m_target.GetPlatform());
2878         if (platform_sp)
2879         {
2880             m_thread_create_bp_sp = platform_sp->SetThreadCreationBreakpoint(m_target);
2881             if (m_thread_create_bp_sp)
2882             {
2883                 if (log && log->GetVerbose())
2884                     log->Printf("Successfully created new thread notification breakpoint %i", m_thread_create_bp_sp->GetID());
2885                 m_thread_create_bp_sp->SetCallback (ProcessGDBRemote::NewThreadNotifyBreakpointHit, this, true);
2886             }
2887             else
2888             {
2889                 if (log)
2890                     log->Printf("Failed to create new thread notification breakpoint.");
2891             }
2892         }
2893     }
2894     return m_thread_create_bp_sp.get() != NULL;
2895 }
2896 
2897 bool
2898 ProcessGDBRemote::StopNoticingNewThreads()
2899 {
2900     LogSP log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP));
2901     if (log && log->GetVerbose())
2902         log->Printf ("Disabling new thread notification breakpoint.");
2903 
2904     if (m_thread_create_bp_sp)
2905         m_thread_create_bp_sp->SetEnabled(false);
2906 
2907     return true;
2908 }
2909 
2910 
2911