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 #include "lldb/lldb-python.h"
11 #include "lldb/Host/Config.h"
12 
13 // C Includes
14 #include <errno.h>
15 #include <stdlib.h>
16 #ifndef LLDB_DISABLE_POSIX
17 #include <spawn.h>
18 #include <netinet/in.h>
19 #include <sys/mman.h>       // for mmap
20 #endif
21 #include <sys/stat.h>
22 #include <sys/types.h>
23 #include <time.h>
24 
25 // C++ Includes
26 #include <algorithm>
27 #include <map>
28 
29 // Other libraries and framework includes
30 
31 #include "lldb/Breakpoint/Watchpoint.h"
32 #include "lldb/Interpreter/Args.h"
33 #include "lldb/Core/ArchSpec.h"
34 #include "lldb/Core/Debugger.h"
35 #include "lldb/Core/ConnectionFileDescriptor.h"
36 #include "lldb/Host/FileSpec.h"
37 #include "lldb/Core/Module.h"
38 #include "lldb/Core/ModuleSpec.h"
39 #include "lldb/Core/PluginManager.h"
40 #include "lldb/Core/State.h"
41 #include "lldb/Core/StreamFile.h"
42 #include "lldb/Core/StreamString.h"
43 #include "lldb/Core/Timer.h"
44 #include "lldb/Core/Value.h"
45 #include "lldb/Host/Symbols.h"
46 #include "lldb/Host/TimeValue.h"
47 #include "lldb/Interpreter/CommandInterpreter.h"
48 #include "lldb/Interpreter/CommandObject.h"
49 #include "lldb/Interpreter/CommandObjectMultiword.h"
50 #include "lldb/Interpreter/CommandReturnObject.h"
51 #ifndef LLDB_DISABLE_PYTHON
52 #include "lldb/Interpreter/PythonDataObjects.h"
53 #endif
54 #include "lldb/Symbol/ObjectFile.h"
55 #include "lldb/Target/DynamicLoader.h"
56 #include "lldb/Target/Target.h"
57 #include "lldb/Target/TargetList.h"
58 #include "lldb/Target/ThreadPlanCallFunction.h"
59 #include "lldb/Target/SystemRuntime.h"
60 #include "lldb/Utility/PseudoTerminal.h"
61 
62 // Project includes
63 #include "lldb/Host/Host.h"
64 #include "Plugins/Process/Utility/FreeBSDSignals.h"
65 #include "Plugins/Process/Utility/InferiorCallPOSIX.h"
66 #include "Plugins/Process/Utility/LinuxSignals.h"
67 #include "Plugins/Process/Utility/StopInfoMachException.h"
68 #include "Plugins/Platform/MacOSX/PlatformRemoteiOS.h"
69 #include "Utility/StringExtractorGDBRemote.h"
70 #include "GDBRemoteRegisterContext.h"
71 #include "ProcessGDBRemote.h"
72 #include "ProcessGDBRemoteLog.h"
73 #include "ThreadGDBRemote.h"
74 
75 
76 namespace lldb
77 {
78     // Provide a function that can easily dump the packet history if we know a
79     // ProcessGDBRemote * value (which we can get from logs or from debugging).
80     // We need the function in the lldb namespace so it makes it into the final
81     // executable since the LLDB shared library only exports stuff in the lldb
82     // namespace. This allows you to attach with a debugger and call this
83     // function and get the packet history dumped to a file.
84     void
85     DumpProcessGDBRemotePacketHistory (void *p, const char *path)
86     {
87         lldb_private::StreamFile strm;
88         lldb_private::Error error (strm.GetFile().Open(path, lldb_private::File::eOpenOptionWrite | lldb_private::File::eOpenOptionCanCreate));
89         if (error.Success())
90             ((ProcessGDBRemote *)p)->GetGDBRemote().DumpHistory (strm);
91     }
92 }
93 
94 #define DEBUGSERVER_BASENAME    "debugserver"
95 using namespace lldb;
96 using namespace lldb_private;
97 
98 
99 namespace {
100 
101     static PropertyDefinition
102     g_properties[] =
103     {
104         { "packet-timeout" , OptionValue::eTypeUInt64 , true , 1, NULL, NULL, "Specify the default packet timeout in seconds." },
105         { "target-definition-file" , OptionValue::eTypeFileSpec , true, 0 , NULL, NULL, "The file that provides the description for remote target registers." },
106         {  NULL            , OptionValue::eTypeInvalid, false, 0, NULL, NULL, NULL  }
107     };
108 
109     enum
110     {
111         ePropertyPacketTimeout,
112         ePropertyTargetDefinitionFile
113     };
114 
115     class PluginProperties : public Properties
116     {
117     public:
118 
119         static ConstString
120         GetSettingName ()
121         {
122             return ProcessGDBRemote::GetPluginNameStatic();
123         }
124 
125         PluginProperties() :
126         Properties ()
127         {
128             m_collection_sp.reset (new OptionValueProperties(GetSettingName()));
129             m_collection_sp->Initialize(g_properties);
130         }
131 
132         virtual
133         ~PluginProperties()
134         {
135         }
136 
137         uint64_t
138         GetPacketTimeout()
139         {
140             const uint32_t idx = ePropertyPacketTimeout;
141             return m_collection_sp->GetPropertyAtIndexAsUInt64(NULL, idx, g_properties[idx].default_uint_value);
142         }
143 
144         bool
145         SetPacketTimeout(uint64_t timeout)
146         {
147             const uint32_t idx = ePropertyPacketTimeout;
148             return m_collection_sp->SetPropertyAtIndexAsUInt64(NULL, idx, timeout);
149         }
150 
151         FileSpec
152         GetTargetDefinitionFile () const
153         {
154             const uint32_t idx = ePropertyTargetDefinitionFile;
155             return m_collection_sp->GetPropertyAtIndexAsFileSpec (NULL, idx);
156         }
157     };
158 
159     typedef std::shared_ptr<PluginProperties> ProcessKDPPropertiesSP;
160 
161     static const ProcessKDPPropertiesSP &
162     GetGlobalPluginProperties()
163     {
164         static ProcessKDPPropertiesSP g_settings_sp;
165         if (!g_settings_sp)
166             g_settings_sp.reset (new PluginProperties ());
167         return g_settings_sp;
168     }
169 
170 } // anonymous namespace end
171 
172 // TODO Randomly assigning a port is unsafe.  We should get an unused
173 // ephemeral port from the kernel and make sure we reserve it before passing
174 // it to debugserver.
175 
176 #if defined (__APPLE__)
177 #define LOW_PORT    (IPPORT_RESERVED)
178 #define HIGH_PORT   (IPPORT_HIFIRSTAUTO)
179 #else
180 #define LOW_PORT    (1024u)
181 #define HIGH_PORT   (49151u)
182 #endif
183 
184 #if defined(__APPLE__) && (defined(__arm__) || defined(__arm64__) || defined(__aarch64__))
185 static bool rand_initialized = false;
186 
187 static inline uint16_t
188 get_random_port ()
189 {
190     if (!rand_initialized)
191     {
192         time_t seed = time(NULL);
193 
194         rand_initialized = true;
195         srand(seed);
196     }
197     return (rand() % (HIGH_PORT - LOW_PORT)) + LOW_PORT;
198 }
199 #endif
200 
201 lldb_private::ConstString
202 ProcessGDBRemote::GetPluginNameStatic()
203 {
204     static ConstString g_name("gdb-remote");
205     return g_name;
206 }
207 
208 const char *
209 ProcessGDBRemote::GetPluginDescriptionStatic()
210 {
211     return "GDB Remote protocol based debugging plug-in.";
212 }
213 
214 void
215 ProcessGDBRemote::Terminate()
216 {
217     PluginManager::UnregisterPlugin (ProcessGDBRemote::CreateInstance);
218 }
219 
220 
221 lldb::ProcessSP
222 ProcessGDBRemote::CreateInstance (Target &target, Listener &listener, const FileSpec *crash_file_path)
223 {
224     lldb::ProcessSP process_sp;
225     if (crash_file_path == NULL)
226         process_sp.reset (new ProcessGDBRemote (target, listener));
227     return process_sp;
228 }
229 
230 bool
231 ProcessGDBRemote::CanDebug (Target &target, bool plugin_specified_by_name)
232 {
233     if (plugin_specified_by_name)
234         return true;
235 
236     // For now we are just making sure the file exists for a given module
237     Module *exe_module = target.GetExecutableModulePointer();
238     if (exe_module)
239     {
240         ObjectFile *exe_objfile = exe_module->GetObjectFile();
241         // We can't debug core files...
242         switch (exe_objfile->GetType())
243         {
244             case ObjectFile::eTypeInvalid:
245             case ObjectFile::eTypeCoreFile:
246             case ObjectFile::eTypeDebugInfo:
247             case ObjectFile::eTypeObjectFile:
248             case ObjectFile::eTypeSharedLibrary:
249             case ObjectFile::eTypeStubLibrary:
250             case ObjectFile::eTypeJIT:
251                 return false;
252             case ObjectFile::eTypeExecutable:
253             case ObjectFile::eTypeDynamicLinker:
254             case ObjectFile::eTypeUnknown:
255                 break;
256         }
257         return exe_module->GetFileSpec().Exists();
258     }
259     // However, if there is no executable module, we return true since we might be preparing to attach.
260     return true;
261 }
262 
263 //----------------------------------------------------------------------
264 // ProcessGDBRemote constructor
265 //----------------------------------------------------------------------
266 ProcessGDBRemote::ProcessGDBRemote(Target& target, Listener &listener) :
267     Process (target, listener),
268     m_flags (0),
269     m_gdb_comm(false),
270     m_debugserver_pid (LLDB_INVALID_PROCESS_ID),
271     m_last_stop_packet (),
272     m_last_stop_packet_mutex (Mutex::eMutexTypeNormal),
273     m_register_info (),
274     m_async_broadcaster (NULL, "lldb.process.gdb-remote.async-broadcaster"),
275     m_async_thread (LLDB_INVALID_HOST_THREAD),
276     m_async_thread_state(eAsyncThreadNotStarted),
277     m_async_thread_state_mutex(Mutex::eMutexTypeRecursive),
278     m_thread_ids (),
279     m_continue_c_tids (),
280     m_continue_C_tids (),
281     m_continue_s_tids (),
282     m_continue_S_tids (),
283     m_max_memory_size (0),
284     m_remote_stub_max_memory_size (0),
285     m_addr_to_mmap_size (),
286     m_thread_create_bp_sp (),
287     m_waiting_for_attach (false),
288     m_destroy_tried_resuming (false),
289     m_command_sp (),
290     m_breakpoint_pc_offset (0),
291     m_unix_signals_sp (new UnixSignals ())
292 {
293     m_async_broadcaster.SetEventName (eBroadcastBitAsyncThreadShouldExit,   "async thread should exit");
294     m_async_broadcaster.SetEventName (eBroadcastBitAsyncContinue,           "async thread continue");
295     m_async_broadcaster.SetEventName (eBroadcastBitAsyncThreadDidExit,      "async thread did exit");
296     const uint64_t timeout_seconds = GetGlobalPluginProperties()->GetPacketTimeout();
297     if (timeout_seconds > 0)
298         m_gdb_comm.SetPacketTimeout(timeout_seconds);
299 }
300 
301 //----------------------------------------------------------------------
302 // Destructor
303 //----------------------------------------------------------------------
304 ProcessGDBRemote::~ProcessGDBRemote()
305 {
306     //  m_mach_process.UnregisterNotificationCallbacks (this);
307     Clear();
308     // We need to call finalize on the process before destroying ourselves
309     // to make sure all of the broadcaster cleanup goes as planned. If we
310     // destruct this class, then Process::~Process() might have problems
311     // trying to fully destroy the broadcaster.
312     Finalize();
313 
314     // The general Finalize is going to try to destroy the process and that SHOULD
315     // shut down the async thread.  However, if we don't kill it it will get stranded and
316     // its connection will go away so when it wakes up it will crash.  So kill it for sure here.
317     StopAsyncThread();
318     KillDebugserverProcess();
319 }
320 
321 //----------------------------------------------------------------------
322 // PluginInterface
323 //----------------------------------------------------------------------
324 ConstString
325 ProcessGDBRemote::GetPluginName()
326 {
327     return GetPluginNameStatic();
328 }
329 
330 uint32_t
331 ProcessGDBRemote::GetPluginVersion()
332 {
333     return 1;
334 }
335 
336 bool
337 ProcessGDBRemote::ParsePythonTargetDefinition(const FileSpec &target_definition_fspec)
338 {
339 #ifndef LLDB_DISABLE_PYTHON
340     ScriptInterpreter *interpreter = GetTarget().GetDebugger().GetCommandInterpreter().GetScriptInterpreter();
341     Error error;
342     lldb::ScriptInterpreterObjectSP module_object_sp (interpreter->LoadPluginModule(target_definition_fspec, error));
343     if (module_object_sp)
344     {
345         lldb::ScriptInterpreterObjectSP target_definition_sp (interpreter->GetDynamicSettings(module_object_sp,
346                                                                                               &GetTarget(),
347                                                                                               "gdb-server-target-definition",
348                                                                                               error));
349 
350         PythonDictionary target_dict(target_definition_sp);
351 
352         if (target_dict)
353         {
354             PythonDictionary host_info_dict (target_dict.GetItemForKey("host-info"));
355             if (host_info_dict)
356             {
357                 ArchSpec host_arch (host_info_dict.GetItemForKeyAsString(PythonString("triple")));
358 
359                 if (!host_arch.IsCompatibleMatch(GetTarget().GetArchitecture()))
360                 {
361                     GetTarget().SetArchitecture(host_arch);
362                 }
363 
364             }
365             m_breakpoint_pc_offset = target_dict.GetItemForKeyAsInteger("breakpoint-pc-offset", 0);
366 
367             if (m_register_info.SetRegisterInfo (target_dict, GetTarget().GetArchitecture().GetByteOrder()) > 0)
368             {
369                 return true;
370             }
371         }
372     }
373 #endif
374     return false;
375 }
376 
377 
378 void
379 ProcessGDBRemote::BuildDynamicRegisterInfo (bool force)
380 {
381     if (!force && m_register_info.GetNumRegisters() > 0)
382         return;
383 
384     char packet[128];
385     m_register_info.Clear();
386     uint32_t reg_offset = 0;
387     uint32_t reg_num = 0;
388     for (StringExtractorGDBRemote::ResponseType response_type = StringExtractorGDBRemote::eResponse;
389          response_type == StringExtractorGDBRemote::eResponse;
390          ++reg_num)
391     {
392         const int packet_len = ::snprintf (packet, sizeof(packet), "qRegisterInfo%x", reg_num);
393         assert (packet_len < (int)sizeof(packet));
394         StringExtractorGDBRemote response;
395         if (m_gdb_comm.SendPacketAndWaitForResponse(packet, packet_len, response, false) == GDBRemoteCommunication::PacketResult::Success)
396         {
397             response_type = response.GetResponseType();
398             if (response_type == StringExtractorGDBRemote::eResponse)
399             {
400                 std::string name;
401                 std::string value;
402                 ConstString reg_name;
403                 ConstString alt_name;
404                 ConstString set_name;
405                 std::vector<uint32_t> value_regs;
406                 std::vector<uint32_t> invalidate_regs;
407                 RegisterInfo reg_info = { NULL,                 // Name
408                     NULL,                 // Alt name
409                     0,                    // byte size
410                     reg_offset,           // offset
411                     eEncodingUint,        // encoding
412                     eFormatHex,           // formate
413                     {
414                         LLDB_INVALID_REGNUM, // GCC reg num
415                         LLDB_INVALID_REGNUM, // DWARF reg num
416                         LLDB_INVALID_REGNUM, // generic reg num
417                         reg_num,             // GDB reg num
418                         reg_num           // native register number
419                     },
420                     NULL,
421                     NULL
422                 };
423 
424                 while (response.GetNameColonValue(name, value))
425                 {
426                     if (name.compare("name") == 0)
427                     {
428                         reg_name.SetCString(value.c_str());
429                     }
430                     else if (name.compare("alt-name") == 0)
431                     {
432                         alt_name.SetCString(value.c_str());
433                     }
434                     else if (name.compare("bitsize") == 0)
435                     {
436                         reg_info.byte_size = Args::StringToUInt32(value.c_str(), 0, 0) / CHAR_BIT;
437                     }
438                     else if (name.compare("offset") == 0)
439                     {
440                         uint32_t offset = Args::StringToUInt32(value.c_str(), UINT32_MAX, 0);
441                         if (reg_offset != offset)
442                         {
443                             reg_offset = offset;
444                         }
445                     }
446                     else if (name.compare("encoding") == 0)
447                     {
448                         const Encoding encoding = Args::StringToEncoding (value.c_str());
449                         if (encoding != eEncodingInvalid)
450                             reg_info.encoding = encoding;
451                     }
452                     else if (name.compare("format") == 0)
453                     {
454                         Format format = eFormatInvalid;
455                         if (Args::StringToFormat (value.c_str(), format, NULL).Success())
456                             reg_info.format = format;
457                         else if (value.compare("binary") == 0)
458                             reg_info.format = eFormatBinary;
459                         else if (value.compare("decimal") == 0)
460                             reg_info.format = eFormatDecimal;
461                         else if (value.compare("hex") == 0)
462                             reg_info.format = eFormatHex;
463                         else if (value.compare("float") == 0)
464                             reg_info.format = eFormatFloat;
465                         else if (value.compare("vector-sint8") == 0)
466                             reg_info.format = eFormatVectorOfSInt8;
467                         else if (value.compare("vector-uint8") == 0)
468                             reg_info.format = eFormatVectorOfUInt8;
469                         else if (value.compare("vector-sint16") == 0)
470                             reg_info.format = eFormatVectorOfSInt16;
471                         else if (value.compare("vector-uint16") == 0)
472                             reg_info.format = eFormatVectorOfUInt16;
473                         else if (value.compare("vector-sint32") == 0)
474                             reg_info.format = eFormatVectorOfSInt32;
475                         else if (value.compare("vector-uint32") == 0)
476                             reg_info.format = eFormatVectorOfUInt32;
477                         else if (value.compare("vector-float32") == 0)
478                             reg_info.format = eFormatVectorOfFloat32;
479                         else if (value.compare("vector-uint128") == 0)
480                             reg_info.format = eFormatVectorOfUInt128;
481                     }
482                     else if (name.compare("set") == 0)
483                     {
484                         set_name.SetCString(value.c_str());
485                     }
486                     else if (name.compare("gcc") == 0)
487                     {
488                         reg_info.kinds[eRegisterKindGCC] = Args::StringToUInt32(value.c_str(), LLDB_INVALID_REGNUM, 0);
489                     }
490                     else if (name.compare("dwarf") == 0)
491                     {
492                         reg_info.kinds[eRegisterKindDWARF] = Args::StringToUInt32(value.c_str(), LLDB_INVALID_REGNUM, 0);
493                     }
494                     else if (name.compare("generic") == 0)
495                     {
496                         reg_info.kinds[eRegisterKindGeneric] = Args::StringToGenericRegister (value.c_str());
497                     }
498                     else if (name.compare("container-regs") == 0)
499                     {
500                         std::pair<llvm::StringRef, llvm::StringRef> value_pair;
501                         value_pair.second = value;
502                         do
503                         {
504                             value_pair = value_pair.second.split(',');
505                             if (!value_pair.first.empty())
506                             {
507                                 uint32_t reg = Args::StringToUInt32 (value_pair.first.str().c_str(), LLDB_INVALID_REGNUM, 16);
508                                 if (reg != LLDB_INVALID_REGNUM)
509                                     value_regs.push_back (reg);
510                             }
511                         } while (!value_pair.second.empty());
512                     }
513                     else if (name.compare("invalidate-regs") == 0)
514                     {
515                         std::pair<llvm::StringRef, llvm::StringRef> value_pair;
516                         value_pair.second = value;
517                         do
518                         {
519                             value_pair = value_pair.second.split(',');
520                             if (!value_pair.first.empty())
521                             {
522                                 uint32_t reg = Args::StringToUInt32 (value_pair.first.str().c_str(), LLDB_INVALID_REGNUM, 16);
523                                 if (reg != LLDB_INVALID_REGNUM)
524                                     invalidate_regs.push_back (reg);
525                             }
526                         } while (!value_pair.second.empty());
527                     }
528                 }
529 
530                 reg_info.byte_offset = reg_offset;
531                 assert (reg_info.byte_size != 0);
532                 reg_offset += reg_info.byte_size;
533                 if (!value_regs.empty())
534                 {
535                     value_regs.push_back(LLDB_INVALID_REGNUM);
536                     reg_info.value_regs = value_regs.data();
537                 }
538                 if (!invalidate_regs.empty())
539                 {
540                     invalidate_regs.push_back(LLDB_INVALID_REGNUM);
541                     reg_info.invalidate_regs = invalidate_regs.data();
542                 }
543 
544                 m_register_info.AddRegister(reg_info, reg_name, alt_name, set_name);
545             }
546             else
547             {
548                 break;  // ensure exit before reg_num is incremented
549             }
550         }
551         else
552         {
553             break;
554         }
555     }
556 
557     // Check if qHostInfo specified a specific packet timeout for this connection.
558     // If so then lets update our setting so the user knows what the timeout is
559     // and can see it.
560     const uint32_t host_packet_timeout = m_gdb_comm.GetHostDefaultPacketTimeout();
561     if (host_packet_timeout)
562     {
563         GetGlobalPluginProperties()->SetPacketTimeout(host_packet_timeout);
564     }
565 
566 
567     if (reg_num == 0)
568     {
569         FileSpec target_definition_fspec = GetGlobalPluginProperties()->GetTargetDefinitionFile ();
570 
571         if (target_definition_fspec)
572         {
573             // See if we can get register definitions from a python file
574             if (ParsePythonTargetDefinition (target_definition_fspec))
575                 return;
576         }
577     }
578 
579     // We didn't get anything if the accumulated reg_num is zero.  See if we are
580     // debugging ARM and fill with a hard coded register set until we can get an
581     // updated debugserver down on the devices.
582     // On the other hand, if the accumulated reg_num is positive, see if we can
583     // add composite registers to the existing primordial ones.
584     bool from_scratch = (reg_num == 0);
585 
586     const ArchSpec &target_arch = GetTarget().GetArchitecture();
587     const ArchSpec &remote_host_arch = m_gdb_comm.GetHostArchitecture();
588     const ArchSpec &remote_process_arch = m_gdb_comm.GetProcessArchitecture();
589 
590     // Use the process' architecture instead of the host arch, if available
591     ArchSpec remote_arch;
592     if (remote_process_arch.IsValid ())
593         remote_arch = remote_process_arch;
594     else
595         remote_arch = remote_host_arch;
596 
597     if (!target_arch.IsValid())
598     {
599         if (remote_arch.IsValid()
600               && remote_arch.GetMachine() == llvm::Triple::arm
601               && remote_arch.GetTriple().getVendor() == llvm::Triple::Apple)
602             m_register_info.HardcodeARMRegisters(from_scratch);
603     }
604     else if (target_arch.GetMachine() == llvm::Triple::arm)
605     {
606         m_register_info.HardcodeARMRegisters(from_scratch);
607     }
608 
609     // At this point, we can finalize our register info.
610     m_register_info.Finalize ();
611 }
612 
613 Error
614 ProcessGDBRemote::WillLaunch (Module* module)
615 {
616     return WillLaunchOrAttach ();
617 }
618 
619 Error
620 ProcessGDBRemote::WillAttachToProcessWithID (lldb::pid_t pid)
621 {
622     return WillLaunchOrAttach ();
623 }
624 
625 Error
626 ProcessGDBRemote::WillAttachToProcessWithName (const char *process_name, bool wait_for_launch)
627 {
628     return WillLaunchOrAttach ();
629 }
630 
631 Error
632 ProcessGDBRemote::DoConnectRemote (Stream *strm, const char *remote_url)
633 {
634     Log *log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PROCESS));
635     Error error (WillLaunchOrAttach ());
636 
637     if (error.Fail())
638         return error;
639 
640     error = ConnectToDebugserver (remote_url);
641 
642     if (error.Fail())
643         return error;
644     StartAsyncThread ();
645 
646     lldb::pid_t pid = m_gdb_comm.GetCurrentProcessID ();
647     if (pid == LLDB_INVALID_PROCESS_ID)
648     {
649         // We don't have a valid process ID, so note that we are connected
650         // and could now request to launch or attach, or get remote process
651         // listings...
652         SetPrivateState (eStateConnected);
653     }
654     else
655     {
656         // We have a valid process
657         SetID (pid);
658         GetThreadList();
659         if (m_gdb_comm.SendPacketAndWaitForResponse("?", 1, m_last_stop_packet, false) == GDBRemoteCommunication::PacketResult::Success)
660         {
661             if (!m_target.GetArchitecture().IsValid())
662             {
663                 if (m_gdb_comm.GetProcessArchitecture().IsValid())
664                 {
665                     m_target.SetArchitecture(m_gdb_comm.GetProcessArchitecture());
666                 }
667                 else
668                 {
669                     m_target.SetArchitecture(m_gdb_comm.GetHostArchitecture());
670                 }
671             }
672 
673             const StateType state = SetThreadStopInfo (m_last_stop_packet);
674             if (state == eStateStopped)
675             {
676                 SetPrivateState (state);
677             }
678             else
679                 error.SetErrorStringWithFormat ("Process %" PRIu64 " was reported after connecting to '%s', but state was not stopped: %s", pid, remote_url, StateAsCString (state));
680         }
681         else
682             error.SetErrorStringWithFormat ("Process %" PRIu64 " was reported after connecting to '%s', but no stop reply packet was received", pid, remote_url);
683     }
684 
685     if (log)
686         log->Printf ("ProcessGDBRemote::%s pid %" PRIu64 ": normalizing target architecture initial triple: %s (GetTarget().GetArchitecture().IsValid() %s, m_gdb_comm.GetHostArchitecture().IsValid(): %s)", __FUNCTION__, GetID (), GetTarget ().GetArchitecture ().GetTriple ().getTriple ().c_str (), GetTarget ().GetArchitecture ().IsValid () ? "true" : "false", m_gdb_comm.GetHostArchitecture ().IsValid () ? "true" : "false");
687 
688 
689     if (error.Success()
690         && !GetTarget().GetArchitecture().IsValid()
691         && m_gdb_comm.GetHostArchitecture().IsValid())
692     {
693         // Prefer the *process'* architecture over that of the *host*, if available.
694         if (m_gdb_comm.GetProcessArchitecture().IsValid())
695             GetTarget().SetArchitecture(m_gdb_comm.GetProcessArchitecture());
696         else
697             GetTarget().SetArchitecture(m_gdb_comm.GetHostArchitecture());
698     }
699 
700     if (log)
701         log->Printf ("ProcessGDBRemote::%s pid %" PRIu64 ": normalized target architecture triple: %s", __FUNCTION__, GetID (), GetTarget ().GetArchitecture ().GetTriple ().getTriple ().c_str ());
702 
703     // Set the Unix signals properly for the target.
704     // FIXME Add a gdb-remote packet to discover dynamically.
705     if (error.Success ())
706     {
707         const ArchSpec arch_spec = GetTarget ().GetArchitecture ();
708         if (arch_spec.IsValid ())
709         {
710             if (log)
711                 log->Printf ("ProcessGDBRemote::%s pid %" PRIu64 ": determining unix signals type based on architecture %s, triple %s", __FUNCTION__, GetID (), arch_spec.GetArchitectureName () ? arch_spec.GetArchitectureName () : "<null>", arch_spec.GetTriple ().getTriple ().c_str ());
712 
713             switch (arch_spec.GetTriple ().getOS ())
714             {
715             case llvm::Triple::Linux:
716                 m_unix_signals_sp.reset (new process_linux::LinuxSignals ());
717                 if (log)
718                     log->Printf ("ProcessGDBRemote::%s using Linux unix signals type for pid %" PRIu64, __FUNCTION__, GetID ());
719                 break;
720             case llvm::Triple::OpenBSD:
721             case llvm::Triple::FreeBSD:
722             case llvm::Triple::NetBSD:
723                 m_unix_signals_sp.reset (new FreeBSDSignals ());
724                 if (log)
725                     log->Printf ("ProcessGDBRemote::%s using *BSD unix signals type for pid %" PRIu64, __FUNCTION__, GetID ());
726                 break;
727             default:
728                 m_unix_signals_sp.reset (new UnixSignals ());
729                 if (log)
730                     log->Printf ("ProcessGDBRemote::%s using generic unix signals type for pid %" PRIu64, __FUNCTION__, GetID ());
731                 break;
732             }
733         }
734     }
735 
736     return error;
737 }
738 
739 Error
740 ProcessGDBRemote::WillLaunchOrAttach ()
741 {
742     Error error;
743     m_stdio_communication.Clear ();
744     return error;
745 }
746 
747 //----------------------------------------------------------------------
748 // Process Control
749 //----------------------------------------------------------------------
750 Error
751 ProcessGDBRemote::DoLaunch (Module *exe_module, ProcessLaunchInfo &launch_info)
752 {
753     Error error;
754 
755     uint32_t launch_flags = launch_info.GetFlags().Get();
756     const char *stdin_path = NULL;
757     const char *stdout_path = NULL;
758     const char *stderr_path = NULL;
759     const char *working_dir = launch_info.GetWorkingDirectory();
760 
761     const FileAction *file_action;
762     file_action = launch_info.GetFileActionForFD (STDIN_FILENO);
763     if (file_action)
764     {
765         if (file_action->GetAction() == FileAction::eFileActionOpen)
766             stdin_path = file_action->GetPath();
767     }
768     file_action = launch_info.GetFileActionForFD (STDOUT_FILENO);
769     if (file_action)
770     {
771         if (file_action->GetAction() == FileAction::eFileActionOpen)
772             stdout_path = file_action->GetPath();
773     }
774     file_action = launch_info.GetFileActionForFD (STDERR_FILENO);
775     if (file_action)
776     {
777         if (file_action->GetAction() == FileAction::eFileActionOpen)
778             stderr_path = file_action->GetPath();
779     }
780 
781     //  ::LogSetBitMask (GDBR_LOG_DEFAULT);
782     //  ::LogSetOptions (LLDB_LOG_OPTION_THREADSAFE | LLDB_LOG_OPTION_PREPEND_TIMESTAMP | LLDB_LOG_OPTION_PREPEND_PROC_AND_THREAD);
783     //  ::LogSetLogFile ("/dev/stdout");
784     Log *log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PROCESS));
785 
786     ObjectFile * object_file = exe_module->GetObjectFile();
787     if (object_file)
788     {
789         // Make sure we aren't already connected?
790         if (!m_gdb_comm.IsConnected())
791         {
792             error = LaunchAndConnectToDebugserver (launch_info);
793         }
794 
795         if (error.Success())
796         {
797             lldb_utility::PseudoTerminal pty;
798             const bool disable_stdio = (launch_flags & eLaunchFlagDisableSTDIO) != 0;
799 
800             // If the debugserver is local and we aren't disabling STDIO, lets use
801             // a pseudo terminal to instead of relying on the 'O' packets for stdio
802             // since 'O' packets can really slow down debugging if the inferior
803             // does a lot of output.
804             PlatformSP platform_sp (m_target.GetPlatform());
805             if (platform_sp && platform_sp->IsHost() && !disable_stdio)
806             {
807                 const char *slave_name = NULL;
808                 if (stdin_path == NULL || stdout_path == NULL || stderr_path == NULL)
809                 {
810                     if (pty.OpenFirstAvailableMaster(O_RDWR|O_NOCTTY, NULL, 0))
811                         slave_name = pty.GetSlaveName (NULL, 0);
812                 }
813                 if (stdin_path == NULL)
814                     stdin_path = slave_name;
815 
816                 if (stdout_path == NULL)
817                     stdout_path = slave_name;
818 
819                 if (stderr_path == NULL)
820                     stderr_path = slave_name;
821             }
822 
823             // Set STDIN to /dev/null if we want STDIO disabled or if either
824             // STDOUT or STDERR have been set to something and STDIN hasn't
825             if (disable_stdio || (stdin_path == NULL && (stdout_path || stderr_path)))
826                 stdin_path = "/dev/null";
827 
828             // Set STDOUT to /dev/null if we want STDIO disabled or if either
829             // STDIN or STDERR have been set to something and STDOUT hasn't
830             if (disable_stdio || (stdout_path == NULL && (stdin_path || stderr_path)))
831                 stdout_path = "/dev/null";
832 
833             // Set STDERR to /dev/null if we want STDIO disabled or if either
834             // STDIN or STDOUT have been set to something and STDERR hasn't
835             if (disable_stdio || (stderr_path == NULL && (stdin_path || stdout_path)))
836                 stderr_path = "/dev/null";
837 
838             if (stdin_path)
839                 m_gdb_comm.SetSTDIN (stdin_path);
840             if (stdout_path)
841                 m_gdb_comm.SetSTDOUT (stdout_path);
842             if (stderr_path)
843                 m_gdb_comm.SetSTDERR (stderr_path);
844 
845             m_gdb_comm.SetDisableASLR (launch_flags & eLaunchFlagDisableASLR);
846             m_gdb_comm.SetDetachOnError (launch_flags & eLaunchFlagDetachOnError);
847 
848             m_gdb_comm.SendLaunchArchPacket (m_target.GetArchitecture().GetArchitectureName());
849 
850             const char * launch_event_data = launch_info.GetLaunchEventData();
851             if (launch_event_data != NULL && *launch_event_data != '\0')
852                 m_gdb_comm.SendLaunchEventDataPacket (launch_event_data);
853 
854             if (working_dir && working_dir[0])
855             {
856                 m_gdb_comm.SetWorkingDir (working_dir);
857             }
858 
859             // Send the environment and the program + arguments after we connect
860             const Args &environment = launch_info.GetEnvironmentEntries();
861             if (environment.GetArgumentCount())
862             {
863                 size_t num_environment_entries = environment.GetArgumentCount();
864                 for (size_t i=0; i<num_environment_entries; ++i)
865                 {
866                     const char *env_entry = environment.GetArgumentAtIndex(i);
867                     if (env_entry == NULL || m_gdb_comm.SendEnvironmentPacket(env_entry) != 0)
868                         break;
869                 }
870             }
871 
872             const uint32_t old_packet_timeout = m_gdb_comm.SetPacketTimeout (10);
873             int arg_packet_err = m_gdb_comm.SendArgumentsPacket (launch_info);
874             if (arg_packet_err == 0)
875             {
876                 std::string error_str;
877                 if (m_gdb_comm.GetLaunchSuccess (error_str))
878                 {
879                     SetID (m_gdb_comm.GetCurrentProcessID ());
880                 }
881                 else
882                 {
883                     error.SetErrorString (error_str.c_str());
884                 }
885             }
886             else
887             {
888                 error.SetErrorStringWithFormat("'A' packet returned an error: %i", arg_packet_err);
889             }
890 
891             m_gdb_comm.SetPacketTimeout (old_packet_timeout);
892 
893             if (GetID() == LLDB_INVALID_PROCESS_ID)
894             {
895                 if (log)
896                     log->Printf("failed to connect to debugserver: %s", error.AsCString());
897                 KillDebugserverProcess ();
898                 return error;
899             }
900 
901             if (m_gdb_comm.SendPacketAndWaitForResponse("?", 1, m_last_stop_packet, false) == GDBRemoteCommunication::PacketResult::Success)
902             {
903                 if (!m_target.GetArchitecture().IsValid())
904                 {
905                     if (m_gdb_comm.GetProcessArchitecture().IsValid())
906                     {
907                         m_target.SetArchitecture(m_gdb_comm.GetProcessArchitecture());
908                     }
909                     else
910                     {
911                         m_target.SetArchitecture(m_gdb_comm.GetHostArchitecture());
912                     }
913                 }
914 
915                 SetPrivateState (SetThreadStopInfo (m_last_stop_packet));
916 
917                 if (!disable_stdio)
918                 {
919                     if (pty.GetMasterFileDescriptor() != lldb_utility::PseudoTerminal::invalid_fd)
920                         SetSTDIOFileDescriptor (pty.ReleaseMasterFileDescriptor());
921                 }
922             }
923         }
924         else
925         {
926             if (log)
927                 log->Printf("failed to connect to debugserver: %s", error.AsCString());
928         }
929     }
930     else
931     {
932         // Set our user ID to an invalid process ID.
933         SetID(LLDB_INVALID_PROCESS_ID);
934         error.SetErrorStringWithFormat ("failed to get object file from '%s' for arch %s",
935                                         exe_module->GetFileSpec().GetFilename().AsCString(),
936                                         exe_module->GetArchitecture().GetArchitectureName());
937     }
938     return error;
939 
940 }
941 
942 
943 Error
944 ProcessGDBRemote::ConnectToDebugserver (const char *connect_url)
945 {
946     Error error;
947     // Only connect if we have a valid connect URL
948 
949     if (connect_url && connect_url[0])
950     {
951         std::unique_ptr<ConnectionFileDescriptor> conn_ap(new ConnectionFileDescriptor());
952         if (conn_ap.get())
953         {
954             const uint32_t max_retry_count = 50;
955             uint32_t retry_count = 0;
956             while (!m_gdb_comm.IsConnected())
957             {
958                 if (conn_ap->Connect(connect_url, &error) == eConnectionStatusSuccess)
959                 {
960                     m_gdb_comm.SetConnection (conn_ap.release());
961                     break;
962                 }
963                 else if (error.WasInterrupted())
964                 {
965                     // If we were interrupted, don't keep retrying.
966                     break;
967                 }
968 
969                 retry_count++;
970 
971                 if (retry_count >= max_retry_count)
972                     break;
973 
974                 usleep (100000);
975             }
976         }
977     }
978 
979     if (!m_gdb_comm.IsConnected())
980     {
981         if (error.Success())
982             error.SetErrorString("not connected to remote gdb server");
983         return error;
984     }
985 
986     // We always seem to be able to open a connection to a local port
987     // so we need to make sure we can then send data to it. If we can't
988     // then we aren't actually connected to anything, so try and do the
989     // handshake with the remote GDB server and make sure that goes
990     // alright.
991     if (!m_gdb_comm.HandshakeWithServer (&error))
992     {
993         m_gdb_comm.Disconnect();
994         if (error.Success())
995             error.SetErrorString("not connected to remote gdb server");
996         return error;
997     }
998     m_gdb_comm.GetThreadSuffixSupported ();
999     m_gdb_comm.GetListThreadsInStopReplySupported ();
1000     m_gdb_comm.GetHostInfo ();
1001     m_gdb_comm.GetVContSupported ('c');
1002     m_gdb_comm.GetVAttachOrWaitSupported();
1003 
1004     size_t num_cmds = GetExtraStartupCommands().GetArgumentCount();
1005     for (size_t idx = 0; idx < num_cmds; idx++)
1006     {
1007         StringExtractorGDBRemote response;
1008         m_gdb_comm.SendPacketAndWaitForResponse (GetExtraStartupCommands().GetArgumentAtIndex(idx), response, false);
1009     }
1010     return error;
1011 }
1012 
1013 void
1014 ProcessGDBRemote::DidLaunchOrAttach (ArchSpec& process_arch)
1015 {
1016     Log *log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PROCESS));
1017     if (log)
1018         log->Printf ("ProcessGDBRemote::DidLaunch()");
1019     if (GetID() != LLDB_INVALID_PROCESS_ID)
1020     {
1021         BuildDynamicRegisterInfo (false);
1022 
1023         // See if the GDB server supports the qHostInfo information
1024 
1025 
1026         // See if the GDB server supports the qProcessInfo packet, if so
1027         // prefer that over the Host information as it will be more specific
1028         // to our process.
1029 
1030         if (m_gdb_comm.GetProcessArchitecture().IsValid())
1031             process_arch = m_gdb_comm.GetProcessArchitecture();
1032         else
1033             process_arch = m_gdb_comm.GetHostArchitecture();
1034 
1035         if (process_arch.IsValid())
1036         {
1037             ArchSpec &target_arch = GetTarget().GetArchitecture();
1038 
1039             if (target_arch.IsValid())
1040             {
1041                 // If the remote host is ARM and we have apple as the vendor, then
1042                 // ARM executables and shared libraries can have mixed ARM architectures.
1043                 // You can have an armv6 executable, and if the host is armv7, then the
1044                 // system will load the best possible architecture for all shared libraries
1045                 // it has, so we really need to take the remote host architecture as our
1046                 // defacto architecture in this case.
1047 
1048                 if (process_arch.GetMachine() == llvm::Triple::arm &&
1049                     process_arch.GetTriple().getVendor() == llvm::Triple::Apple)
1050                 {
1051                     GetTarget().SetArchitecture (process_arch);
1052                 }
1053                 else
1054                 {
1055                     // Fill in what is missing in the triple
1056                     const llvm::Triple &remote_triple = process_arch.GetTriple();
1057                     llvm::Triple &target_triple = target_arch.GetTriple();
1058                     if (target_triple.getVendorName().size() == 0)
1059                     {
1060                         target_triple.setVendor (remote_triple.getVendor());
1061 
1062                         if (target_triple.getOSName().size() == 0)
1063                         {
1064                             target_triple.setOS (remote_triple.getOS());
1065 
1066                             if (target_triple.getEnvironmentName().size() == 0)
1067                                 target_triple.setEnvironment (remote_triple.getEnvironment());
1068                         }
1069                     }
1070                 }
1071             }
1072             else
1073             {
1074                 // The target doesn't have a valid architecture yet, set it from
1075                 // the architecture we got from the remote GDB server
1076                 GetTarget().SetArchitecture (process_arch);
1077             }
1078         }
1079     }
1080 }
1081 
1082 void
1083 ProcessGDBRemote::DidLaunch ()
1084 {
1085     ArchSpec process_arch;
1086     DidLaunchOrAttach (process_arch);
1087 }
1088 
1089 UnixSignals&
1090 ProcessGDBRemote::GetUnixSignals ()
1091 {
1092     assert (m_unix_signals_sp && "m_unix_signals_sp is null");
1093     return *m_unix_signals_sp;
1094 }
1095 
1096 Error
1097 ProcessGDBRemote::DoAttachToProcessWithID (lldb::pid_t attach_pid)
1098 {
1099     ProcessAttachInfo attach_info;
1100     return DoAttachToProcessWithID(attach_pid, attach_info);
1101 }
1102 
1103 Error
1104 ProcessGDBRemote::DoAttachToProcessWithID (lldb::pid_t attach_pid, const ProcessAttachInfo &attach_info)
1105 {
1106     Error error;
1107     // Clear out and clean up from any current state
1108     Clear();
1109     if (attach_pid != LLDB_INVALID_PROCESS_ID)
1110     {
1111         // Make sure we aren't already connected?
1112         if (!m_gdb_comm.IsConnected())
1113         {
1114             error = LaunchAndConnectToDebugserver (attach_info);
1115 
1116             if (error.Fail())
1117             {
1118                 const char *error_string = error.AsCString();
1119                 if (error_string == NULL)
1120                     error_string = "unable to launch " DEBUGSERVER_BASENAME;
1121 
1122                 SetExitStatus (-1, error_string);
1123             }
1124         }
1125 
1126         if (error.Success())
1127         {
1128             m_gdb_comm.SetDetachOnError(attach_info.GetDetachOnError());
1129 
1130             char packet[64];
1131             const int packet_len = ::snprintf (packet, sizeof(packet), "vAttach;%" PRIx64, attach_pid);
1132             SetID (attach_pid);
1133             m_async_broadcaster.BroadcastEvent (eBroadcastBitAsyncContinue, new EventDataBytes (packet, packet_len));
1134         }
1135     }
1136     return error;
1137 }
1138 
1139 Error
1140 ProcessGDBRemote::DoAttachToProcessWithName (const char *process_name, const ProcessAttachInfo &attach_info)
1141 {
1142     Error error;
1143     // Clear out and clean up from any current state
1144     Clear();
1145 
1146     if (process_name && process_name[0])
1147     {
1148         // Make sure we aren't already connected?
1149         if (!m_gdb_comm.IsConnected())
1150         {
1151             error = LaunchAndConnectToDebugserver (attach_info);
1152 
1153             if (error.Fail())
1154             {
1155                 const char *error_string = error.AsCString();
1156                 if (error_string == NULL)
1157                     error_string = "unable to launch " DEBUGSERVER_BASENAME;
1158 
1159                 SetExitStatus (-1, error_string);
1160             }
1161         }
1162 
1163         if (error.Success())
1164         {
1165             StreamString packet;
1166 
1167             m_gdb_comm.SetDetachOnError(attach_info.GetDetachOnError());
1168 
1169             if (attach_info.GetWaitForLaunch())
1170             {
1171                 if (!m_gdb_comm.GetVAttachOrWaitSupported())
1172                 {
1173                     packet.PutCString ("vAttachWait");
1174                 }
1175                 else
1176                 {
1177                     if (attach_info.GetIgnoreExisting())
1178                         packet.PutCString("vAttachWait");
1179                     else
1180                         packet.PutCString ("vAttachOrWait");
1181                 }
1182             }
1183             else
1184                 packet.PutCString("vAttachName");
1185             packet.PutChar(';');
1186             packet.PutBytesAsRawHex8(process_name, strlen(process_name), lldb::endian::InlHostByteOrder(), lldb::endian::InlHostByteOrder());
1187 
1188             m_async_broadcaster.BroadcastEvent (eBroadcastBitAsyncContinue, new EventDataBytes (packet.GetData(), packet.GetSize()));
1189 
1190         }
1191     }
1192     return error;
1193 }
1194 
1195 
1196 bool
1197 ProcessGDBRemote::SetExitStatus (int exit_status, const char *cstr)
1198 {
1199     m_gdb_comm.Disconnect();
1200     return Process::SetExitStatus (exit_status, cstr);
1201 }
1202 
1203 void
1204 ProcessGDBRemote::DidAttach (ArchSpec &process_arch)
1205 {
1206     // If you can figure out what the architecture is, fill it in here.
1207     process_arch.Clear();
1208     DidLaunchOrAttach (process_arch);
1209 }
1210 
1211 
1212 Error
1213 ProcessGDBRemote::WillResume ()
1214 {
1215     m_continue_c_tids.clear();
1216     m_continue_C_tids.clear();
1217     m_continue_s_tids.clear();
1218     m_continue_S_tids.clear();
1219     return Error();
1220 }
1221 
1222 Error
1223 ProcessGDBRemote::DoResume ()
1224 {
1225     Error error;
1226     Log *log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PROCESS));
1227     if (log)
1228         log->Printf ("ProcessGDBRemote::Resume()");
1229 
1230     Listener listener ("gdb-remote.resume-packet-sent");
1231     if (listener.StartListeningForEvents (&m_gdb_comm, GDBRemoteCommunication::eBroadcastBitRunPacketSent))
1232     {
1233         listener.StartListeningForEvents (&m_async_broadcaster, ProcessGDBRemote::eBroadcastBitAsyncThreadDidExit);
1234 
1235         const size_t num_threads = GetThreadList().GetSize();
1236 
1237         StreamString continue_packet;
1238         bool continue_packet_error = false;
1239         if (m_gdb_comm.HasAnyVContSupport ())
1240         {
1241             if (m_continue_c_tids.size() == num_threads ||
1242                 (m_continue_c_tids.empty() &&
1243                  m_continue_C_tids.empty() &&
1244                  m_continue_s_tids.empty() &&
1245                  m_continue_S_tids.empty()))
1246             {
1247                 // All threads are continuing, just send a "c" packet
1248                 continue_packet.PutCString ("c");
1249             }
1250             else
1251             {
1252                 continue_packet.PutCString ("vCont");
1253 
1254                 if (!m_continue_c_tids.empty())
1255                 {
1256                     if (m_gdb_comm.GetVContSupported ('c'))
1257                     {
1258                         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)
1259                             continue_packet.Printf(";c:%4.4" PRIx64, *t_pos);
1260                     }
1261                     else
1262                         continue_packet_error = true;
1263                 }
1264 
1265                 if (!continue_packet_error && !m_continue_C_tids.empty())
1266                 {
1267                     if (m_gdb_comm.GetVContSupported ('C'))
1268                     {
1269                         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)
1270                             continue_packet.Printf(";C%2.2x:%4.4" PRIx64, s_pos->second, s_pos->first);
1271                     }
1272                     else
1273                         continue_packet_error = true;
1274                 }
1275 
1276                 if (!continue_packet_error && !m_continue_s_tids.empty())
1277                 {
1278                     if (m_gdb_comm.GetVContSupported ('s'))
1279                     {
1280                         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)
1281                             continue_packet.Printf(";s:%4.4" PRIx64, *t_pos);
1282                     }
1283                     else
1284                         continue_packet_error = true;
1285                 }
1286 
1287                 if (!continue_packet_error && !m_continue_S_tids.empty())
1288                 {
1289                     if (m_gdb_comm.GetVContSupported ('S'))
1290                     {
1291                         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)
1292                             continue_packet.Printf(";S%2.2x:%4.4" PRIx64, s_pos->second, s_pos->first);
1293                     }
1294                     else
1295                         continue_packet_error = true;
1296                 }
1297 
1298                 if (continue_packet_error)
1299                     continue_packet.GetString().clear();
1300             }
1301         }
1302         else
1303             continue_packet_error = true;
1304 
1305         if (continue_packet_error)
1306         {
1307             // Either no vCont support, or we tried to use part of the vCont
1308             // packet that wasn't supported by the remote GDB server.
1309             // We need to try and make a simple packet that can do our continue
1310             const size_t num_continue_c_tids = m_continue_c_tids.size();
1311             const size_t num_continue_C_tids = m_continue_C_tids.size();
1312             const size_t num_continue_s_tids = m_continue_s_tids.size();
1313             const size_t num_continue_S_tids = m_continue_S_tids.size();
1314             if (num_continue_c_tids > 0)
1315             {
1316                 if (num_continue_c_tids == num_threads)
1317                 {
1318                     // All threads are resuming...
1319                     m_gdb_comm.SetCurrentThreadForRun (-1);
1320                     continue_packet.PutChar ('c');
1321                     continue_packet_error = false;
1322                 }
1323                 else if (num_continue_c_tids == 1 &&
1324                          num_continue_C_tids == 0 &&
1325                          num_continue_s_tids == 0 &&
1326                          num_continue_S_tids == 0 )
1327                 {
1328                     // Only one thread is continuing
1329                     m_gdb_comm.SetCurrentThreadForRun (m_continue_c_tids.front());
1330                     continue_packet.PutChar ('c');
1331                     continue_packet_error = false;
1332                 }
1333             }
1334 
1335             if (continue_packet_error && num_continue_C_tids > 0)
1336             {
1337                 if ((num_continue_C_tids + num_continue_c_tids) == num_threads &&
1338                     num_continue_C_tids > 0 &&
1339                     num_continue_s_tids == 0 &&
1340                     num_continue_S_tids == 0 )
1341                 {
1342                     const int continue_signo = m_continue_C_tids.front().second;
1343                     // Only one thread is continuing
1344                     if (num_continue_C_tids > 1)
1345                     {
1346                         // More that one thread with a signal, yet we don't have
1347                         // vCont support and we are being asked to resume each
1348                         // thread with a signal, we need to make sure they are
1349                         // all the same signal, or we can't issue the continue
1350                         // accurately with the current support...
1351                         if (num_continue_C_tids > 1)
1352                         {
1353                             continue_packet_error = false;
1354                             for (size_t i=1; i<m_continue_C_tids.size(); ++i)
1355                             {
1356                                 if (m_continue_C_tids[i].second != continue_signo)
1357                                     continue_packet_error = true;
1358                             }
1359                         }
1360                         if (!continue_packet_error)
1361                             m_gdb_comm.SetCurrentThreadForRun (-1);
1362                     }
1363                     else
1364                     {
1365                         // Set the continue thread ID
1366                         continue_packet_error = false;
1367                         m_gdb_comm.SetCurrentThreadForRun (m_continue_C_tids.front().first);
1368                     }
1369                     if (!continue_packet_error)
1370                     {
1371                         // Add threads continuing with the same signo...
1372                         continue_packet.Printf("C%2.2x", continue_signo);
1373                     }
1374                 }
1375             }
1376 
1377             if (continue_packet_error && num_continue_s_tids > 0)
1378             {
1379                 if (num_continue_s_tids == num_threads)
1380                 {
1381                     // All threads are resuming...
1382                     m_gdb_comm.SetCurrentThreadForRun (-1);
1383                     continue_packet.PutChar ('s');
1384                     continue_packet_error = false;
1385                 }
1386                 else if (num_continue_c_tids == 0 &&
1387                          num_continue_C_tids == 0 &&
1388                          num_continue_s_tids == 1 &&
1389                          num_continue_S_tids == 0 )
1390                 {
1391                     // Only one thread is stepping
1392                     m_gdb_comm.SetCurrentThreadForRun (m_continue_s_tids.front());
1393                     continue_packet.PutChar ('s');
1394                     continue_packet_error = false;
1395                 }
1396             }
1397 
1398             if (!continue_packet_error && num_continue_S_tids > 0)
1399             {
1400                 if (num_continue_S_tids == num_threads)
1401                 {
1402                     const int step_signo = m_continue_S_tids.front().second;
1403                     // Are all threads trying to step with the same signal?
1404                     continue_packet_error = false;
1405                     if (num_continue_S_tids > 1)
1406                     {
1407                         for (size_t i=1; i<num_threads; ++i)
1408                         {
1409                             if (m_continue_S_tids[i].second != step_signo)
1410                                 continue_packet_error = true;
1411                         }
1412                     }
1413                     if (!continue_packet_error)
1414                     {
1415                         // Add threads stepping with the same signo...
1416                         m_gdb_comm.SetCurrentThreadForRun (-1);
1417                         continue_packet.Printf("S%2.2x", step_signo);
1418                     }
1419                 }
1420                 else if (num_continue_c_tids == 0 &&
1421                          num_continue_C_tids == 0 &&
1422                          num_continue_s_tids == 0 &&
1423                          num_continue_S_tids == 1 )
1424                 {
1425                     // Only one thread is stepping with signal
1426                     m_gdb_comm.SetCurrentThreadForRun (m_continue_S_tids.front().first);
1427                     continue_packet.Printf("S%2.2x", m_continue_S_tids.front().second);
1428                     continue_packet_error = false;
1429                 }
1430             }
1431         }
1432 
1433         if (continue_packet_error)
1434         {
1435             error.SetErrorString ("can't make continue packet for this resume");
1436         }
1437         else
1438         {
1439             EventSP event_sp;
1440             TimeValue timeout;
1441             timeout = TimeValue::Now();
1442             timeout.OffsetWithSeconds (5);
1443             if (!IS_VALID_LLDB_HOST_THREAD(m_async_thread))
1444             {
1445                 error.SetErrorString ("Trying to resume but the async thread is dead.");
1446                 if (log)
1447                     log->Printf ("ProcessGDBRemote::DoResume: Trying to resume but the async thread is dead.");
1448                 return error;
1449             }
1450 
1451             m_async_broadcaster.BroadcastEvent (eBroadcastBitAsyncContinue, new EventDataBytes (continue_packet.GetData(), continue_packet.GetSize()));
1452 
1453             if (listener.WaitForEvent (&timeout, event_sp) == false)
1454             {
1455                 error.SetErrorString("Resume timed out.");
1456                 if (log)
1457                     log->Printf ("ProcessGDBRemote::DoResume: Resume timed out.");
1458             }
1459             else if (event_sp->BroadcasterIs (&m_async_broadcaster))
1460             {
1461                 error.SetErrorString ("Broadcast continue, but the async thread was killed before we got an ack back.");
1462                 if (log)
1463                     log->Printf ("ProcessGDBRemote::DoResume: Broadcast continue, but the async thread was killed before we got an ack back.");
1464                 return error;
1465             }
1466         }
1467     }
1468 
1469     return error;
1470 }
1471 
1472 void
1473 ProcessGDBRemote::ClearThreadIDList ()
1474 {
1475     Mutex::Locker locker(m_thread_list_real.GetMutex());
1476     m_thread_ids.clear();
1477 }
1478 
1479 bool
1480 ProcessGDBRemote::UpdateThreadIDList ()
1481 {
1482     Mutex::Locker locker(m_thread_list_real.GetMutex());
1483     bool sequence_mutex_unavailable = false;
1484     m_gdb_comm.GetCurrentThreadIDs (m_thread_ids, sequence_mutex_unavailable);
1485     if (sequence_mutex_unavailable)
1486     {
1487         return false; // We just didn't get the list
1488     }
1489     return true;
1490 }
1491 
1492 bool
1493 ProcessGDBRemote::UpdateThreadList (ThreadList &old_thread_list, ThreadList &new_thread_list)
1494 {
1495     // locker will keep a mutex locked until it goes out of scope
1496     Log *log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_THREAD));
1497     if (log && log->GetMask().Test(GDBR_LOG_VERBOSE))
1498         log->Printf ("ProcessGDBRemote::%s (pid = %" PRIu64 ")", __FUNCTION__, GetID());
1499 
1500     size_t num_thread_ids = m_thread_ids.size();
1501     // The "m_thread_ids" thread ID list should always be updated after each stop
1502     // reply packet, but in case it isn't, update it here.
1503     if (num_thread_ids == 0)
1504     {
1505         if (!UpdateThreadIDList ())
1506             return false;
1507         num_thread_ids = m_thread_ids.size();
1508     }
1509 
1510     ThreadList old_thread_list_copy(old_thread_list);
1511     if (num_thread_ids > 0)
1512     {
1513         for (size_t i=0; i<num_thread_ids; ++i)
1514         {
1515             tid_t tid = m_thread_ids[i];
1516             ThreadSP thread_sp (old_thread_list_copy.RemoveThreadByProtocolID(tid, false));
1517             if (!thread_sp)
1518             {
1519                 thread_sp.reset (new ThreadGDBRemote (*this, tid));
1520                 if (log && log->GetMask().Test(GDBR_LOG_VERBOSE))
1521                     log->Printf(
1522                             "ProcessGDBRemote::%s Making new thread: %p for thread ID: 0x%" PRIx64 ".\n",
1523                             __FUNCTION__, static_cast<void*>(thread_sp.get()),
1524                             thread_sp->GetID());
1525             }
1526             else
1527             {
1528                 if (log && log->GetMask().Test(GDBR_LOG_VERBOSE))
1529                     log->Printf(
1530                            "ProcessGDBRemote::%s Found old thread: %p for thread ID: 0x%" PRIx64 ".\n",
1531                            __FUNCTION__, static_cast<void*>(thread_sp.get()),
1532                            thread_sp->GetID());
1533             }
1534             new_thread_list.AddThread(thread_sp);
1535         }
1536     }
1537 
1538     // Whatever that is left in old_thread_list_copy are not
1539     // present in new_thread_list. Remove non-existent threads from internal id table.
1540     size_t old_num_thread_ids = old_thread_list_copy.GetSize(false);
1541     for (size_t i=0; i<old_num_thread_ids; i++)
1542     {
1543         ThreadSP old_thread_sp(old_thread_list_copy.GetThreadAtIndex (i, false));
1544         if (old_thread_sp)
1545         {
1546             lldb::tid_t old_thread_id = old_thread_sp->GetProtocolID();
1547             m_thread_id_to_index_id_map.erase(old_thread_id);
1548         }
1549     }
1550 
1551     return true;
1552 }
1553 
1554 
1555 StateType
1556 ProcessGDBRemote::SetThreadStopInfo (StringExtractor& stop_packet)
1557 {
1558     stop_packet.SetFilePos (0);
1559     const char stop_type = stop_packet.GetChar();
1560     switch (stop_type)
1561     {
1562     case 'T':
1563     case 'S':
1564         {
1565             // This is a bit of a hack, but is is required. If we did exec, we
1566             // need to clear our thread lists and also know to rebuild our dynamic
1567             // register info before we lookup and threads and populate the expedited
1568             // register values so we need to know this right away so we can cleanup
1569             // and update our registers.
1570             const uint32_t stop_id = GetStopID();
1571             if (stop_id == 0)
1572             {
1573                 // Our first stop, make sure we have a process ID, and also make
1574                 // sure we know about our registers
1575                 if (GetID() == LLDB_INVALID_PROCESS_ID)
1576                 {
1577                     lldb::pid_t pid = m_gdb_comm.GetCurrentProcessID ();
1578                     if (pid != LLDB_INVALID_PROCESS_ID)
1579                         SetID (pid);
1580                 }
1581                 BuildDynamicRegisterInfo (true);
1582             }
1583             // Stop with signal and thread info
1584             const uint8_t signo = stop_packet.GetHexU8();
1585             std::string name;
1586             std::string value;
1587             std::string thread_name;
1588             std::string reason;
1589             std::string description;
1590             uint32_t exc_type = 0;
1591             std::vector<addr_t> exc_data;
1592             addr_t thread_dispatch_qaddr = LLDB_INVALID_ADDRESS;
1593             ThreadSP thread_sp;
1594             ThreadGDBRemote *gdb_thread = NULL;
1595 
1596             while (stop_packet.GetNameColonValue(name, value))
1597             {
1598                 if (name.compare("metype") == 0)
1599                 {
1600                     // exception type in big endian hex
1601                     exc_type = Args::StringToUInt32 (value.c_str(), 0, 16);
1602                 }
1603                 else if (name.compare("medata") == 0)
1604                 {
1605                     // exception data in big endian hex
1606                     exc_data.push_back(Args::StringToUInt64 (value.c_str(), 0, 16));
1607                 }
1608                 else if (name.compare("thread") == 0)
1609                 {
1610                     // thread in big endian hex
1611                     lldb::tid_t tid = Args::StringToUInt64 (value.c_str(), LLDB_INVALID_THREAD_ID, 16);
1612                     // m_thread_list_real does have its own mutex, but we need to
1613                     // hold onto the mutex between the call to m_thread_list_real.FindThreadByID(...)
1614                     // and the m_thread_list_real.AddThread(...) so it doesn't change on us
1615                     Mutex::Locker locker (m_thread_list_real.GetMutex ());
1616                     thread_sp = m_thread_list_real.FindThreadByProtocolID(tid, false);
1617 
1618                     if (!thread_sp)
1619                     {
1620                         // Create the thread if we need to
1621                         thread_sp.reset (new ThreadGDBRemote (*this, tid));
1622                         Log *log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_THREAD));
1623                         if (log && log->GetMask().Test(GDBR_LOG_VERBOSE))
1624                             log->Printf ("ProcessGDBRemote::%s Adding new thread: %p for thread ID: 0x%" PRIx64 ".\n",
1625                                          __FUNCTION__,
1626                                          static_cast<void*>(thread_sp.get()),
1627                                          thread_sp->GetID());
1628 
1629                         m_thread_list_real.AddThread(thread_sp);
1630                     }
1631                     gdb_thread = static_cast<ThreadGDBRemote *> (thread_sp.get());
1632 
1633                 }
1634                 else if (name.compare("threads") == 0)
1635                 {
1636                     Mutex::Locker locker(m_thread_list_real.GetMutex());
1637                     m_thread_ids.clear();
1638                     // A comma separated list of all threads in the current
1639                     // process that includes the thread for this stop reply
1640                     // packet
1641                     size_t comma_pos;
1642                     lldb::tid_t tid;
1643                     while ((comma_pos = value.find(',')) != std::string::npos)
1644                     {
1645                         value[comma_pos] = '\0';
1646                         // thread in big endian hex
1647                         tid = Args::StringToUInt64 (value.c_str(), LLDB_INVALID_THREAD_ID, 16);
1648                         if (tid != LLDB_INVALID_THREAD_ID)
1649                             m_thread_ids.push_back (tid);
1650                         value.erase(0, comma_pos + 1);
1651                     }
1652                     tid = Args::StringToUInt64 (value.c_str(), LLDB_INVALID_THREAD_ID, 16);
1653                     if (tid != LLDB_INVALID_THREAD_ID)
1654                         m_thread_ids.push_back (tid);
1655                 }
1656                 else if (name.compare("hexname") == 0)
1657                 {
1658                     StringExtractor name_extractor;
1659                     // Swap "value" over into "name_extractor"
1660                     name_extractor.GetStringRef().swap(value);
1661                     // Now convert the HEX bytes into a string value
1662                     name_extractor.GetHexByteString (value);
1663                     thread_name.swap (value);
1664                 }
1665                 else if (name.compare("name") == 0)
1666                 {
1667                     thread_name.swap (value);
1668                 }
1669                 else if (name.compare("qaddr") == 0)
1670                 {
1671                     thread_dispatch_qaddr = Args::StringToUInt64 (value.c_str(), 0, 16);
1672                 }
1673                 else if (name.compare("reason") == 0)
1674                 {
1675                     reason.swap(value);
1676                 }
1677                 else if (name.compare("description") == 0)
1678                 {
1679                     StringExtractor desc_extractor;
1680                     // Swap "value" over into "name_extractor"
1681                     desc_extractor.GetStringRef().swap(value);
1682                     // Now convert the HEX bytes into a string value
1683                     desc_extractor.GetHexByteString (thread_name);
1684                 }
1685                 else if (name.size() == 2 && ::isxdigit(name[0]) && ::isxdigit(name[1]))
1686                 {
1687                     // We have a register number that contains an expedited
1688                     // register value. Lets supply this register to our thread
1689                     // so it won't have to go and read it.
1690                     if (gdb_thread)
1691                     {
1692                         uint32_t reg = Args::StringToUInt32 (name.c_str(), UINT32_MAX, 16);
1693 
1694                         if (reg != UINT32_MAX)
1695                         {
1696                             StringExtractor reg_value_extractor;
1697                             // Swap "value" over into "reg_value_extractor"
1698                             reg_value_extractor.GetStringRef().swap(value);
1699                             if (!gdb_thread->PrivateSetRegisterValue (reg, reg_value_extractor))
1700                             {
1701                                 Host::SetCrashDescriptionWithFormat("Setting thread register '%s' (decoded to %u (0x%x)) with value '%s' for stop packet: '%s'",
1702                                                                     name.c_str(),
1703                                                                     reg,
1704                                                                     reg,
1705                                                                     reg_value_extractor.GetStringRef().c_str(),
1706                                                                     stop_packet.GetStringRef().c_str());
1707                             }
1708                         }
1709                     }
1710                 }
1711             }
1712 
1713             // If the response is old style 'S' packet which does not provide us with thread information
1714             // then update the thread list and choose the first one.
1715             if (!thread_sp)
1716             {
1717                 UpdateThreadIDList ();
1718 
1719                 if (!m_thread_ids.empty ())
1720                 {
1721                     Mutex::Locker locker (m_thread_list_real.GetMutex ());
1722                     thread_sp = m_thread_list_real.FindThreadByProtocolID (m_thread_ids.front (), false);
1723                     if (thread_sp)
1724                         gdb_thread = static_cast<ThreadGDBRemote *> (thread_sp.get ());
1725                 }
1726             }
1727 
1728             if (thread_sp)
1729             {
1730                 // Clear the stop info just in case we don't set it to anything
1731                 thread_sp->SetStopInfo (StopInfoSP());
1732 
1733                 gdb_thread->SetThreadDispatchQAddr (thread_dispatch_qaddr);
1734                 gdb_thread->SetName (thread_name.empty() ? NULL : thread_name.c_str());
1735                 if (exc_type != 0)
1736                 {
1737                     const size_t exc_data_size = exc_data.size();
1738 
1739                     thread_sp->SetStopInfo (StopInfoMachException::CreateStopReasonWithMachException (*thread_sp,
1740                                                                                                       exc_type,
1741                                                                                                       exc_data_size,
1742                                                                                                       exc_data_size >= 1 ? exc_data[0] : 0,
1743                                                                                                       exc_data_size >= 2 ? exc_data[1] : 0,
1744                                                                                                       exc_data_size >= 3 ? exc_data[2] : 0));
1745                 }
1746                 else
1747                 {
1748                     bool handled = false;
1749                     bool did_exec = false;
1750                     if (!reason.empty())
1751                     {
1752                         if (reason.compare("trace") == 0)
1753                         {
1754                             thread_sp->SetStopInfo (StopInfo::CreateStopReasonToTrace (*thread_sp));
1755                             handled = true;
1756                         }
1757                         else if (reason.compare("breakpoint") == 0)
1758                         {
1759                             addr_t pc = thread_sp->GetRegisterContext()->GetPC();
1760                             lldb::BreakpointSiteSP bp_site_sp = thread_sp->GetProcess()->GetBreakpointSiteList().FindByAddress(pc);
1761                             if (bp_site_sp)
1762                             {
1763                                 // If the breakpoint is for this thread, then we'll report the hit, but if it is for another thread,
1764                                 // we can just report no reason.  We don't need to worry about stepping over the breakpoint here, that
1765                                 // will be taken care of when the thread resumes and notices that there's a breakpoint under the pc.
1766                                 handled = true;
1767                                 if (bp_site_sp->ValidForThisThread (thread_sp.get()))
1768                                 {
1769                                     thread_sp->SetStopInfo (StopInfo::CreateStopReasonWithBreakpointSiteID (*thread_sp, bp_site_sp->GetID()));
1770                                 }
1771                                 else
1772                                 {
1773                                     StopInfoSP invalid_stop_info_sp;
1774                                     thread_sp->SetStopInfo (invalid_stop_info_sp);
1775                                 }
1776                             }
1777                         }
1778                         else if (reason.compare("trap") == 0)
1779                         {
1780                             // Let the trap just use the standard signal stop reason below...
1781                         }
1782                         else if (reason.compare("watchpoint") == 0)
1783                         {
1784                             break_id_t watch_id = LLDB_INVALID_WATCH_ID;
1785                             // TODO: locate the watchpoint somehow...
1786                             thread_sp->SetStopInfo (StopInfo::CreateStopReasonWithWatchpointID (*thread_sp, watch_id));
1787                             handled = true;
1788                         }
1789                         else if (reason.compare("exception") == 0)
1790                         {
1791                             thread_sp->SetStopInfo (StopInfo::CreateStopReasonWithException(*thread_sp, description.c_str()));
1792                             handled = true;
1793                         }
1794                         else if (reason.compare("exec") == 0)
1795                         {
1796                             did_exec = true;
1797                             thread_sp->SetStopInfo (StopInfo::CreateStopReasonWithExec(*thread_sp));
1798                             handled = true;
1799                         }
1800                     }
1801 
1802                     if (!handled && signo && did_exec == false)
1803                     {
1804                         if (signo == SIGTRAP)
1805                         {
1806                             // Currently we are going to assume SIGTRAP means we are either
1807                             // hitting a breakpoint or hardware single stepping.
1808                             handled = true;
1809                             addr_t pc = thread_sp->GetRegisterContext()->GetPC() + m_breakpoint_pc_offset;
1810                             lldb::BreakpointSiteSP bp_site_sp = thread_sp->GetProcess()->GetBreakpointSiteList().FindByAddress(pc);
1811 
1812                             if (bp_site_sp)
1813                             {
1814                                 // If the breakpoint is for this thread, then we'll report the hit, but if it is for another thread,
1815                                 // we can just report no reason.  We don't need to worry about stepping over the breakpoint here, that
1816                                 // will be taken care of when the thread resumes and notices that there's a breakpoint under the pc.
1817                                 if (bp_site_sp->ValidForThisThread (thread_sp.get()))
1818                                 {
1819                                     if(m_breakpoint_pc_offset != 0)
1820                                         thread_sp->GetRegisterContext()->SetPC(pc);
1821                                     thread_sp->SetStopInfo (StopInfo::CreateStopReasonWithBreakpointSiteID (*thread_sp, bp_site_sp->GetID()));
1822                                 }
1823                                 else
1824                                 {
1825                                     StopInfoSP invalid_stop_info_sp;
1826                                     thread_sp->SetStopInfo (invalid_stop_info_sp);
1827                                 }
1828                             }
1829                             else
1830                             {
1831                                 // If we were stepping then assume the stop was the result of the trace.  If we were
1832                                 // not stepping then report the SIGTRAP.
1833                                 // FIXME: We are still missing the case where we single step over a trap instruction.
1834                                 if (thread_sp->GetTemporaryResumeState() == eStateStepping)
1835                                     thread_sp->SetStopInfo (StopInfo::CreateStopReasonToTrace (*thread_sp));
1836                                 else
1837                                     thread_sp->SetStopInfo (StopInfo::CreateStopReasonWithSignal(*thread_sp, signo));
1838                             }
1839                         }
1840                         if (!handled)
1841                             thread_sp->SetStopInfo (StopInfo::CreateStopReasonWithSignal (*thread_sp, signo));
1842                     }
1843 
1844                     if (!description.empty())
1845                     {
1846                         lldb::StopInfoSP stop_info_sp (thread_sp->GetStopInfo ());
1847                         if (stop_info_sp)
1848                         {
1849                             stop_info_sp->SetDescription (description.c_str());
1850                         }
1851                         else
1852                         {
1853                             thread_sp->SetStopInfo (StopInfo::CreateStopReasonWithException (*thread_sp, description.c_str()));
1854                         }
1855                     }
1856                 }
1857             }
1858             return eStateStopped;
1859         }
1860         break;
1861 
1862     case 'W':
1863     case 'X':
1864         // process exited
1865         return eStateExited;
1866 
1867     default:
1868         break;
1869     }
1870     return eStateInvalid;
1871 }
1872 
1873 void
1874 ProcessGDBRemote::RefreshStateAfterStop ()
1875 {
1876     Mutex::Locker locker(m_thread_list_real.GetMutex());
1877     m_thread_ids.clear();
1878     // Set the thread stop info. It might have a "threads" key whose value is
1879     // a list of all thread IDs in the current process, so m_thread_ids might
1880     // get set.
1881     SetThreadStopInfo (m_last_stop_packet);
1882     // Check to see if SetThreadStopInfo() filled in m_thread_ids?
1883     if (m_thread_ids.empty())
1884     {
1885         // No, we need to fetch the thread list manually
1886         UpdateThreadIDList();
1887     }
1888 
1889     // Let all threads recover from stopping and do any clean up based
1890     // on the previous thread state (if any).
1891     m_thread_list_real.RefreshStateAfterStop();
1892 
1893 }
1894 
1895 Error
1896 ProcessGDBRemote::DoHalt (bool &caused_stop)
1897 {
1898     Error error;
1899 
1900     bool timed_out = false;
1901     Mutex::Locker locker;
1902 
1903     if (m_public_state.GetValue() == eStateAttaching)
1904     {
1905         // We are being asked to halt during an attach. We need to just close
1906         // our file handle and debugserver will go away, and we can be done...
1907         m_gdb_comm.Disconnect();
1908     }
1909     else
1910     {
1911         if (!m_gdb_comm.SendInterrupt (locker, 2, timed_out))
1912         {
1913             if (timed_out)
1914                 error.SetErrorString("timed out sending interrupt packet");
1915             else
1916                 error.SetErrorString("unknown error sending interrupt packet");
1917         }
1918 
1919         caused_stop = m_gdb_comm.GetInterruptWasSent ();
1920     }
1921     return error;
1922 }
1923 
1924 Error
1925 ProcessGDBRemote::DoDetach(bool keep_stopped)
1926 {
1927     Error error;
1928     Log *log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_PROCESS));
1929     if (log)
1930         log->Printf ("ProcessGDBRemote::DoDetach(keep_stopped: %i)", keep_stopped);
1931 
1932     error = m_gdb_comm.Detach (keep_stopped);
1933     if (log)
1934     {
1935         if (error.Success())
1936             log->PutCString ("ProcessGDBRemote::DoDetach() detach packet sent successfully");
1937         else
1938             log->Printf ("ProcessGDBRemote::DoDetach() detach packet send failed: %s", error.AsCString() ? error.AsCString() : "<unknown error>");
1939     }
1940 
1941     if (!error.Success())
1942         return error;
1943 
1944     // Sleep for one second to let the process get all detached...
1945     StopAsyncThread ();
1946 
1947     SetPrivateState (eStateDetached);
1948     ResumePrivateStateThread();
1949 
1950     //KillDebugserverProcess ();
1951     return error;
1952 }
1953 
1954 
1955 Error
1956 ProcessGDBRemote::DoDestroy ()
1957 {
1958     Error error;
1959     Log *log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_PROCESS));
1960     if (log)
1961         log->Printf ("ProcessGDBRemote::DoDestroy()");
1962 
1963     // There is a bug in older iOS debugservers where they don't shut down the process
1964     // they are debugging properly.  If the process is sitting at a breakpoint or an exception,
1965     // this can cause problems with restarting.  So we check to see if any of our threads are stopped
1966     // at a breakpoint, and if so we remove all the breakpoints, resume the process, and THEN
1967     // destroy it again.
1968     //
1969     // Note, we don't have a good way to test the version of debugserver, but I happen to know that
1970     // the set of all the iOS debugservers which don't support GetThreadSuffixSupported() and that of
1971     // the debugservers with this bug are equal.  There really should be a better way to test this!
1972     //
1973     // We also use m_destroy_tried_resuming to make sure we only do this once, if we resume and then halt and
1974     // get called here to destroy again and we're still at a breakpoint or exception, then we should
1975     // just do the straight-forward kill.
1976     //
1977     // And of course, if we weren't able to stop the process by the time we get here, it isn't
1978     // necessary (or helpful) to do any of this.
1979 
1980     if (!m_gdb_comm.GetThreadSuffixSupported() && m_public_state.GetValue() != eStateRunning)
1981     {
1982         PlatformSP platform_sp = GetTarget().GetPlatform();
1983 
1984         // FIXME: These should be ConstStrings so we aren't doing strcmp'ing.
1985         if (platform_sp
1986             && platform_sp->GetName()
1987             && platform_sp->GetName() == PlatformRemoteiOS::GetPluginNameStatic())
1988         {
1989             if (m_destroy_tried_resuming)
1990             {
1991                 if (log)
1992                     log->PutCString ("ProcessGDBRemote::DoDestroy() - Tried resuming to destroy once already, not doing it again.");
1993             }
1994             else
1995             {
1996                 // At present, the plans are discarded and the breakpoints disabled Process::Destroy,
1997                 // but we really need it to happen here and it doesn't matter if we do it twice.
1998                 m_thread_list.DiscardThreadPlans();
1999                 DisableAllBreakpointSites();
2000 
2001                 bool stop_looks_like_crash = false;
2002                 ThreadList &threads = GetThreadList();
2003 
2004                 {
2005                     Mutex::Locker locker(threads.GetMutex());
2006 
2007                     size_t num_threads = threads.GetSize();
2008                     for (size_t i = 0; i < num_threads; i++)
2009                     {
2010                         ThreadSP thread_sp = threads.GetThreadAtIndex(i);
2011                         StopInfoSP stop_info_sp = thread_sp->GetPrivateStopInfo();
2012                         StopReason reason = eStopReasonInvalid;
2013                         if (stop_info_sp)
2014                             reason = stop_info_sp->GetStopReason();
2015                         if (reason == eStopReasonBreakpoint
2016                             || reason == eStopReasonException)
2017                         {
2018                             if (log)
2019                                 log->Printf ("ProcessGDBRemote::DoDestroy() - thread: 0x%4.4" PRIx64 " stopped with reason: %s.",
2020                                              thread_sp->GetProtocolID(),
2021                                              stop_info_sp->GetDescription());
2022                             stop_looks_like_crash = true;
2023                             break;
2024                         }
2025                     }
2026                 }
2027 
2028                 if (stop_looks_like_crash)
2029                 {
2030                     if (log)
2031                         log->PutCString ("ProcessGDBRemote::DoDestroy() - Stopped at a breakpoint, continue and then kill.");
2032                     m_destroy_tried_resuming = true;
2033 
2034                     // If we are going to run again before killing, it would be good to suspend all the threads
2035                     // before resuming so they won't get into more trouble.  Sadly, for the threads stopped with
2036                     // the breakpoint or exception, the exception doesn't get cleared if it is suspended, so we do
2037                     // have to run the risk of letting those threads proceed a bit.
2038 
2039                     {
2040                         Mutex::Locker locker(threads.GetMutex());
2041 
2042                         size_t num_threads = threads.GetSize();
2043                         for (size_t i = 0; i < num_threads; i++)
2044                         {
2045                             ThreadSP thread_sp = threads.GetThreadAtIndex(i);
2046                             StopInfoSP stop_info_sp = thread_sp->GetPrivateStopInfo();
2047                             StopReason reason = eStopReasonInvalid;
2048                             if (stop_info_sp)
2049                                 reason = stop_info_sp->GetStopReason();
2050                             if (reason != eStopReasonBreakpoint
2051                                 && reason != eStopReasonException)
2052                             {
2053                                 if (log)
2054                                     log->Printf ("ProcessGDBRemote::DoDestroy() - Suspending thread: 0x%4.4" PRIx64 " before running.",
2055                                                  thread_sp->GetProtocolID());
2056                                 thread_sp->SetResumeState(eStateSuspended);
2057                             }
2058                         }
2059                     }
2060                     Resume ();
2061                     return Destroy();
2062                 }
2063             }
2064         }
2065     }
2066 
2067     // Interrupt if our inferior is running...
2068     int exit_status = SIGABRT;
2069     std::string exit_string;
2070 
2071     if (m_gdb_comm.IsConnected())
2072     {
2073         if (m_public_state.GetValue() != eStateAttaching)
2074         {
2075 
2076             StringExtractorGDBRemote response;
2077             bool send_async = true;
2078             const uint32_t old_packet_timeout = m_gdb_comm.SetPacketTimeout (3);
2079 
2080             if (m_gdb_comm.SendPacketAndWaitForResponse("k", 1, response, send_async) == GDBRemoteCommunication::PacketResult::Success)
2081             {
2082                 char packet_cmd = response.GetChar(0);
2083 
2084                 if (packet_cmd == 'W' || packet_cmd == 'X')
2085                 {
2086 #if defined(__APPLE__)
2087                     // For Native processes on Mac OS X, we launch through the Host Platform, then hand the process off
2088                     // to debugserver, which becomes the parent process through "PT_ATTACH".  Then when we go to kill
2089                     // the process on Mac OS X we call ptrace(PT_KILL) to kill it, then we call waitpid which returns
2090                     // with no error and the correct status.  But amusingly enough that doesn't seem to actually reap
2091                     // the process, but instead it is left around as a Zombie.  Probably the kernel is in the process of
2092                     // switching ownership back to lldb which was the original parent, and gets confused in the handoff.
2093                     // Anyway, so call waitpid here to finally reap it.
2094                     PlatformSP platform_sp(GetTarget().GetPlatform());
2095                     if (platform_sp && platform_sp->IsHost())
2096                     {
2097                         int status;
2098                         ::pid_t reap_pid;
2099                         reap_pid = waitpid (GetID(), &status, WNOHANG);
2100                         if (log)
2101                             log->Printf ("Reaped pid: %d, status: %d.\n", reap_pid, status);
2102                     }
2103 #endif
2104                     SetLastStopPacket (response);
2105                     ClearThreadIDList ();
2106                     exit_status = response.GetHexU8();
2107                 }
2108                 else
2109                 {
2110                     if (log)
2111                         log->Printf ("ProcessGDBRemote::DoDestroy - got unexpected response to k packet: %s", response.GetStringRef().c_str());
2112                     exit_string.assign("got unexpected response to k packet: ");
2113                     exit_string.append(response.GetStringRef());
2114                 }
2115             }
2116             else
2117             {
2118                 if (log)
2119                     log->Printf ("ProcessGDBRemote::DoDestroy - failed to send k packet");
2120                 exit_string.assign("failed to send the k packet");
2121             }
2122 
2123             m_gdb_comm.SetPacketTimeout(old_packet_timeout);
2124         }
2125         else
2126         {
2127             if (log)
2128                 log->Printf ("ProcessGDBRemote::DoDestroy - killed or interrupted while attaching");
2129             exit_string.assign ("killed or interrupted while attaching.");
2130         }
2131     }
2132     else
2133     {
2134         // If we missed setting the exit status on the way out, do it here.
2135         // NB set exit status can be called multiple times, the first one sets the status.
2136         exit_string.assign("destroying when not connected to debugserver");
2137     }
2138 
2139     SetExitStatus(exit_status, exit_string.c_str());
2140 
2141     StopAsyncThread ();
2142     KillDebugserverProcess ();
2143     return error;
2144 }
2145 
2146 void
2147 ProcessGDBRemote::SetLastStopPacket (const StringExtractorGDBRemote &response)
2148 {
2149     lldb_private::Mutex::Locker locker (m_last_stop_packet_mutex);
2150     const bool did_exec = response.GetStringRef().find(";reason:exec;") != std::string::npos;
2151     if (did_exec)
2152     {
2153         Log *log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_PROCESS));
2154         if (log)
2155             log->Printf ("ProcessGDBRemote::SetLastStopPacket () - detected exec");
2156 
2157         m_thread_list_real.Clear();
2158         m_thread_list.Clear();
2159         BuildDynamicRegisterInfo (true);
2160         m_gdb_comm.ResetDiscoverableSettings();
2161     }
2162     m_last_stop_packet = response;
2163 }
2164 
2165 
2166 //------------------------------------------------------------------
2167 // Process Queries
2168 //------------------------------------------------------------------
2169 
2170 bool
2171 ProcessGDBRemote::IsAlive ()
2172 {
2173     return m_gdb_comm.IsConnected() && m_private_state.GetValue() != eStateExited;
2174 }
2175 
2176 addr_t
2177 ProcessGDBRemote::GetImageInfoAddress()
2178 {
2179     return m_gdb_comm.GetShlibInfoAddr();
2180 }
2181 
2182 //------------------------------------------------------------------
2183 // Process Memory
2184 //------------------------------------------------------------------
2185 size_t
2186 ProcessGDBRemote::DoReadMemory (addr_t addr, void *buf, size_t size, Error &error)
2187 {
2188     GetMaxMemorySize ();
2189     if (size > m_max_memory_size)
2190     {
2191         // Keep memory read sizes down to a sane limit. This function will be
2192         // called multiple times in order to complete the task by
2193         // lldb_private::Process so it is ok to do this.
2194         size = m_max_memory_size;
2195     }
2196 
2197     char packet[64];
2198     int packet_len;
2199     bool binary_memory_read = m_gdb_comm.GetxPacketSupported();
2200     if (binary_memory_read)
2201     {
2202         packet_len = ::snprintf (packet, sizeof(packet), "x0x%" PRIx64 ",0x%" PRIx64, (uint64_t)addr, (uint64_t)size);
2203     }
2204     else
2205     {
2206         packet_len = ::snprintf (packet, sizeof(packet), "m%" PRIx64 ",%" PRIx64, (uint64_t)addr, (uint64_t)size);
2207     }
2208     assert (packet_len + 1 < (int)sizeof(packet));
2209     StringExtractorGDBRemote response;
2210     if (m_gdb_comm.SendPacketAndWaitForResponse(packet, packet_len, response, true) == GDBRemoteCommunication::PacketResult::Success)
2211     {
2212         if (response.IsNormalResponse())
2213         {
2214             error.Clear();
2215             if (binary_memory_read)
2216             {
2217                 // The lower level GDBRemoteCommunication packet receive layer has already de-quoted any
2218                 // 0x7d character escaping that was present in the packet
2219 
2220                 size_t data_received_size = response.GetBytesLeft();
2221                 if (data_received_size > size)
2222                 {
2223                     // Don't write past the end of BUF if the remote debug server gave us too
2224                     // much data for some reason.
2225                     data_received_size = size;
2226                 }
2227                 memcpy (buf, response.GetStringRef().data(), data_received_size);
2228                 return data_received_size;
2229             }
2230             else
2231             {
2232                 return response.GetHexBytes(buf, size, '\xdd');
2233             }
2234         }
2235         else if (response.IsErrorResponse())
2236             error.SetErrorStringWithFormat("memory read failed for 0x%" PRIx64, addr);
2237         else if (response.IsUnsupportedResponse())
2238             error.SetErrorStringWithFormat("GDB server does not support reading memory");
2239         else
2240             error.SetErrorStringWithFormat("unexpected response to GDB server memory read packet '%s': '%s'", packet, response.GetStringRef().c_str());
2241     }
2242     else
2243     {
2244         error.SetErrorStringWithFormat("failed to send packet: '%s'", packet);
2245     }
2246     return 0;
2247 }
2248 
2249 size_t
2250 ProcessGDBRemote::DoWriteMemory (addr_t addr, const void *buf, size_t size, Error &error)
2251 {
2252     GetMaxMemorySize ();
2253     if (size > m_max_memory_size)
2254     {
2255         // Keep memory read sizes down to a sane limit. This function will be
2256         // called multiple times in order to complete the task by
2257         // lldb_private::Process so it is ok to do this.
2258         size = m_max_memory_size;
2259     }
2260 
2261     StreamString packet;
2262     packet.Printf("M%" PRIx64 ",%" PRIx64 ":", addr, (uint64_t)size);
2263     packet.PutBytesAsRawHex8(buf, size, lldb::endian::InlHostByteOrder(), lldb::endian::InlHostByteOrder());
2264     StringExtractorGDBRemote response;
2265     if (m_gdb_comm.SendPacketAndWaitForResponse(packet.GetData(), packet.GetSize(), response, true) == GDBRemoteCommunication::PacketResult::Success)
2266     {
2267         if (response.IsOKResponse())
2268         {
2269             error.Clear();
2270             return size;
2271         }
2272         else if (response.IsErrorResponse())
2273             error.SetErrorStringWithFormat("memory write failed for 0x%" PRIx64, addr);
2274         else if (response.IsUnsupportedResponse())
2275             error.SetErrorStringWithFormat("GDB server does not support writing memory");
2276         else
2277             error.SetErrorStringWithFormat("unexpected response to GDB server memory write packet '%s': '%s'", packet.GetString().c_str(), response.GetStringRef().c_str());
2278     }
2279     else
2280     {
2281         error.SetErrorStringWithFormat("failed to send packet: '%s'", packet.GetString().c_str());
2282     }
2283     return 0;
2284 }
2285 
2286 lldb::addr_t
2287 ProcessGDBRemote::DoAllocateMemory (size_t size, uint32_t permissions, Error &error)
2288 {
2289     lldb_private::Log *log (lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_PROCESS|LIBLLDB_LOG_EXPRESSIONS));
2290     addr_t allocated_addr = LLDB_INVALID_ADDRESS;
2291 
2292     LazyBool supported = m_gdb_comm.SupportsAllocDeallocMemory();
2293     switch (supported)
2294     {
2295         case eLazyBoolCalculate:
2296         case eLazyBoolYes:
2297             allocated_addr = m_gdb_comm.AllocateMemory (size, permissions);
2298             if (allocated_addr != LLDB_INVALID_ADDRESS || supported == eLazyBoolYes)
2299                 return allocated_addr;
2300 
2301         case eLazyBoolNo:
2302             // Call mmap() to create memory in the inferior..
2303             unsigned prot = 0;
2304             if (permissions & lldb::ePermissionsReadable)
2305                 prot |= eMmapProtRead;
2306             if (permissions & lldb::ePermissionsWritable)
2307                 prot |= eMmapProtWrite;
2308             if (permissions & lldb::ePermissionsExecutable)
2309                 prot |= eMmapProtExec;
2310 
2311             if (InferiorCallMmap(this, allocated_addr, 0, size, prot,
2312                                  eMmapFlagsAnon | eMmapFlagsPrivate, -1, 0))
2313                 m_addr_to_mmap_size[allocated_addr] = size;
2314             else
2315             {
2316                 allocated_addr = LLDB_INVALID_ADDRESS;
2317                 if (log)
2318                     log->Printf ("ProcessGDBRemote::%s no direct stub support for memory allocation, and InferiorCallMmap also failed - is stub missing register context save/restore capability?", __FUNCTION__);
2319             }
2320             break;
2321     }
2322 
2323     if (allocated_addr == LLDB_INVALID_ADDRESS)
2324         error.SetErrorStringWithFormat("unable to allocate %" PRIu64 " bytes of memory with permissions %s", (uint64_t)size, GetPermissionsAsCString (permissions));
2325     else
2326         error.Clear();
2327     return allocated_addr;
2328 }
2329 
2330 Error
2331 ProcessGDBRemote::GetMemoryRegionInfo (addr_t load_addr,
2332                                        MemoryRegionInfo &region_info)
2333 {
2334 
2335     Error error (m_gdb_comm.GetMemoryRegionInfo (load_addr, region_info));
2336     return error;
2337 }
2338 
2339 Error
2340 ProcessGDBRemote::GetWatchpointSupportInfo (uint32_t &num)
2341 {
2342 
2343     Error error (m_gdb_comm.GetWatchpointSupportInfo (num));
2344     return error;
2345 }
2346 
2347 Error
2348 ProcessGDBRemote::GetWatchpointSupportInfo (uint32_t &num, bool& after)
2349 {
2350     Error error (m_gdb_comm.GetWatchpointSupportInfo (num, after));
2351     return error;
2352 }
2353 
2354 Error
2355 ProcessGDBRemote::DoDeallocateMemory (lldb::addr_t addr)
2356 {
2357     Error error;
2358     LazyBool supported = m_gdb_comm.SupportsAllocDeallocMemory();
2359 
2360     switch (supported)
2361     {
2362         case eLazyBoolCalculate:
2363             // We should never be deallocating memory without allocating memory
2364             // first so we should never get eLazyBoolCalculate
2365             error.SetErrorString ("tried to deallocate memory without ever allocating memory");
2366             break;
2367 
2368         case eLazyBoolYes:
2369             if (!m_gdb_comm.DeallocateMemory (addr))
2370                 error.SetErrorStringWithFormat("unable to deallocate memory at 0x%" PRIx64, addr);
2371             break;
2372 
2373         case eLazyBoolNo:
2374             // Call munmap() to deallocate memory in the inferior..
2375             {
2376                 MMapMap::iterator pos = m_addr_to_mmap_size.find(addr);
2377                 if (pos != m_addr_to_mmap_size.end() &&
2378                     InferiorCallMunmap(this, addr, pos->second))
2379                     m_addr_to_mmap_size.erase (pos);
2380                 else
2381                     error.SetErrorStringWithFormat("unable to deallocate memory at 0x%" PRIx64, addr);
2382             }
2383             break;
2384     }
2385 
2386     return error;
2387 }
2388 
2389 
2390 //------------------------------------------------------------------
2391 // Process STDIO
2392 //------------------------------------------------------------------
2393 size_t
2394 ProcessGDBRemote::PutSTDIN (const char *src, size_t src_len, Error &error)
2395 {
2396     if (m_stdio_communication.IsConnected())
2397     {
2398         ConnectionStatus status;
2399         m_stdio_communication.Write(src, src_len, status, NULL);
2400     }
2401     return 0;
2402 }
2403 
2404 Error
2405 ProcessGDBRemote::EnableBreakpointSite (BreakpointSite *bp_site)
2406 {
2407     Error error;
2408     assert(bp_site != NULL);
2409 
2410     // Get logging info
2411     Log *log(ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_BREAKPOINTS));
2412     user_id_t site_id = bp_site->GetID();
2413 
2414     // Get the breakpoint address
2415     const addr_t addr = bp_site->GetLoadAddress();
2416 
2417     // Log that a breakpoint was requested
2418     if (log)
2419         log->Printf("ProcessGDBRemote::EnableBreakpointSite (size_id = %" PRIu64 ") address = 0x%" PRIx64, site_id, (uint64_t)addr);
2420 
2421     // Breakpoint already exists and is enabled
2422     if (bp_site->IsEnabled())
2423     {
2424         if (log)
2425             log->Printf("ProcessGDBRemote::EnableBreakpointSite (size_id = %" PRIu64 ") address = 0x%" PRIx64 " -- SUCCESS (already enabled)", site_id, (uint64_t)addr);
2426         return error;
2427     }
2428 
2429     // Get the software breakpoint trap opcode size
2430     const size_t bp_op_size = GetSoftwareBreakpointTrapOpcode(bp_site);
2431 
2432     // SupportsGDBStoppointPacket() simply checks a boolean, indicating if this breakpoint type
2433     // is supported by the remote stub. These are set to true by default, and later set to false
2434     // only after we receive an unimplemented response when sending a breakpoint packet. This means
2435     // initially that unless we were specifically instructed to use a hardware breakpoint, LLDB will
2436     // attempt to set a software breakpoint. HardwareRequired() also queries a boolean variable which
2437     // indicates if the user specifically asked for hardware breakpoints.  If true then we will
2438     // skip over software breakpoints.
2439     if (m_gdb_comm.SupportsGDBStoppointPacket(eBreakpointSoftware) && (!bp_site->HardwareRequired()))
2440     {
2441         // Try to send off a software breakpoint packet ($Z0)
2442         if (m_gdb_comm.SendGDBStoppointTypePacket(eBreakpointSoftware, true, addr, bp_op_size) == 0)
2443         {
2444             // The breakpoint was placed successfully
2445             bp_site->SetEnabled(true);
2446             bp_site->SetType(BreakpointSite::eExternal);
2447             return error;
2448         }
2449 
2450         // SendGDBStoppointTypePacket() will return an error if it was unable to set this
2451         // breakpoint. We need to differentiate between a error specific to placing this breakpoint
2452         // or if we have learned that this breakpoint type is unsupported. To do this, we
2453         // must test the support boolean for this breakpoint type to see if it now indicates that
2454         // this breakpoint type is unsupported.  If they are still supported then we should return
2455         // with the error code.  If they are now unsupported, then we would like to fall through
2456         // and try another form of breakpoint.
2457         if (m_gdb_comm.SupportsGDBStoppointPacket(eBreakpointSoftware))
2458             return error;
2459 
2460         // We reach here when software breakpoints have been found to be unsupported. For future
2461         // calls to set a breakpoint, we will not attempt to set a breakpoint with a type that is
2462         // known not to be supported.
2463         if (log)
2464             log->Printf("Software breakpoints are unsupported");
2465 
2466         // So we will fall through and try a hardware breakpoint
2467     }
2468 
2469     // The process of setting a hardware breakpoint is much the same as above.  We check the
2470     // supported boolean for this breakpoint type, and if it is thought to be supported then we
2471     // will try to set this breakpoint with a hardware breakpoint.
2472     if (m_gdb_comm.SupportsGDBStoppointPacket(eBreakpointHardware))
2473     {
2474         // Try to send off a hardware breakpoint packet ($Z1)
2475         if (m_gdb_comm.SendGDBStoppointTypePacket(eBreakpointHardware, true, addr, bp_op_size) == 0)
2476         {
2477             // The breakpoint was placed successfully
2478             bp_site->SetEnabled(true);
2479             bp_site->SetType(BreakpointSite::eHardware);
2480             return error;
2481         }
2482 
2483         // Check if the error was something other then an unsupported breakpoint type
2484         if (m_gdb_comm.SupportsGDBStoppointPacket(eBreakpointHardware))
2485         {
2486             // Unable to set this hardware breakpoint
2487             error.SetErrorString("failed to set hardware breakpoint (hardware breakpoint resources might be exhausted or unavailable)");
2488             return error;
2489         }
2490 
2491         // We will reach here when the stub gives an unsupported response to a hardware breakpoint
2492         if (log)
2493             log->Printf("Hardware breakpoints are unsupported");
2494 
2495         // Finally we will falling through to a #trap style breakpoint
2496     }
2497 
2498     // Don't fall through when hardware breakpoints were specifically requested
2499     if (bp_site->HardwareRequired())
2500     {
2501         error.SetErrorString("hardware breakpoints are not supported");
2502         return error;
2503     }
2504 
2505     // As a last resort we want to place a manual breakpoint. An instruction
2506     // is placed into the process memory using memory write packets.
2507     return EnableSoftwareBreakpoint(bp_site);
2508 }
2509 
2510 Error
2511 ProcessGDBRemote::DisableBreakpointSite (BreakpointSite *bp_site)
2512 {
2513     Error error;
2514     assert (bp_site != NULL);
2515     addr_t addr = bp_site->GetLoadAddress();
2516     user_id_t site_id = bp_site->GetID();
2517     Log *log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_BREAKPOINTS));
2518     if (log)
2519         log->Printf ("ProcessGDBRemote::DisableBreakpointSite (site_id = %" PRIu64 ") addr = 0x%8.8" PRIx64, site_id, (uint64_t)addr);
2520 
2521     if (bp_site->IsEnabled())
2522     {
2523         const size_t bp_op_size = GetSoftwareBreakpointTrapOpcode (bp_site);
2524 
2525         BreakpointSite::Type bp_type = bp_site->GetType();
2526         switch (bp_type)
2527         {
2528         case BreakpointSite::eSoftware:
2529             error = DisableSoftwareBreakpoint (bp_site);
2530             break;
2531 
2532         case BreakpointSite::eHardware:
2533             if (m_gdb_comm.SendGDBStoppointTypePacket(eBreakpointHardware, false, addr, bp_op_size))
2534                 error.SetErrorToGenericError();
2535             break;
2536 
2537         case BreakpointSite::eExternal:
2538             {
2539                 GDBStoppointType stoppoint_type;
2540                 if (bp_site->IsHardware())
2541                     stoppoint_type = eBreakpointHardware;
2542                 else
2543                     stoppoint_type = eBreakpointSoftware;
2544 
2545                 if (m_gdb_comm.SendGDBStoppointTypePacket(stoppoint_type, false, addr, bp_op_size))
2546                 error.SetErrorToGenericError();
2547             }
2548             break;
2549         }
2550         if (error.Success())
2551             bp_site->SetEnabled(false);
2552     }
2553     else
2554     {
2555         if (log)
2556             log->Printf ("ProcessGDBRemote::DisableBreakpointSite (site_id = %" PRIu64 ") addr = 0x%8.8" PRIx64 " -- SUCCESS (already disabled)", site_id, (uint64_t)addr);
2557         return error;
2558     }
2559 
2560     if (error.Success())
2561         error.SetErrorToGenericError();
2562     return error;
2563 }
2564 
2565 // Pre-requisite: wp != NULL.
2566 static GDBStoppointType
2567 GetGDBStoppointType (Watchpoint *wp)
2568 {
2569     assert(wp);
2570     bool watch_read = wp->WatchpointRead();
2571     bool watch_write = wp->WatchpointWrite();
2572 
2573     // watch_read and watch_write cannot both be false.
2574     assert(watch_read || watch_write);
2575     if (watch_read && watch_write)
2576         return eWatchpointReadWrite;
2577     else if (watch_read)
2578         return eWatchpointRead;
2579     else // Must be watch_write, then.
2580         return eWatchpointWrite;
2581 }
2582 
2583 Error
2584 ProcessGDBRemote::EnableWatchpoint (Watchpoint *wp, bool notify)
2585 {
2586     Error error;
2587     if (wp)
2588     {
2589         user_id_t watchID = wp->GetID();
2590         addr_t addr = wp->GetLoadAddress();
2591         Log *log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_WATCHPOINTS));
2592         if (log)
2593             log->Printf ("ProcessGDBRemote::EnableWatchpoint(watchID = %" PRIu64 ")", watchID);
2594         if (wp->IsEnabled())
2595         {
2596             if (log)
2597                 log->Printf("ProcessGDBRemote::EnableWatchpoint(watchID = %" PRIu64 ") addr = 0x%8.8" PRIx64 ": watchpoint already enabled.", watchID, (uint64_t)addr);
2598             return error;
2599         }
2600 
2601         GDBStoppointType type = GetGDBStoppointType(wp);
2602         // Pass down an appropriate z/Z packet...
2603         if (m_gdb_comm.SupportsGDBStoppointPacket (type))
2604         {
2605             if (m_gdb_comm.SendGDBStoppointTypePacket(type, true, addr, wp->GetByteSize()) == 0)
2606             {
2607                 wp->SetEnabled(true, notify);
2608                 return error;
2609             }
2610             else
2611                 error.SetErrorString("sending gdb watchpoint packet failed");
2612         }
2613         else
2614             error.SetErrorString("watchpoints not supported");
2615     }
2616     else
2617     {
2618         error.SetErrorString("Watchpoint argument was NULL.");
2619     }
2620     if (error.Success())
2621         error.SetErrorToGenericError();
2622     return error;
2623 }
2624 
2625 Error
2626 ProcessGDBRemote::DisableWatchpoint (Watchpoint *wp, bool notify)
2627 {
2628     Error error;
2629     if (wp)
2630     {
2631         user_id_t watchID = wp->GetID();
2632 
2633         Log *log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_WATCHPOINTS));
2634 
2635         addr_t addr = wp->GetLoadAddress();
2636 
2637         if (log)
2638             log->Printf ("ProcessGDBRemote::DisableWatchpoint (watchID = %" PRIu64 ") addr = 0x%8.8" PRIx64, watchID, (uint64_t)addr);
2639 
2640         if (!wp->IsEnabled())
2641         {
2642             if (log)
2643                 log->Printf ("ProcessGDBRemote::DisableWatchpoint (watchID = %" PRIu64 ") addr = 0x%8.8" PRIx64 " -- SUCCESS (already disabled)", watchID, (uint64_t)addr);
2644             // See also 'class WatchpointSentry' within StopInfo.cpp.
2645             // This disabling attempt might come from the user-supplied actions, we'll route it in order for
2646             // the watchpoint object to intelligently process this action.
2647             wp->SetEnabled(false, notify);
2648             return error;
2649         }
2650 
2651         if (wp->IsHardware())
2652         {
2653             GDBStoppointType type = GetGDBStoppointType(wp);
2654             // Pass down an appropriate z/Z packet...
2655             if (m_gdb_comm.SendGDBStoppointTypePacket(type, false, addr, wp->GetByteSize()) == 0)
2656             {
2657                 wp->SetEnabled(false, notify);
2658                 return error;
2659             }
2660             else
2661                 error.SetErrorString("sending gdb watchpoint packet failed");
2662         }
2663         // TODO: clear software watchpoints if we implement them
2664     }
2665     else
2666     {
2667         error.SetErrorString("Watchpoint argument was NULL.");
2668     }
2669     if (error.Success())
2670         error.SetErrorToGenericError();
2671     return error;
2672 }
2673 
2674 void
2675 ProcessGDBRemote::Clear()
2676 {
2677     m_flags = 0;
2678     m_thread_list_real.Clear();
2679     m_thread_list.Clear();
2680 }
2681 
2682 Error
2683 ProcessGDBRemote::DoSignal (int signo)
2684 {
2685     Error error;
2686     Log *log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_PROCESS));
2687     if (log)
2688         log->Printf ("ProcessGDBRemote::DoSignal (signal = %d)", signo);
2689 
2690     if (!m_gdb_comm.SendAsyncSignal (signo))
2691         error.SetErrorStringWithFormat("failed to send signal %i", signo);
2692     return error;
2693 }
2694 
2695 Error
2696 ProcessGDBRemote::LaunchAndConnectToDebugserver (const ProcessInfo &process_info)
2697 {
2698     Error error;
2699     if (m_debugserver_pid == LLDB_INVALID_PROCESS_ID)
2700     {
2701         // If we locate debugserver, keep that located version around
2702         static FileSpec g_debugserver_file_spec;
2703 
2704         ProcessLaunchInfo debugserver_launch_info;
2705         debugserver_launch_info.SetMonitorProcessCallback (MonitorDebugserverProcess, this, false);
2706         debugserver_launch_info.SetUserID(process_info.GetUserID());
2707 
2708 #if defined (__APPLE__) && (defined (__arm__) || defined (__arm64__) || defined (__aarch64__))
2709         // On iOS, still do a local connection using a random port
2710         const char *hostname = "127.0.0.1";
2711         uint16_t port = get_random_port ();
2712 #else
2713         // Set hostname being NULL to do the reverse connect where debugserver
2714         // will bind to port zero and it will communicate back to us the port
2715         // that we will connect to
2716         const char *hostname = NULL;
2717         uint16_t port = 0;
2718 #endif
2719 
2720         error = m_gdb_comm.StartDebugserverProcess (hostname,
2721                                                     port,
2722                                                     debugserver_launch_info,
2723                                                     port);
2724 
2725         if (error.Success ())
2726             m_debugserver_pid = debugserver_launch_info.GetProcessID();
2727         else
2728             m_debugserver_pid = LLDB_INVALID_PROCESS_ID;
2729 
2730         if (m_debugserver_pid != LLDB_INVALID_PROCESS_ID)
2731             StartAsyncThread ();
2732 
2733         if (error.Fail())
2734         {
2735             Log *log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PROCESS));
2736 
2737             if (log)
2738                 log->Printf("failed to start debugserver process: %s", error.AsCString());
2739             return error;
2740         }
2741 
2742         if (m_gdb_comm.IsConnected())
2743         {
2744             // Finish the connection process by doing the handshake without connecting (send NULL URL)
2745             ConnectToDebugserver (NULL);
2746         }
2747         else
2748         {
2749             StreamString connect_url;
2750             connect_url.Printf("connect://%s:%u", hostname, port);
2751             error = ConnectToDebugserver (connect_url.GetString().c_str());
2752         }
2753 
2754     }
2755     return error;
2756 }
2757 
2758 bool
2759 ProcessGDBRemote::MonitorDebugserverProcess
2760 (
2761     void *callback_baton,
2762     lldb::pid_t debugserver_pid,
2763     bool exited,        // True if the process did exit
2764     int signo,          // Zero for no signal
2765     int exit_status     // Exit value of process if signal is zero
2766 )
2767 {
2768     // The baton is a "ProcessGDBRemote *". Now this class might be gone
2769     // and might not exist anymore, so we need to carefully try to get the
2770     // target for this process first since we have a race condition when
2771     // we are done running between getting the notice that the inferior
2772     // process has died and the debugserver that was debugging this process.
2773     // In our test suite, we are also continually running process after
2774     // process, so we must be very careful to make sure:
2775     // 1 - process object hasn't been deleted already
2776     // 2 - that a new process object hasn't been recreated in its place
2777 
2778     // "debugserver_pid" argument passed in is the process ID for
2779     // debugserver that we are tracking...
2780     Log *log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_PROCESS));
2781 
2782     ProcessGDBRemote *process = (ProcessGDBRemote *)callback_baton;
2783 
2784     // Get a shared pointer to the target that has a matching process pointer.
2785     // This target could be gone, or the target could already have a new process
2786     // object inside of it
2787     TargetSP target_sp (Debugger::FindTargetWithProcess(process));
2788 
2789     if (log)
2790         log->Printf ("ProcessGDBRemote::MonitorDebugserverProcess (baton=%p, pid=%" PRIu64 ", signo=%i (0x%x), exit_status=%i)", callback_baton, debugserver_pid, signo, signo, exit_status);
2791 
2792     if (target_sp)
2793     {
2794         // We found a process in a target that matches, but another thread
2795         // might be in the process of launching a new process that will
2796         // soon replace it, so get a shared pointer to the process so we
2797         // can keep it alive.
2798         ProcessSP process_sp (target_sp->GetProcessSP());
2799         // Now we have a shared pointer to the process that can't go away on us
2800         // so we now make sure it was the same as the one passed in, and also make
2801         // sure that our previous "process *" didn't get deleted and have a new
2802         // "process *" created in its place with the same pointer. To verify this
2803         // we make sure the process has our debugserver process ID. If we pass all
2804         // of these tests, then we are sure that this process is the one we were
2805         // looking for.
2806         if (process_sp && process == process_sp.get() && process->m_debugserver_pid == debugserver_pid)
2807         {
2808             // Sleep for a half a second to make sure our inferior process has
2809             // time to set its exit status before we set it incorrectly when
2810             // both the debugserver and the inferior process shut down.
2811             usleep (500000);
2812             // If our process hasn't yet exited, debugserver might have died.
2813             // If the process did exit, the we are reaping it.
2814             const StateType state = process->GetState();
2815 
2816             if (process->m_debugserver_pid != LLDB_INVALID_PROCESS_ID &&
2817                 state != eStateInvalid &&
2818                 state != eStateUnloaded &&
2819                 state != eStateExited &&
2820                 state != eStateDetached)
2821             {
2822                 char error_str[1024];
2823                 if (signo)
2824                 {
2825                     const char *signal_cstr = process->GetUnixSignals().GetSignalAsCString (signo);
2826                     if (signal_cstr)
2827                         ::snprintf (error_str, sizeof (error_str), DEBUGSERVER_BASENAME " died with signal %s", signal_cstr);
2828                     else
2829                         ::snprintf (error_str, sizeof (error_str), DEBUGSERVER_BASENAME " died with signal %i", signo);
2830                 }
2831                 else
2832                 {
2833                     ::snprintf (error_str, sizeof (error_str), DEBUGSERVER_BASENAME " died with an exit status of 0x%8.8x", exit_status);
2834                 }
2835 
2836                 process->SetExitStatus (-1, error_str);
2837             }
2838             // Debugserver has exited we need to let our ProcessGDBRemote
2839             // know that it no longer has a debugserver instance
2840             process->m_debugserver_pid = LLDB_INVALID_PROCESS_ID;
2841         }
2842     }
2843     return true;
2844 }
2845 
2846 void
2847 ProcessGDBRemote::KillDebugserverProcess ()
2848 {
2849     m_gdb_comm.Disconnect();
2850     if (m_debugserver_pid != LLDB_INVALID_PROCESS_ID)
2851     {
2852         Host::Kill (m_debugserver_pid, SIGINT);
2853         m_debugserver_pid = LLDB_INVALID_PROCESS_ID;
2854     }
2855 }
2856 
2857 void
2858 ProcessGDBRemote::Initialize()
2859 {
2860     static bool g_initialized = false;
2861 
2862     if (g_initialized == false)
2863     {
2864         g_initialized = true;
2865         PluginManager::RegisterPlugin (GetPluginNameStatic(),
2866                                        GetPluginDescriptionStatic(),
2867                                        CreateInstance,
2868                                        DebuggerInitialize);
2869 
2870         Log::Callbacks log_callbacks = {
2871             ProcessGDBRemoteLog::DisableLog,
2872             ProcessGDBRemoteLog::EnableLog,
2873             ProcessGDBRemoteLog::ListLogCategories
2874         };
2875 
2876         Log::RegisterLogChannel (ProcessGDBRemote::GetPluginNameStatic(), log_callbacks);
2877     }
2878 }
2879 
2880 void
2881 ProcessGDBRemote::DebuggerInitialize (lldb_private::Debugger &debugger)
2882 {
2883     if (!PluginManager::GetSettingForProcessPlugin(debugger, PluginProperties::GetSettingName()))
2884     {
2885         const bool is_global_setting = true;
2886         PluginManager::CreateSettingForProcessPlugin (debugger,
2887                                                       GetGlobalPluginProperties()->GetValueProperties(),
2888                                                       ConstString ("Properties for the gdb-remote process plug-in."),
2889                                                       is_global_setting);
2890     }
2891 }
2892 
2893 bool
2894 ProcessGDBRemote::StartAsyncThread ()
2895 {
2896     Log *log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_PROCESS));
2897 
2898     if (log)
2899         log->Printf ("ProcessGDBRemote::%s ()", __FUNCTION__);
2900 
2901     Mutex::Locker start_locker(m_async_thread_state_mutex);
2902     if (m_async_thread_state == eAsyncThreadNotStarted)
2903     {
2904         // Create a thread that watches our internal state and controls which
2905         // events make it to clients (into the DCProcess event queue).
2906         m_async_thread = Host::ThreadCreate ("<lldb.process.gdb-remote.async>", ProcessGDBRemote::AsyncThread, this, NULL);
2907         if (IS_VALID_LLDB_HOST_THREAD(m_async_thread))
2908         {
2909             m_async_thread_state = eAsyncThreadRunning;
2910             return true;
2911         }
2912         else
2913             return false;
2914     }
2915     else
2916     {
2917         // Somebody tried to start the async thread while it was either being started or stopped.  If the former, and
2918         // it started up successfully, then say all's well.  Otherwise it is an error, since we aren't going to restart it.
2919         if (log)
2920             log->Printf ("ProcessGDBRemote::%s () - Called when Async thread was in state: %d.", __FUNCTION__, m_async_thread_state);
2921         if (m_async_thread_state == eAsyncThreadRunning)
2922             return true;
2923         else
2924             return false;
2925     }
2926 }
2927 
2928 void
2929 ProcessGDBRemote::StopAsyncThread ()
2930 {
2931     Log *log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_PROCESS));
2932 
2933     if (log)
2934         log->Printf ("ProcessGDBRemote::%s ()", __FUNCTION__);
2935 
2936     Mutex::Locker start_locker(m_async_thread_state_mutex);
2937     if (m_async_thread_state == eAsyncThreadRunning)
2938     {
2939         m_async_broadcaster.BroadcastEvent (eBroadcastBitAsyncThreadShouldExit);
2940 
2941         //  This will shut down the async thread.
2942         m_gdb_comm.Disconnect();    // Disconnect from the debug server.
2943 
2944         // Stop the stdio thread
2945         if (IS_VALID_LLDB_HOST_THREAD(m_async_thread))
2946         {
2947             Host::ThreadJoin (m_async_thread, NULL, NULL);
2948         }
2949         m_async_thread_state = eAsyncThreadDone;
2950     }
2951     else
2952     {
2953         if (log)
2954             log->Printf ("ProcessGDBRemote::%s () - Called when Async thread was in state: %d.", __FUNCTION__, m_async_thread_state);
2955     }
2956 }
2957 
2958 
2959 thread_result_t
2960 ProcessGDBRemote::AsyncThread (void *arg)
2961 {
2962     ProcessGDBRemote *process = (ProcessGDBRemote*) arg;
2963 
2964     Log *log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PROCESS));
2965     if (log)
2966         log->Printf ("ProcessGDBRemote::%s (arg = %p, pid = %" PRIu64 ") thread starting...", __FUNCTION__, arg, process->GetID());
2967 
2968     Listener listener ("ProcessGDBRemote::AsyncThread");
2969     EventSP event_sp;
2970     const uint32_t desired_event_mask = eBroadcastBitAsyncContinue |
2971                                         eBroadcastBitAsyncThreadShouldExit;
2972 
2973     if (listener.StartListeningForEvents (&process->m_async_broadcaster, desired_event_mask) == desired_event_mask)
2974     {
2975         listener.StartListeningForEvents (&process->m_gdb_comm, Communication::eBroadcastBitReadThreadDidExit);
2976 
2977         bool done = false;
2978         while (!done)
2979         {
2980             if (log)
2981                 log->Printf ("ProcessGDBRemote::%s (arg = %p, pid = %" PRIu64 ") listener.WaitForEvent (NULL, event_sp)...", __FUNCTION__, arg, process->GetID());
2982             if (listener.WaitForEvent (NULL, event_sp))
2983             {
2984                 const uint32_t event_type = event_sp->GetType();
2985                 if (event_sp->BroadcasterIs (&process->m_async_broadcaster))
2986                 {
2987                     if (log)
2988                         log->Printf ("ProcessGDBRemote::%s (arg = %p, pid = %" PRIu64 ") Got an event of type: %d...", __FUNCTION__, arg, process->GetID(), event_type);
2989 
2990                     switch (event_type)
2991                     {
2992                         case eBroadcastBitAsyncContinue:
2993                             {
2994                                 const EventDataBytes *continue_packet = EventDataBytes::GetEventDataFromEvent(event_sp.get());
2995 
2996                                 if (continue_packet)
2997                                 {
2998                                     const char *continue_cstr = (const char *)continue_packet->GetBytes ();
2999                                     const size_t continue_cstr_len = continue_packet->GetByteSize ();
3000                                     if (log)
3001                                         log->Printf ("ProcessGDBRemote::%s (arg = %p, pid = %" PRIu64 ") got eBroadcastBitAsyncContinue: %s", __FUNCTION__, arg, process->GetID(), continue_cstr);
3002 
3003                                     if (::strstr (continue_cstr, "vAttach") == NULL)
3004                                         process->SetPrivateState(eStateRunning);
3005                                     StringExtractorGDBRemote response;
3006                                     StateType stop_state = process->GetGDBRemote().SendContinuePacketAndWaitForResponse (process, continue_cstr, continue_cstr_len, response);
3007 
3008                                     // We need to immediately clear the thread ID list so we are sure to get a valid list of threads.
3009                                     // The thread ID list might be contained within the "response", or the stop reply packet that
3010                                     // caused the stop. So clear it now before we give the stop reply packet to the process
3011                                     // using the process->SetLastStopPacket()...
3012                                     process->ClearThreadIDList ();
3013 
3014                                     switch (stop_state)
3015                                     {
3016                                     case eStateStopped:
3017                                     case eStateCrashed:
3018                                     case eStateSuspended:
3019                                         process->SetLastStopPacket (response);
3020                                         process->SetPrivateState (stop_state);
3021                                         break;
3022 
3023                                     case eStateExited:
3024                                     {
3025                                         process->SetLastStopPacket (response);
3026                                         process->ClearThreadIDList();
3027                                         response.SetFilePos(1);
3028 
3029                                         int exit_status = response.GetHexU8();
3030                                         const char *desc_cstr = NULL;
3031                                         StringExtractor extractor;
3032                                         std::string desc_string;
3033                                         if (response.GetBytesLeft() > 0 && response.GetChar('-') == ';')
3034                                         {
3035                                             std::string desc_token;
3036                                             while (response.GetNameColonValue (desc_token, desc_string))
3037                                             {
3038                                                 if (desc_token == "description")
3039                                                 {
3040                                                     extractor.GetStringRef().swap(desc_string);
3041                                                     extractor.SetFilePos(0);
3042                                                     extractor.GetHexByteString (desc_string);
3043                                                     desc_cstr = desc_string.c_str();
3044                                                 }
3045                                             }
3046                                         }
3047                                         process->SetExitStatus(exit_status, desc_cstr);
3048                                         done = true;
3049                                         break;
3050                                     }
3051                                     case eStateInvalid:
3052                                         process->SetExitStatus(-1, "lost connection");
3053                                         break;
3054 
3055                                     default:
3056                                         process->SetPrivateState (stop_state);
3057                                         break;
3058                                     }
3059                                 }
3060                             }
3061                             break;
3062 
3063                         case eBroadcastBitAsyncThreadShouldExit:
3064                             if (log)
3065                                 log->Printf ("ProcessGDBRemote::%s (arg = %p, pid = %" PRIu64 ") got eBroadcastBitAsyncThreadShouldExit...", __FUNCTION__, arg, process->GetID());
3066                             done = true;
3067                             break;
3068 
3069                         default:
3070                             if (log)
3071                                 log->Printf ("ProcessGDBRemote::%s (arg = %p, pid = %" PRIu64 ") got unknown event 0x%8.8x", __FUNCTION__, arg, process->GetID(), event_type);
3072                             done = true;
3073                             break;
3074                     }
3075                 }
3076                 else if (event_sp->BroadcasterIs (&process->m_gdb_comm))
3077                 {
3078                     if (event_type & Communication::eBroadcastBitReadThreadDidExit)
3079                     {
3080                         process->SetExitStatus (-1, "lost connection");
3081                         done = true;
3082                     }
3083                 }
3084             }
3085             else
3086             {
3087                 if (log)
3088                     log->Printf ("ProcessGDBRemote::%s (arg = %p, pid = %" PRIu64 ") listener.WaitForEvent (NULL, event_sp) => false", __FUNCTION__, arg, process->GetID());
3089                 done = true;
3090             }
3091         }
3092     }
3093 
3094     if (log)
3095         log->Printf ("ProcessGDBRemote::%s (arg = %p, pid = %" PRIu64 ") thread exiting...", __FUNCTION__, arg, process->GetID());
3096 
3097     process->m_async_thread = LLDB_INVALID_HOST_THREAD;
3098     return NULL;
3099 }
3100 
3101 //uint32_t
3102 //ProcessGDBRemote::ListProcessesMatchingName (const char *name, StringList &matches, std::vector<lldb::pid_t> &pids)
3103 //{
3104 //    // If we are planning to launch the debugserver remotely, then we need to fire up a debugserver
3105 //    // process and ask it for the list of processes. But if we are local, we can let the Host do it.
3106 //    if (m_local_debugserver)
3107 //    {
3108 //        return Host::ListProcessesMatchingName (name, matches, pids);
3109 //    }
3110 //    else
3111 //    {
3112 //        // FIXME: Implement talking to the remote debugserver.
3113 //        return 0;
3114 //    }
3115 //
3116 //}
3117 //
3118 bool
3119 ProcessGDBRemote::NewThreadNotifyBreakpointHit (void *baton,
3120                              lldb_private::StoppointCallbackContext *context,
3121                              lldb::user_id_t break_id,
3122                              lldb::user_id_t break_loc_id)
3123 {
3124     // I don't think I have to do anything here, just make sure I notice the new thread when it starts to
3125     // run so I can stop it if that's what I want to do.
3126     Log *log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP));
3127     if (log)
3128         log->Printf("Hit New Thread Notification breakpoint.");
3129     return false;
3130 }
3131 
3132 
3133 bool
3134 ProcessGDBRemote::StartNoticingNewThreads()
3135 {
3136     Log *log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP));
3137     if (m_thread_create_bp_sp)
3138     {
3139         if (log && log->GetVerbose())
3140             log->Printf("Enabled noticing new thread breakpoint.");
3141         m_thread_create_bp_sp->SetEnabled(true);
3142     }
3143     else
3144     {
3145         PlatformSP platform_sp (m_target.GetPlatform());
3146         if (platform_sp)
3147         {
3148             m_thread_create_bp_sp = platform_sp->SetThreadCreationBreakpoint(m_target);
3149             if (m_thread_create_bp_sp)
3150             {
3151                 if (log && log->GetVerbose())
3152                     log->Printf("Successfully created new thread notification breakpoint %i", m_thread_create_bp_sp->GetID());
3153                 m_thread_create_bp_sp->SetCallback (ProcessGDBRemote::NewThreadNotifyBreakpointHit, this, true);
3154             }
3155             else
3156             {
3157                 if (log)
3158                     log->Printf("Failed to create new thread notification breakpoint.");
3159             }
3160         }
3161     }
3162     return m_thread_create_bp_sp.get() != NULL;
3163 }
3164 
3165 bool
3166 ProcessGDBRemote::StopNoticingNewThreads()
3167 {
3168     Log *log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP));
3169     if (log && log->GetVerbose())
3170         log->Printf ("Disabling new thread notification breakpoint.");
3171 
3172     if (m_thread_create_bp_sp)
3173         m_thread_create_bp_sp->SetEnabled(false);
3174 
3175     return true;
3176 }
3177 
3178 lldb_private::DynamicLoader *
3179 ProcessGDBRemote::GetDynamicLoader ()
3180 {
3181     if (m_dyld_ap.get() == NULL)
3182         m_dyld_ap.reset (DynamicLoader::FindPlugin(this, NULL));
3183     return m_dyld_ap.get();
3184 }
3185 
3186 Error
3187 ProcessGDBRemote::SendEventData(const char *data)
3188 {
3189     int return_value;
3190     bool was_supported;
3191 
3192     Error error;
3193 
3194     return_value = m_gdb_comm.SendLaunchEventDataPacket (data, &was_supported);
3195     if (return_value != 0)
3196     {
3197         if (!was_supported)
3198             error.SetErrorString("Sending events is not supported for this process.");
3199         else
3200             error.SetErrorStringWithFormat("Error sending event data: %d.", return_value);
3201     }
3202     return error;
3203 }
3204 
3205 const DataBufferSP
3206 ProcessGDBRemote::GetAuxvData()
3207 {
3208     DataBufferSP buf;
3209     if (m_gdb_comm.GetQXferAuxvReadSupported())
3210     {
3211         std::string response_string;
3212         if (m_gdb_comm.SendPacketsAndConcatenateResponses("qXfer:auxv:read::", response_string) == GDBRemoteCommunication::PacketResult::Success)
3213             buf.reset(new DataBufferHeap(response_string.c_str(), response_string.length()));
3214     }
3215     return buf;
3216 }
3217 
3218 StructuredData::ObjectSP
3219 ProcessGDBRemote::GetExtendedInfoForThread (lldb::tid_t tid)
3220 {
3221     StructuredData::ObjectSP object_sp;
3222 
3223     if (m_gdb_comm.GetThreadExtendedInfoSupported())
3224     {
3225         StructuredData::ObjectSP args_dict(new StructuredData::Dictionary());
3226         SystemRuntime *runtime = GetSystemRuntime();
3227         if (runtime)
3228         {
3229             runtime->AddThreadExtendedInfoPacketHints (args_dict);
3230         }
3231         args_dict->GetAsDictionary()->AddIntegerItem ("thread", tid);
3232 
3233         StreamString packet;
3234         packet << "jThreadExtendedInfo:";
3235         args_dict->Dump (packet);
3236 
3237         // FIXME the final character of a JSON dictionary, '}', is the escape
3238         // character in gdb-remote binary mode.  lldb currently doesn't escape
3239         // these characters in its packet output -- so we add the quoted version
3240         // of the } character here manually in case we talk to a debugserver which
3241         // un-escapes the characters at packet read time.
3242         packet << (char) (0x7d ^ 0x20);
3243 
3244         StringExtractorGDBRemote response;
3245         if (m_gdb_comm.SendPacketAndWaitForResponse(packet.GetData(), packet.GetSize(), response, false) == GDBRemoteCommunication::PacketResult::Success)
3246         {
3247             StringExtractorGDBRemote::ResponseType response_type = response.GetResponseType();
3248             if (response_type == StringExtractorGDBRemote::eResponse)
3249             {
3250                 if (!response.Empty())
3251                 {
3252                     // The packet has already had the 0x7d xor quoting stripped out at the
3253                     // GDBRemoteCommunication packet receive level.
3254                     object_sp = StructuredData::ParseJSON (response.GetStringRef());
3255                 }
3256             }
3257         }
3258     }
3259     return object_sp;
3260 }
3261 
3262 // Establish the largest memory read/write payloads we should use.
3263 // If the remote stub has a max packet size, stay under that size.
3264 //
3265 // If the remote stub's max packet size is crazy large, use a
3266 // reasonable largeish default.
3267 //
3268 // If the remote stub doesn't advertise a max packet size, use a
3269 // conservative default.
3270 
3271 void
3272 ProcessGDBRemote::GetMaxMemorySize()
3273 {
3274     const uint64_t reasonable_largeish_default = 128 * 1024;
3275     const uint64_t conservative_default = 512;
3276 
3277     if (m_max_memory_size == 0)
3278     {
3279         uint64_t stub_max_size = m_gdb_comm.GetRemoteMaxPacketSize();
3280         if (stub_max_size != UINT64_MAX && stub_max_size != 0)
3281         {
3282             // Save the stub's claimed maximum packet size
3283             m_remote_stub_max_memory_size = stub_max_size;
3284 
3285             // Even if the stub says it can support ginormous packets,
3286             // don't exceed our reasonable largeish default packet size.
3287             if (stub_max_size > reasonable_largeish_default)
3288             {
3289                 stub_max_size = reasonable_largeish_default;
3290             }
3291 
3292             m_max_memory_size = stub_max_size;
3293         }
3294         else
3295         {
3296             m_max_memory_size = conservative_default;
3297         }
3298     }
3299 }
3300 
3301 void
3302 ProcessGDBRemote::SetUserSpecifiedMaxMemoryTransferSize (uint64_t user_specified_max)
3303 {
3304     if (user_specified_max != 0)
3305     {
3306         GetMaxMemorySize ();
3307 
3308         if (m_remote_stub_max_memory_size != 0)
3309         {
3310             if (m_remote_stub_max_memory_size < user_specified_max)
3311             {
3312                 m_max_memory_size = m_remote_stub_max_memory_size;   // user specified a packet size too big, go as big
3313                                                                      // as the remote stub says we can go.
3314             }
3315             else
3316             {
3317                 m_max_memory_size = user_specified_max;             // user's packet size is good
3318             }
3319         }
3320         else
3321         {
3322             m_max_memory_size = user_specified_max;                 // user's packet size is probably fine
3323         }
3324     }
3325 }
3326 
3327 class CommandObjectProcessGDBRemotePacketHistory : public CommandObjectParsed
3328 {
3329 private:
3330 
3331 public:
3332     CommandObjectProcessGDBRemotePacketHistory(CommandInterpreter &interpreter) :
3333     CommandObjectParsed (interpreter,
3334                          "process plugin packet history",
3335                          "Dumps the packet history buffer. ",
3336                          NULL)
3337     {
3338     }
3339 
3340     ~CommandObjectProcessGDBRemotePacketHistory ()
3341     {
3342     }
3343 
3344     bool
3345     DoExecute (Args& command, CommandReturnObject &result)
3346     {
3347         const size_t argc = command.GetArgumentCount();
3348         if (argc == 0)
3349         {
3350             ProcessGDBRemote *process = (ProcessGDBRemote *)m_interpreter.GetExecutionContext().GetProcessPtr();
3351             if (process)
3352             {
3353                 process->GetGDBRemote().DumpHistory(result.GetOutputStream());
3354                 result.SetStatus (eReturnStatusSuccessFinishResult);
3355                 return true;
3356             }
3357         }
3358         else
3359         {
3360             result.AppendErrorWithFormat ("'%s' takes no arguments", m_cmd_name.c_str());
3361         }
3362         result.SetStatus (eReturnStatusFailed);
3363         return false;
3364     }
3365 };
3366 
3367 class CommandObjectProcessGDBRemotePacketXferSize : public CommandObjectParsed
3368 {
3369 private:
3370 
3371 public:
3372     CommandObjectProcessGDBRemotePacketXferSize(CommandInterpreter &interpreter) :
3373     CommandObjectParsed (interpreter,
3374                          "process plugin packet xfer-size",
3375                          "Maximum size that lldb will try to read/write one one chunk.",
3376                          NULL)
3377     {
3378     }
3379 
3380     ~CommandObjectProcessGDBRemotePacketXferSize ()
3381     {
3382     }
3383 
3384     bool
3385     DoExecute (Args& command, CommandReturnObject &result)
3386     {
3387         const size_t argc = command.GetArgumentCount();
3388         if (argc == 0)
3389         {
3390             result.AppendErrorWithFormat ("'%s' takes an argument to specify the max amount to be transferred when reading/writing", m_cmd_name.c_str());
3391             result.SetStatus (eReturnStatusFailed);
3392             return false;
3393         }
3394 
3395         ProcessGDBRemote *process = (ProcessGDBRemote *)m_interpreter.GetExecutionContext().GetProcessPtr();
3396         if (process)
3397         {
3398             const char *packet_size = command.GetArgumentAtIndex(0);
3399             errno = 0;
3400             uint64_t user_specified_max = strtoul (packet_size, NULL, 10);
3401             if (errno == 0 && user_specified_max != 0)
3402             {
3403                 process->SetUserSpecifiedMaxMemoryTransferSize (user_specified_max);
3404                 result.SetStatus (eReturnStatusSuccessFinishResult);
3405                 return true;
3406             }
3407         }
3408         result.SetStatus (eReturnStatusFailed);
3409         return false;
3410     }
3411 };
3412 
3413 
3414 class CommandObjectProcessGDBRemotePacketSend : public CommandObjectParsed
3415 {
3416 private:
3417 
3418 public:
3419     CommandObjectProcessGDBRemotePacketSend(CommandInterpreter &interpreter) :
3420         CommandObjectParsed (interpreter,
3421                              "process plugin packet send",
3422                              "Send a custom packet through the GDB remote protocol and print the answer. "
3423                              "The packet header and footer will automatically be added to the packet prior to sending and stripped from the result.",
3424                              NULL)
3425     {
3426     }
3427 
3428     ~CommandObjectProcessGDBRemotePacketSend ()
3429     {
3430     }
3431 
3432     bool
3433     DoExecute (Args& command, CommandReturnObject &result)
3434     {
3435         const size_t argc = command.GetArgumentCount();
3436         if (argc == 0)
3437         {
3438             result.AppendErrorWithFormat ("'%s' takes a one or more packet content arguments", m_cmd_name.c_str());
3439             result.SetStatus (eReturnStatusFailed);
3440             return false;
3441         }
3442 
3443         ProcessGDBRemote *process = (ProcessGDBRemote *)m_interpreter.GetExecutionContext().GetProcessPtr();
3444         if (process)
3445         {
3446             for (size_t i=0; i<argc; ++ i)
3447             {
3448                 const char *packet_cstr = command.GetArgumentAtIndex(0);
3449                 bool send_async = true;
3450                 StringExtractorGDBRemote response;
3451                 process->GetGDBRemote().SendPacketAndWaitForResponse(packet_cstr, response, send_async);
3452                 result.SetStatus (eReturnStatusSuccessFinishResult);
3453                 Stream &output_strm = result.GetOutputStream();
3454                 output_strm.Printf ("  packet: %s\n", packet_cstr);
3455                 std::string &response_str = response.GetStringRef();
3456 
3457                 if (strstr(packet_cstr, "qGetProfileData") != NULL)
3458                 {
3459                     response_str = process->GetGDBRemote().HarmonizeThreadIdsForProfileData(process, response);
3460                 }
3461 
3462                 if (response_str.empty())
3463                     output_strm.PutCString ("response: \nerror: UNIMPLEMENTED\n");
3464                 else
3465                     output_strm.Printf ("response: %s\n", response.GetStringRef().c_str());
3466             }
3467         }
3468         return true;
3469     }
3470 };
3471 
3472 class CommandObjectProcessGDBRemotePacketMonitor : public CommandObjectRaw
3473 {
3474 private:
3475 
3476 public:
3477     CommandObjectProcessGDBRemotePacketMonitor(CommandInterpreter &interpreter) :
3478         CommandObjectRaw (interpreter,
3479                          "process plugin packet monitor",
3480                          "Send a qRcmd packet through the GDB remote protocol and print the response."
3481                          "The argument passed to this command will be hex encoded into a valid 'qRcmd' packet, sent and the response will be printed.",
3482                          NULL)
3483     {
3484     }
3485 
3486     ~CommandObjectProcessGDBRemotePacketMonitor ()
3487     {
3488     }
3489 
3490     bool
3491     DoExecute (const char *command, CommandReturnObject &result)
3492     {
3493         if (command == NULL || command[0] == '\0')
3494         {
3495             result.AppendErrorWithFormat ("'%s' takes a command string argument", m_cmd_name.c_str());
3496             result.SetStatus (eReturnStatusFailed);
3497             return false;
3498         }
3499 
3500         ProcessGDBRemote *process = (ProcessGDBRemote *)m_interpreter.GetExecutionContext().GetProcessPtr();
3501         if (process)
3502         {
3503             StreamString packet;
3504             packet.PutCString("qRcmd,");
3505             packet.PutBytesAsRawHex8(command, strlen(command));
3506             const char *packet_cstr = packet.GetString().c_str();
3507 
3508             bool send_async = true;
3509             StringExtractorGDBRemote response;
3510             process->GetGDBRemote().SendPacketAndWaitForResponse(packet_cstr, response, send_async);
3511             result.SetStatus (eReturnStatusSuccessFinishResult);
3512             Stream &output_strm = result.GetOutputStream();
3513             output_strm.Printf ("  packet: %s\n", packet_cstr);
3514             const std::string &response_str = response.GetStringRef();
3515 
3516             if (response_str.empty())
3517                 output_strm.PutCString ("response: \nerror: UNIMPLEMENTED\n");
3518             else
3519                 output_strm.Printf ("response: %s\n", response.GetStringRef().c_str());
3520         }
3521         return true;
3522     }
3523 };
3524 
3525 class CommandObjectProcessGDBRemotePacket : public CommandObjectMultiword
3526 {
3527 private:
3528 
3529 public:
3530     CommandObjectProcessGDBRemotePacket(CommandInterpreter &interpreter) :
3531         CommandObjectMultiword (interpreter,
3532                                 "process plugin packet",
3533                                 "Commands that deal with GDB remote packets.",
3534                                 NULL)
3535     {
3536         LoadSubCommand ("history", CommandObjectSP (new CommandObjectProcessGDBRemotePacketHistory (interpreter)));
3537         LoadSubCommand ("send", CommandObjectSP (new CommandObjectProcessGDBRemotePacketSend (interpreter)));
3538         LoadSubCommand ("monitor", CommandObjectSP (new CommandObjectProcessGDBRemotePacketMonitor (interpreter)));
3539         LoadSubCommand ("xfer-size", CommandObjectSP (new CommandObjectProcessGDBRemotePacketXferSize (interpreter)));
3540     }
3541 
3542     ~CommandObjectProcessGDBRemotePacket ()
3543     {
3544     }
3545 };
3546 
3547 class CommandObjectMultiwordProcessGDBRemote : public CommandObjectMultiword
3548 {
3549 public:
3550     CommandObjectMultiwordProcessGDBRemote (CommandInterpreter &interpreter) :
3551         CommandObjectMultiword (interpreter,
3552                                 "process plugin",
3553                                 "A set of commands for operating on a ProcessGDBRemote process.",
3554                                 "process plugin <subcommand> [<subcommand-options>]")
3555     {
3556         LoadSubCommand ("packet", CommandObjectSP (new CommandObjectProcessGDBRemotePacket    (interpreter)));
3557     }
3558 
3559     ~CommandObjectMultiwordProcessGDBRemote ()
3560     {
3561     }
3562 };
3563 
3564 CommandObject *
3565 ProcessGDBRemote::GetPluginCommandObject()
3566 {
3567     if (!m_command_sp)
3568         m_command_sp.reset (new CommandObjectMultiwordProcessGDBRemote (GetTarget().GetDebugger().GetCommandInterpreter()));
3569     return m_command_sp.get();
3570 }
3571