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