xref: /llvm-project/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunication.cpp (revision 040975472c140b6ab451541e7ba5b94b6bb9fed4)
1 //===-- GDBRemoteCommunication.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 
11 #include "GDBRemoteCommunication.h"
12 
13 // C Includes
14 #include <limits.h>
15 #include <string.h>
16 #include <sys/stat.h>
17 
18 // C++ Includes
19 // Other libraries and framework includes
20 #include "lldb/Core/Log.h"
21 #include "lldb/Core/RegularExpression.h"
22 #include "lldb/Core/StreamFile.h"
23 #include "lldb/Core/StreamString.h"
24 #include "lldb/Host/ConnectionFileDescriptor.h"
25 #include "lldb/Host/FileSpec.h"
26 #include "lldb/Host/Host.h"
27 #include "lldb/Host/HostInfo.h"
28 #include "lldb/Host/Pipe.h"
29 #include "lldb/Host/Socket.h"
30 #include "lldb/Host/StringConvert.h"
31 #include "lldb/Host/ThreadLauncher.h"
32 #include "lldb/Host/TimeValue.h"
33 #include "lldb/Target/Process.h"
34 #include "llvm/ADT/SmallString.h"
35 
36 // Project includes
37 #include "ProcessGDBRemoteLog.h"
38 
39 #if defined(__APPLE__)
40 # define DEBUGSERVER_BASENAME    "debugserver"
41 #else
42 # define DEBUGSERVER_BASENAME    "lldb-server"
43 #endif
44 
45 #if defined (HAVE_LIBCOMPRESSION)
46 #include <compression.h>
47 #endif
48 
49 #if defined (HAVE_LIBZ)
50 #include <zlib.h>
51 #endif
52 
53 using namespace lldb;
54 using namespace lldb_private;
55 using namespace lldb_private::process_gdb_remote;
56 
57 GDBRemoteCommunication::History::History (uint32_t size) :
58     m_packets(),
59     m_curr_idx (0),
60     m_total_packet_count (0),
61     m_dumped_to_log (false)
62 {
63     m_packets.resize(size);
64 }
65 
66 GDBRemoteCommunication::History::~History ()
67 {
68 }
69 
70 void
71 GDBRemoteCommunication::History::AddPacket (char packet_char,
72                                             PacketType type,
73                                             uint32_t bytes_transmitted)
74 {
75     const size_t size = m_packets.size();
76     if (size > 0)
77     {
78         const uint32_t idx = GetNextIndex();
79         m_packets[idx].packet.assign (1, packet_char);
80         m_packets[idx].type = type;
81         m_packets[idx].bytes_transmitted = bytes_transmitted;
82         m_packets[idx].packet_idx = m_total_packet_count;
83         m_packets[idx].tid = Host::GetCurrentThreadID();
84     }
85 }
86 
87 void
88 GDBRemoteCommunication::History::AddPacket (const std::string &src,
89                                             uint32_t src_len,
90                                             PacketType type,
91                                             uint32_t bytes_transmitted)
92 {
93     const size_t size = m_packets.size();
94     if (size > 0)
95     {
96         const uint32_t idx = GetNextIndex();
97         m_packets[idx].packet.assign (src, 0, src_len);
98         m_packets[idx].type = type;
99         m_packets[idx].bytes_transmitted = bytes_transmitted;
100         m_packets[idx].packet_idx = m_total_packet_count;
101         m_packets[idx].tid = Host::GetCurrentThreadID();
102     }
103 }
104 
105 void
106 GDBRemoteCommunication::History::Dump (Stream &strm) const
107 {
108     const uint32_t size = GetNumPacketsInHistory ();
109     const uint32_t first_idx = GetFirstSavedPacketIndex ();
110     const uint32_t stop_idx = m_curr_idx + size;
111     for (uint32_t i = first_idx;  i < stop_idx; ++i)
112     {
113         const uint32_t idx = NormalizeIndex (i);
114         const Entry &entry = m_packets[idx];
115         if (entry.type == ePacketTypeInvalid || entry.packet.empty())
116             break;
117         strm.Printf ("history[%u] tid=0x%4.4" PRIx64 " <%4u> %s packet: %s\n",
118                      entry.packet_idx,
119                      entry.tid,
120                      entry.bytes_transmitted,
121                      (entry.type == ePacketTypeSend) ? "send" : "read",
122                      entry.packet.c_str());
123     }
124 }
125 
126 void
127 GDBRemoteCommunication::History::Dump (Log *log) const
128 {
129     if (log && !m_dumped_to_log)
130     {
131         m_dumped_to_log = true;
132         const uint32_t size = GetNumPacketsInHistory ();
133         const uint32_t first_idx = GetFirstSavedPacketIndex ();
134         const uint32_t stop_idx = m_curr_idx + size;
135         for (uint32_t i = first_idx;  i < stop_idx; ++i)
136         {
137             const uint32_t idx = NormalizeIndex (i);
138             const Entry &entry = m_packets[idx];
139             if (entry.type == ePacketTypeInvalid || entry.packet.empty())
140                 break;
141             log->Printf ("history[%u] tid=0x%4.4" PRIx64 " <%4u> %s packet: %s",
142                          entry.packet_idx,
143                          entry.tid,
144                          entry.bytes_transmitted,
145                          (entry.type == ePacketTypeSend) ? "send" : "read",
146                          entry.packet.c_str());
147         }
148     }
149 }
150 
151 //----------------------------------------------------------------------
152 // GDBRemoteCommunication constructor
153 //----------------------------------------------------------------------
154 GDBRemoteCommunication::GDBRemoteCommunication(const char *comm_name,
155                                                const char *listener_name) :
156     Communication(comm_name),
157 #ifdef LLDB_CONFIGURATION_DEBUG
158     m_packet_timeout (1000),
159 #else
160     m_packet_timeout (1),
161 #endif
162     m_echo_number(0),
163     m_supports_qEcho (eLazyBoolCalculate),
164     m_sequence_mutex (Mutex::eMutexTypeRecursive),
165     m_public_is_running (false),
166     m_private_is_running (false),
167     m_history (512),
168     m_send_acks (true),
169     m_compression_type (CompressionType::None),
170     m_listen_url ()
171 {
172 }
173 
174 //----------------------------------------------------------------------
175 // Destructor
176 //----------------------------------------------------------------------
177 GDBRemoteCommunication::~GDBRemoteCommunication()
178 {
179     if (IsConnected())
180     {
181         Disconnect();
182     }
183 
184     // Stop the communications read thread which is used to parse all
185     // incoming packets.  This function will block until the read
186     // thread returns.
187     if (m_read_thread_enabled)
188         StopReadThread();
189 }
190 
191 char
192 GDBRemoteCommunication::CalculcateChecksum (const char *payload, size_t payload_length)
193 {
194     int checksum = 0;
195 
196     for (size_t i = 0; i < payload_length; ++i)
197         checksum += payload[i];
198 
199     return checksum & 255;
200 }
201 
202 size_t
203 GDBRemoteCommunication::SendAck ()
204 {
205     Log *log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PACKETS));
206     ConnectionStatus status = eConnectionStatusSuccess;
207     char ch = '+';
208     const size_t bytes_written = Write (&ch, 1, status, NULL);
209     if (log)
210         log->Printf ("<%4" PRIu64 "> send packet: %c", (uint64_t)bytes_written, ch);
211     m_history.AddPacket (ch, History::ePacketTypeSend, bytes_written);
212     return bytes_written;
213 }
214 
215 size_t
216 GDBRemoteCommunication::SendNack ()
217 {
218     Log *log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PACKETS));
219     ConnectionStatus status = eConnectionStatusSuccess;
220     char ch = '-';
221     const size_t bytes_written = Write (&ch, 1, status, NULL);
222     if (log)
223         log->Printf("<%4" PRIu64 "> send packet: %c", (uint64_t)bytes_written, ch);
224     m_history.AddPacket (ch, History::ePacketTypeSend, bytes_written);
225     return bytes_written;
226 }
227 
228 GDBRemoteCommunication::PacketResult
229 GDBRemoteCommunication::SendPacket (const char *payload, size_t payload_length)
230 {
231     Mutex::Locker locker(m_sequence_mutex);
232     return SendPacketNoLock (payload, payload_length);
233 }
234 
235 GDBRemoteCommunication::PacketResult
236 GDBRemoteCommunication::SendPacketNoLock (const char *payload, size_t payload_length)
237 {
238     if (IsConnected())
239     {
240         StreamString packet(0, 4, eByteOrderBig);
241 
242         packet.PutChar('$');
243         packet.Write (payload, payload_length);
244         packet.PutChar('#');
245         packet.PutHex8(CalculcateChecksum (payload, payload_length));
246 
247         Log *log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PACKETS));
248         ConnectionStatus status = eConnectionStatusSuccess;
249         const char *packet_data = packet.GetData();
250         const size_t packet_length = packet.GetSize();
251         size_t bytes_written = Write (packet_data, packet_length, status, NULL);
252         if (log)
253         {
254             size_t binary_start_offset = 0;
255             if (strncmp(packet_data, "$vFile:pwrite:", strlen("$vFile:pwrite:")) == 0)
256             {
257                 const char *first_comma = strchr(packet_data, ',');
258                 if (first_comma)
259                 {
260                     const char *second_comma = strchr(first_comma + 1, ',');
261                     if (second_comma)
262                         binary_start_offset = second_comma - packet_data + 1;
263                 }
264             }
265 
266             // If logging was just enabled and we have history, then dump out what
267             // we have to the log so we get the historical context. The Dump() call that
268             // logs all of the packet will set a boolean so that we don't dump this more
269             // than once
270             if (!m_history.DidDumpToLog ())
271                 m_history.Dump (log);
272 
273             if (binary_start_offset)
274             {
275                 StreamString strm;
276                 // Print non binary data header
277                 strm.Printf("<%4" PRIu64 "> send packet: %.*s", (uint64_t)bytes_written, (int)binary_start_offset, packet_data);
278                 const uint8_t *p;
279                 // Print binary data exactly as sent
280                 for (p = (const uint8_t*)packet_data + binary_start_offset; *p != '#'; ++p)
281                     strm.Printf("\\x%2.2x", *p);
282                 // Print the checksum
283                 strm.Printf("%*s", (int)3, p);
284                 log->PutCString(strm.GetString().c_str());
285             }
286             else
287                 log->Printf("<%4" PRIu64 "> send packet: %.*s", (uint64_t)bytes_written, (int)packet_length, packet_data);
288         }
289 
290         m_history.AddPacket (packet.GetString(), packet_length, History::ePacketTypeSend, bytes_written);
291 
292 
293         if (bytes_written == packet_length)
294         {
295             if (GetSendAcks ())
296                 return GetAck ();
297             else
298                 return PacketResult::Success;
299         }
300         else
301         {
302             if (log)
303                 log->Printf ("error: failed to send packet: %.*s", (int)packet_length, packet_data);
304         }
305     }
306     return PacketResult::ErrorSendFailed;
307 }
308 
309 GDBRemoteCommunication::PacketResult
310 GDBRemoteCommunication::GetAck ()
311 {
312     StringExtractorGDBRemote packet;
313     PacketResult result = ReadPacket (packet, GetPacketTimeoutInMicroSeconds (), false);
314     if (result == PacketResult::Success)
315     {
316         if (packet.GetResponseType() == StringExtractorGDBRemote::ResponseType::eAck)
317             return PacketResult::Success;
318         else
319             return PacketResult::ErrorSendAck;
320     }
321     return result;
322 }
323 
324 bool
325 GDBRemoteCommunication::GetSequenceMutex (Mutex::Locker& locker, const char *failure_message)
326 {
327     if (IsRunning())
328         return locker.TryLock (m_sequence_mutex, failure_message);
329 
330     locker.Lock (m_sequence_mutex);
331     return true;
332 }
333 
334 
335 bool
336 GDBRemoteCommunication::WaitForNotRunningPrivate (const TimeValue *timeout_ptr)
337 {
338     return m_private_is_running.WaitForValueEqualTo (false, timeout_ptr, NULL);
339 }
340 
341 GDBRemoteCommunication::PacketResult
342 GDBRemoteCommunication::ReadPacket (StringExtractorGDBRemote &response, uint32_t timeout_usec, bool sync_on_timeout)
343 {
344    if (m_read_thread_enabled)
345        return PopPacketFromQueue (response, timeout_usec);
346    else
347        return WaitForPacketWithTimeoutMicroSecondsNoLock (response, timeout_usec, sync_on_timeout);
348 }
349 
350 
351 // This function is called when a packet is requested.
352 // A whole packet is popped from the packet queue and returned to the caller.
353 // Packets are placed into this queue from the communication read thread.
354 // See GDBRemoteCommunication::AppendBytesToCache.
355 GDBRemoteCommunication::PacketResult
356 GDBRemoteCommunication::PopPacketFromQueue (StringExtractorGDBRemote &response, uint32_t timeout_usec)
357 {
358     // Calculate absolute timeout value
359     TimeValue timeout = TimeValue::Now();
360     timeout.OffsetWithMicroSeconds(timeout_usec);
361 
362     do
363     {
364         // scope for the mutex
365         {
366             // lock down the packet queue
367             Mutex::Locker locker(m_packet_queue_mutex);
368 
369             // Wait on condition variable.
370             if (m_packet_queue.size() == 0)
371                 m_condition_queue_not_empty.Wait(m_packet_queue_mutex, &timeout);
372 
373             if (m_packet_queue.size() > 0)
374             {
375                 // get the front element of the queue
376                 response = m_packet_queue.front();
377 
378                 // remove the front element
379                 m_packet_queue.pop();
380 
381                 // we got a packet
382                 return PacketResult::Success;
383             }
384          }
385 
386          // Disconnected
387          if (!IsConnected())
388              return PacketResult::ErrorDisconnected;
389 
390       // Loop while not timed out
391     } while (TimeValue::Now() < timeout);
392 
393     return PacketResult::ErrorReplyTimeout;
394 }
395 
396 
397 GDBRemoteCommunication::PacketResult
398 GDBRemoteCommunication::WaitForPacketWithTimeoutMicroSecondsNoLock (StringExtractorGDBRemote &packet, uint32_t timeout_usec, bool sync_on_timeout)
399 {
400     uint8_t buffer[8192];
401     Error error;
402 
403     Log *log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PACKETS | GDBR_LOG_VERBOSE));
404 
405     // Check for a packet from our cache first without trying any reading...
406     if (CheckForPacket(NULL, 0, packet) != PacketType::Invalid)
407         return PacketResult::Success;
408 
409     bool timed_out = false;
410     bool disconnected = false;
411     while (IsConnected() && !timed_out)
412     {
413         lldb::ConnectionStatus status = eConnectionStatusNoConnection;
414         size_t bytes_read = Read (buffer, sizeof(buffer), timeout_usec, status, &error);
415 
416         if (log)
417             log->Printf ("%s: Read (buffer, (sizeof(buffer), timeout_usec = 0x%x, status = %s, error = %s) => bytes_read = %" PRIu64,
418                          __PRETTY_FUNCTION__,
419                          timeout_usec,
420                          Communication::ConnectionStatusAsCString (status),
421                          error.AsCString(),
422                          (uint64_t)bytes_read);
423 
424         if (bytes_read > 0)
425         {
426             if (CheckForPacket(buffer, bytes_read, packet) != PacketType::Invalid)
427                 return PacketResult::Success;
428         }
429         else
430         {
431             switch (status)
432             {
433             case eConnectionStatusTimedOut:
434             case eConnectionStatusInterrupted:
435                 if (sync_on_timeout)
436                 {
437                     //------------------------------------------------------------------
438                     /// Sync the remote GDB server and make sure we get a response that
439                     /// corresponds to what we send.
440                     ///
441                     /// Sends a "qEcho" packet and makes sure it gets the exact packet
442                     /// echoed back. If the qEcho packet isn't supported, we send a qC
443                     /// packet and make sure we get a valid thread ID back. We use the
444                     /// "qC" packet since its response if very unique: is responds with
445                     /// "QC%x" where %x is the thread ID of the current thread. This
446                     /// makes the response unique enough from other packet responses to
447                     /// ensure we are back on track.
448                     ///
449                     /// This packet is needed after we time out sending a packet so we
450                     /// can ensure that we are getting the response for the packet we
451                     /// are sending. There are no sequence IDs in the GDB remote
452                     /// protocol (there used to be, but they are not supported anymore)
453                     /// so if you timeout sending packet "abc", you might then send
454                     /// packet "cde" and get the response for the previous "abc" packet.
455                     /// Many responses are "OK" or "" (unsupported) or "EXX" (error) so
456                     /// many responses for packets can look like responses for other
457                     /// packets. So if we timeout, we need to ensure that we can get
458                     /// back on track. If we can't get back on track, we must
459                     /// disconnect.
460                     //------------------------------------------------------------------
461                     bool sync_success = false;
462                     bool got_actual_response = false;
463                     // We timed out, we need to sync back up with the
464                     char echo_packet[32];
465                     int echo_packet_len = 0;
466                     RegularExpression response_regex;
467 
468                     if (m_supports_qEcho == eLazyBoolYes)
469                     {
470                         echo_packet_len = ::snprintf (echo_packet, sizeof(echo_packet), "qEcho:%u", ++m_echo_number);
471                         std::string regex_str = "^";
472                         regex_str += echo_packet;
473                         regex_str += "$";
474                         response_regex.Compile(regex_str.c_str());
475                     }
476                     else
477                     {
478                         echo_packet_len = ::snprintf (echo_packet, sizeof(echo_packet), "qC");
479                         response_regex.Compile("^QC[0-9A-Fa-f]+$");
480                     }
481 
482                     PacketResult echo_packet_result = SendPacketNoLock (echo_packet, echo_packet_len);
483                     if (echo_packet_result == PacketResult::Success)
484                     {
485                         const uint32_t max_retries = 3;
486                         uint32_t successful_responses = 0;
487                         for (uint32_t i=0; i<max_retries; ++i)
488                         {
489                             StringExtractorGDBRemote echo_response;
490                             echo_packet_result = WaitForPacketWithTimeoutMicroSecondsNoLock (echo_response, timeout_usec, false);
491                             if (echo_packet_result == PacketResult::Success)
492                             {
493                                 ++successful_responses;
494                                 if (response_regex.Execute(echo_response.GetStringRef().c_str()))
495                                 {
496                                     sync_success = true;
497                                     break;
498                                 }
499                                 else if (successful_responses == 1)
500                                 {
501                                     // We got something else back as the first successful response, it probably is
502                                     // the  response to the packet we actually wanted, so copy it over if this
503                                     // is the first success and continue to try to get the qEcho response
504                                     packet = echo_response;
505                                     got_actual_response = true;
506                                 }
507                             }
508                             else if (echo_packet_result == PacketResult::ErrorReplyTimeout)
509                                 continue;   // Packet timed out, continue waiting for a response
510                             else
511                                 break;      // Something else went wrong getting the packet back, we failed and are done trying
512                         }
513                     }
514 
515                     // We weren't able to sync back up with the server, we must abort otherwise
516                     // all responses might not be from the right packets...
517                     if (sync_success)
518                     {
519                         // We timed out, but were able to recover
520                         if (got_actual_response)
521                         {
522                             // We initially timed out, but we did get a response that came in before the successful
523                             // reply to our qEcho packet, so lets say everything is fine...
524                             return PacketResult::Success;
525                         }
526                     }
527                     else
528                     {
529                         disconnected = true;
530                         Disconnect();
531                     }
532                 }
533                 timed_out = true;
534                 break;
535             case eConnectionStatusSuccess:
536                 //printf ("status = success but error = %s\n", error.AsCString("<invalid>"));
537                 break;
538 
539             case eConnectionStatusEndOfFile:
540             case eConnectionStatusNoConnection:
541             case eConnectionStatusLostConnection:
542             case eConnectionStatusError:
543                 disconnected = true;
544                 Disconnect();
545                 break;
546             }
547         }
548     }
549     packet.Clear ();
550     if (disconnected)
551         return PacketResult::ErrorDisconnected;
552     if (timed_out)
553         return PacketResult::ErrorReplyTimeout;
554     else
555         return PacketResult::ErrorReplyFailed;
556 }
557 
558 bool
559 GDBRemoteCommunication::DecompressPacket ()
560 {
561     Log *log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PACKETS));
562 
563     if (!CompressionIsEnabled())
564         return true;
565 
566     size_t pkt_size = m_bytes.size();
567 
568     // Smallest possible compressed packet is $N#00 - an uncompressed empty reply, most commonly indicating
569     // an unsupported packet.  Anything less than 5 characters, it's definitely not a compressed packet.
570     if (pkt_size < 5)
571         return true;
572 
573     if (m_bytes[0] != '$' && m_bytes[0] != '%')
574         return true;
575     if (m_bytes[1] != 'C' && m_bytes[1] != 'N')
576         return true;
577 
578     size_t hash_mark_idx = m_bytes.find ('#');
579     if (hash_mark_idx == std::string::npos)
580         return true;
581     if (hash_mark_idx + 2 >= m_bytes.size())
582         return true;
583 
584     if (!::isxdigit (m_bytes[hash_mark_idx + 1]) || !::isxdigit (m_bytes[hash_mark_idx + 2]))
585         return true;
586 
587     size_t content_length = pkt_size - 5;    // not counting '$', 'C' | 'N', '#', & the two hex checksum chars
588     size_t content_start = 2;                // The first character of the compressed/not-compressed text of the packet
589     size_t checksum_idx = hash_mark_idx + 1; // The first character of the two hex checksum characters
590 
591     // Normally size_of_first_packet == m_bytes.size() but m_bytes may contain multiple packets.
592     // size_of_first_packet is the size of the initial packet which we'll replace with the decompressed
593     // version of, leaving the rest of m_bytes unmodified.
594     size_t size_of_first_packet = hash_mark_idx + 3;
595 
596     // Compressed packets ("$C") start with a base10 number which is the size of the uncompressed payload,
597     // then a : and then the compressed data.  e.g. $C1024:<binary>#00
598     // Update content_start and content_length to only include the <binary> part of the packet.
599 
600     uint64_t decompressed_bufsize = ULONG_MAX;
601     if (m_bytes[1] == 'C')
602     {
603         size_t i = content_start;
604         while (i < hash_mark_idx && isdigit(m_bytes[i]))
605             i++;
606         if (i < hash_mark_idx && m_bytes[i] == ':')
607         {
608             i++;
609             content_start = i;
610             content_length = hash_mark_idx - content_start;
611             std::string bufsize_str (m_bytes.data() + 2, i - 2 - 1);
612             errno = 0;
613             decompressed_bufsize = ::strtoul (bufsize_str.c_str(), NULL, 10);
614             if (errno != 0 || decompressed_bufsize == ULONG_MAX)
615             {
616                 m_bytes.erase (0, size_of_first_packet);
617                 return false;
618             }
619         }
620     }
621 
622     if (GetSendAcks ())
623     {
624         char packet_checksum_cstr[3];
625         packet_checksum_cstr[0] = m_bytes[checksum_idx];
626         packet_checksum_cstr[1] = m_bytes[checksum_idx + 1];
627         packet_checksum_cstr[2] = '\0';
628         long packet_checksum = strtol (packet_checksum_cstr, NULL, 16);
629 
630         long actual_checksum = CalculcateChecksum (m_bytes.data() + 1, hash_mark_idx - 1);
631         bool success = packet_checksum == actual_checksum;
632         if (!success)
633         {
634             if (log)
635                 log->Printf ("error: checksum mismatch: %.*s expected 0x%2.2x, got 0x%2.2x",
636                              (int)(pkt_size),
637                              m_bytes.c_str(),
638                              (uint8_t)packet_checksum,
639                              (uint8_t)actual_checksum);
640         }
641         // Send the ack or nack if needed
642         if (!success)
643         {
644             SendNack();
645             m_bytes.erase (0, size_of_first_packet);
646             return false;
647         }
648         else
649         {
650             SendAck();
651         }
652     }
653 
654     if (m_bytes[1] == 'N')
655     {
656         // This packet was not compressed -- delete the 'N' character at the
657         // start and the packet may be processed as-is.
658         m_bytes.erase(1, 1);
659         return true;
660     }
661 
662     // Reverse the gdb-remote binary escaping that was done to the compressed text to
663     // guard characters like '$', '#', '}', etc.
664     std::vector<uint8_t> unescaped_content;
665     unescaped_content.reserve (content_length);
666     size_t i = content_start;
667     while (i < hash_mark_idx)
668     {
669         if (m_bytes[i] == '}')
670         {
671             i++;
672             unescaped_content.push_back (m_bytes[i] ^ 0x20);
673         }
674         else
675         {
676             unescaped_content.push_back (m_bytes[i]);
677         }
678         i++;
679     }
680 
681     uint8_t *decompressed_buffer = nullptr;
682     size_t decompressed_bytes = 0;
683 
684     if (decompressed_bufsize != ULONG_MAX)
685     {
686         decompressed_buffer = (uint8_t *) malloc (decompressed_bufsize + 1);
687         if (decompressed_buffer == nullptr)
688         {
689             m_bytes.erase (0, size_of_first_packet);
690             return false;
691         }
692 
693     }
694 
695 #if defined (HAVE_LIBCOMPRESSION)
696     // libcompression is weak linked so check that compression_decode_buffer() is available
697     if (compression_decode_buffer != NULL &&
698         (m_compression_type == CompressionType::ZlibDeflate
699          || m_compression_type == CompressionType::LZFSE
700          || m_compression_type == CompressionType::LZ4))
701     {
702         compression_algorithm compression_type;
703         if (m_compression_type == CompressionType::ZlibDeflate)
704             compression_type = COMPRESSION_ZLIB;
705         else if (m_compression_type == CompressionType::LZFSE)
706             compression_type = COMPRESSION_LZFSE;
707         else if (m_compression_type == CompressionType::LZ4)
708             compression_type = COMPRESSION_LZ4_RAW;
709         else if (m_compression_type == CompressionType::LZMA)
710             compression_type = COMPRESSION_LZMA;
711 
712 
713         // If we have the expected size of the decompressed payload, we can allocate
714         // the right-sized buffer and do it.  If we don't have that information, we'll
715         // need to try decoding into a big buffer and if the buffer wasn't big enough,
716         // increase it and try again.
717 
718         if (decompressed_bufsize != ULONG_MAX && decompressed_buffer != nullptr)
719         {
720             decompressed_bytes = compression_decode_buffer (decompressed_buffer, decompressed_bufsize + 10 ,
721                                                         (uint8_t*) unescaped_content.data(),
722                                                         unescaped_content.size(),
723                                                         NULL,
724                                                         compression_type);
725         }
726     }
727 #endif
728 
729 #if defined (HAVE_LIBZ)
730     if (decompressed_bytes == 0
731         && decompressed_bufsize != ULONG_MAX
732         && decompressed_buffer != nullptr
733         && m_compression_type == CompressionType::ZlibDeflate)
734     {
735         z_stream stream;
736         memset (&stream, 0, sizeof (z_stream));
737         stream.next_in = (Bytef *) unescaped_content.data();
738         stream.avail_in = (uInt) unescaped_content.size();
739         stream.total_in = 0;
740         stream.next_out = (Bytef *) decompressed_buffer;
741         stream.avail_out = decompressed_bufsize;
742         stream.total_out = 0;
743         stream.zalloc = Z_NULL;
744         stream.zfree = Z_NULL;
745         stream.opaque = Z_NULL;
746 
747         if (inflateInit2 (&stream, -15) == Z_OK)
748         {
749             int status = inflate (&stream, Z_NO_FLUSH);
750             inflateEnd (&stream);
751             if (status == Z_STREAM_END)
752             {
753                 decompressed_bytes = stream.total_out;
754             }
755         }
756     }
757 #endif
758 
759     if (decompressed_bytes == 0 || decompressed_buffer == nullptr)
760     {
761         if (decompressed_buffer)
762             free (decompressed_buffer);
763         m_bytes.erase (0, size_of_first_packet);
764         return false;
765     }
766 
767     std::string new_packet;
768     new_packet.reserve (decompressed_bytes + 6);
769     new_packet.push_back (m_bytes[0]);
770     new_packet.append ((const char *) decompressed_buffer, decompressed_bytes);
771     new_packet.push_back ('#');
772     if (GetSendAcks ())
773     {
774         uint8_t decompressed_checksum = CalculcateChecksum ((const char *) decompressed_buffer, decompressed_bytes);
775         char decompressed_checksum_str[3];
776         snprintf (decompressed_checksum_str, 3, "%02x", decompressed_checksum);
777         new_packet.append (decompressed_checksum_str);
778     }
779     else
780     {
781         new_packet.push_back ('0');
782         new_packet.push_back ('0');
783     }
784 
785     m_bytes.replace (0, size_of_first_packet, new_packet.data(), new_packet.size());
786 
787     free (decompressed_buffer);
788     return true;
789 }
790 
791 GDBRemoteCommunication::PacketType
792 GDBRemoteCommunication::CheckForPacket (const uint8_t *src, size_t src_len, StringExtractorGDBRemote &packet)
793 {
794     // Put the packet data into the buffer in a thread safe fashion
795     Mutex::Locker locker(m_bytes_mutex);
796 
797     Log *log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PACKETS));
798 
799     if (src && src_len > 0)
800     {
801         if (log && log->GetVerbose())
802         {
803             StreamString s;
804             log->Printf ("GDBRemoteCommunication::%s adding %u bytes: %.*s",
805                          __FUNCTION__,
806                          (uint32_t)src_len,
807                          (uint32_t)src_len,
808                          src);
809         }
810         m_bytes.append ((const char *)src, src_len);
811     }
812 
813     bool isNotifyPacket = false;
814 
815     // Parse up the packets into gdb remote packets
816     if (!m_bytes.empty())
817     {
818         // end_idx must be one past the last valid packet byte. Start
819         // it off with an invalid value that is the same as the current
820         // index.
821         size_t content_start = 0;
822         size_t content_length = 0;
823         size_t total_length = 0;
824         size_t checksum_idx = std::string::npos;
825 
826         // Size of packet before it is decompressed, for logging purposes
827         size_t original_packet_size = m_bytes.size();
828         if (CompressionIsEnabled())
829         {
830             if (DecompressPacket() == false)
831             {
832                 packet.Clear();
833                 return GDBRemoteCommunication::PacketType::Standard;
834             }
835         }
836 
837         switch (m_bytes[0])
838         {
839             case '+':       // Look for ack
840             case '-':       // Look for cancel
841             case '\x03':    // ^C to halt target
842                 content_length = total_length = 1;  // The command is one byte long...
843                 break;
844 
845             case '%': // Async notify packet
846                 isNotifyPacket = true;
847                 // Intentional fall through
848 
849             case '$':
850                 // Look for a standard gdb packet?
851                 {
852                     size_t hash_pos = m_bytes.find('#');
853                     if (hash_pos != std::string::npos)
854                     {
855                         if (hash_pos + 2 < m_bytes.size())
856                         {
857                             checksum_idx = hash_pos + 1;
858                             // Skip the dollar sign
859                             content_start = 1;
860                             // Don't include the # in the content or the $ in the content length
861                             content_length = hash_pos - 1;
862 
863                             total_length = hash_pos + 3; // Skip the # and the two hex checksum bytes
864                         }
865                         else
866                         {
867                             // Checksum bytes aren't all here yet
868                             content_length = std::string::npos;
869                         }
870                     }
871                 }
872                 break;
873 
874             default:
875                 {
876                     // We have an unexpected byte and we need to flush all bad
877                     // data that is in m_bytes, so we need to find the first
878                     // byte that is a '+' (ACK), '-' (NACK), \x03 (CTRL+C interrupt),
879                     // or '$' character (start of packet header) or of course,
880                     // the end of the data in m_bytes...
881                     const size_t bytes_len = m_bytes.size();
882                     bool done = false;
883                     uint32_t idx;
884                     for (idx = 1; !done && idx < bytes_len; ++idx)
885                     {
886                         switch (m_bytes[idx])
887                         {
888                         case '+':
889                         case '-':
890                         case '\x03':
891                         case '%':
892                         case '$':
893                             done = true;
894                             break;
895 
896                         default:
897                             break;
898                         }
899                     }
900                     if (log)
901                         log->Printf ("GDBRemoteCommunication::%s tossing %u junk bytes: '%.*s'",
902                                      __FUNCTION__, idx - 1, idx - 1, m_bytes.c_str());
903                     m_bytes.erase(0, idx - 1);
904                 }
905                 break;
906         }
907 
908         if (content_length == std::string::npos)
909         {
910             packet.Clear();
911             return GDBRemoteCommunication::PacketType::Invalid;
912         }
913         else if (total_length > 0)
914         {
915 
916             // We have a valid packet...
917             assert (content_length <= m_bytes.size());
918             assert (total_length <= m_bytes.size());
919             assert (content_length <= total_length);
920             size_t content_end = content_start + content_length;
921 
922             bool success = true;
923             std::string &packet_str = packet.GetStringRef();
924             if (log)
925             {
926                 // If logging was just enabled and we have history, then dump out what
927                 // we have to the log so we get the historical context. The Dump() call that
928                 // logs all of the packet will set a boolean so that we don't dump this more
929                 // than once
930                 if (!m_history.DidDumpToLog ())
931                     m_history.Dump (log);
932 
933                 bool binary = false;
934                 // Only detect binary for packets that start with a '$' and have a '#CC' checksum
935                 if (m_bytes[0] == '$' && total_length > 4)
936                 {
937                     for (size_t i=0; !binary && i<total_length; ++i)
938                     {
939                         if (isprint (m_bytes[i]) == 0 && isspace (m_bytes[i]) == 0)
940                         {
941                             binary = true;
942                         }
943                     }
944                 }
945                 if (binary)
946                 {
947                     StreamString strm;
948                     // Packet header...
949                     if (CompressionIsEnabled())
950                         strm.Printf("<%4" PRIu64 ":%" PRIu64 "> read packet: %c", (uint64_t) original_packet_size, (uint64_t)total_length, m_bytes[0]);
951                     else
952                         strm.Printf("<%4" PRIu64 "> read packet: %c", (uint64_t)total_length, m_bytes[0]);
953                     for (size_t i=content_start; i<content_end; ++i)
954                     {
955                         // Remove binary escaped bytes when displaying the packet...
956                         const char ch = m_bytes[i];
957                         if (ch == 0x7d)
958                         {
959                             // 0x7d is the escape character.  The next character is to
960                             // be XOR'd with 0x20.
961                             const char escapee = m_bytes[++i] ^ 0x20;
962                             strm.Printf("%2.2x", escapee);
963                         }
964                         else
965                         {
966                             strm.Printf("%2.2x", (uint8_t)ch);
967                         }
968                     }
969                     // Packet footer...
970                     strm.Printf("%c%c%c", m_bytes[total_length-3], m_bytes[total_length-2], m_bytes[total_length-1]);
971                     log->PutCString(strm.GetString().c_str());
972                 }
973                 else
974                 {
975                     if (CompressionIsEnabled())
976                         log->Printf("<%4" PRIu64 ":%" PRIu64 "> read packet: %.*s", (uint64_t) original_packet_size, (uint64_t)total_length, (int)(total_length), m_bytes.c_str());
977                     else
978                         log->Printf("<%4" PRIu64 "> read packet: %.*s", (uint64_t)total_length, (int)(total_length), m_bytes.c_str());
979                 }
980             }
981 
982             m_history.AddPacket (m_bytes.c_str(), total_length, History::ePacketTypeRecv, total_length);
983 
984             // Clear packet_str in case there is some existing data in it.
985             packet_str.clear();
986             // Copy the packet from m_bytes to packet_str expanding the
987             // run-length encoding in the process.
988             // Reserve enough byte for the most common case (no RLE used)
989             packet_str.reserve(m_bytes.length());
990             for (std::string::const_iterator c = m_bytes.begin() + content_start; c != m_bytes.begin() + content_end; ++c)
991             {
992                 if (*c == '*')
993                 {
994                     // '*' indicates RLE. Next character will give us the
995                     // repeat count and previous character is what is to be
996                     // repeated.
997                     char char_to_repeat = packet_str.back();
998                     // Number of time the previous character is repeated
999                     int repeat_count = *++c + 3 - ' ';
1000                     // We have the char_to_repeat and repeat_count. Now push
1001                     // it in the packet.
1002                     for (int i = 0; i < repeat_count; ++i)
1003                         packet_str.push_back(char_to_repeat);
1004                 }
1005                 else if (*c == 0x7d)
1006                 {
1007                     // 0x7d is the escape character.  The next character is to
1008                     // be XOR'd with 0x20.
1009                     char escapee = *++c ^ 0x20;
1010                     packet_str.push_back(escapee);
1011                 }
1012                 else
1013                 {
1014                     packet_str.push_back(*c);
1015                 }
1016             }
1017 
1018             if (m_bytes[0] == '$' || m_bytes[0] == '%')
1019             {
1020                 assert (checksum_idx < m_bytes.size());
1021                 if (::isxdigit (m_bytes[checksum_idx+0]) ||
1022                     ::isxdigit (m_bytes[checksum_idx+1]))
1023                 {
1024                     if (GetSendAcks ())
1025                     {
1026                         const char *packet_checksum_cstr = &m_bytes[checksum_idx];
1027                         char packet_checksum = strtol (packet_checksum_cstr, NULL, 16);
1028                         char actual_checksum = CalculcateChecksum (packet_str.c_str(), packet_str.size());
1029                         success = packet_checksum == actual_checksum;
1030                         if (!success)
1031                         {
1032                             if (log)
1033                                 log->Printf ("error: checksum mismatch: %.*s expected 0x%2.2x, got 0x%2.2x",
1034                                              (int)(total_length),
1035                                              m_bytes.c_str(),
1036                                              (uint8_t)packet_checksum,
1037                                              (uint8_t)actual_checksum);
1038                         }
1039                         // Send the ack or nack if needed
1040                         if (!success)
1041                             SendNack();
1042                         else
1043                             SendAck();
1044                     }
1045                 }
1046                 else
1047                 {
1048                     success = false;
1049                     if (log)
1050                         log->Printf ("error: invalid checksum in packet: '%s'\n", m_bytes.c_str());
1051                 }
1052             }
1053 
1054             m_bytes.erase(0, total_length);
1055             packet.SetFilePos(0);
1056 
1057             if (isNotifyPacket)
1058                 return GDBRemoteCommunication::PacketType::Notify;
1059             else
1060                 return GDBRemoteCommunication::PacketType::Standard;
1061         }
1062     }
1063     packet.Clear();
1064     return GDBRemoteCommunication::PacketType::Invalid;
1065 }
1066 
1067 Error
1068 GDBRemoteCommunication::StartListenThread (const char *hostname, uint16_t port)
1069 {
1070     Error error;
1071     if (m_listen_thread.IsJoinable())
1072     {
1073         error.SetErrorString("listen thread already running");
1074     }
1075     else
1076     {
1077         char listen_url[512];
1078         if (hostname && hostname[0])
1079             snprintf(listen_url, sizeof(listen_url), "listen://%s:%i", hostname, port);
1080         else
1081             snprintf(listen_url, sizeof(listen_url), "listen://%i", port);
1082         m_listen_url = listen_url;
1083         SetConnection(new ConnectionFileDescriptor());
1084         m_listen_thread = ThreadLauncher::LaunchThread(listen_url, GDBRemoteCommunication::ListenThread, this, &error);
1085     }
1086     return error;
1087 }
1088 
1089 bool
1090 GDBRemoteCommunication::JoinListenThread ()
1091 {
1092     if (m_listen_thread.IsJoinable())
1093         m_listen_thread.Join(nullptr);
1094     return true;
1095 }
1096 
1097 lldb::thread_result_t
1098 GDBRemoteCommunication::ListenThread (lldb::thread_arg_t arg)
1099 {
1100     GDBRemoteCommunication *comm = (GDBRemoteCommunication *)arg;
1101     Error error;
1102     ConnectionFileDescriptor *connection = (ConnectionFileDescriptor *)comm->GetConnection ();
1103 
1104     if (connection)
1105     {
1106         // Do the listen on another thread so we can continue on...
1107         if (connection->Connect(comm->m_listen_url.c_str(), &error) != eConnectionStatusSuccess)
1108             comm->SetConnection(NULL);
1109     }
1110     return NULL;
1111 }
1112 
1113 Error
1114 GDBRemoteCommunication::StartDebugserverProcess (const char *hostname,
1115                                                  uint16_t in_port,
1116                                                  ProcessLaunchInfo &launch_info,
1117                                                  uint16_t &out_port)
1118 {
1119     Log *log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PROCESS));
1120     if (log)
1121         log->Printf ("GDBRemoteCommunication::%s(hostname=%s, in_port=%" PRIu16 ", out_port=%" PRIu16, __FUNCTION__, hostname ? hostname : "<empty>", in_port, out_port);
1122 
1123     out_port = in_port;
1124     Error error;
1125     // If we locate debugserver, keep that located version around
1126     static FileSpec g_debugserver_file_spec;
1127 
1128     char debugserver_path[PATH_MAX];
1129     FileSpec &debugserver_file_spec = launch_info.GetExecutableFile();
1130 
1131     // Always check to see if we have an environment override for the path
1132     // to the debugserver to use and use it if we do.
1133     const char *env_debugserver_path = getenv("LLDB_DEBUGSERVER_PATH");
1134     if (env_debugserver_path)
1135     {
1136         debugserver_file_spec.SetFile (env_debugserver_path, false);
1137         if (log)
1138             log->Printf ("GDBRemoteCommunication::%s() gdb-remote stub exe path set from environment variable: %s", __FUNCTION__, env_debugserver_path);
1139     }
1140     else
1141         debugserver_file_spec = g_debugserver_file_spec;
1142     bool debugserver_exists = debugserver_file_spec.Exists();
1143     if (!debugserver_exists)
1144     {
1145         // The debugserver binary is in the LLDB.framework/Resources
1146         // directory.
1147         if (HostInfo::GetLLDBPath(ePathTypeSupportExecutableDir, debugserver_file_spec))
1148         {
1149             debugserver_file_spec.AppendPathComponent (DEBUGSERVER_BASENAME);
1150             debugserver_exists = debugserver_file_spec.Exists();
1151             if (debugserver_exists)
1152             {
1153                 if (log)
1154                     log->Printf ("GDBRemoteCommunication::%s() found gdb-remote stub exe '%s'", __FUNCTION__, debugserver_file_spec.GetPath ().c_str ());
1155 
1156                 g_debugserver_file_spec = debugserver_file_spec;
1157             }
1158             else
1159             {
1160                 if (log)
1161                     log->Printf ("GDBRemoteCommunication::%s() could not find gdb-remote stub exe '%s'", __FUNCTION__, debugserver_file_spec.GetPath ().c_str ());
1162 
1163                 g_debugserver_file_spec.Clear();
1164                 debugserver_file_spec.Clear();
1165             }
1166         }
1167     }
1168 
1169     if (debugserver_exists)
1170     {
1171         debugserver_file_spec.GetPath (debugserver_path, sizeof(debugserver_path));
1172 
1173         Args &debugserver_args = launch_info.GetArguments();
1174         debugserver_args.Clear();
1175         char arg_cstr[PATH_MAX];
1176 
1177         // Start args with "debugserver /file/path -r --"
1178         debugserver_args.AppendArgument(debugserver_path);
1179 
1180 #if !defined(__APPLE__)
1181         // First argument to lldb-server must be mode in which to run.
1182         debugserver_args.AppendArgument("gdbserver");
1183 #endif
1184 
1185         // If a host and port is supplied then use it
1186         char host_and_port[128];
1187         if (hostname)
1188         {
1189             snprintf (host_and_port, sizeof(host_and_port), "%s:%u", hostname, in_port);
1190             debugserver_args.AppendArgument(host_and_port);
1191         }
1192         else
1193         {
1194             host_and_port[0] = '\0';
1195         }
1196 
1197         // use native registers, not the GDB registers
1198         debugserver_args.AppendArgument("--native-regs");
1199 
1200         if (launch_info.GetLaunchInSeparateProcessGroup())
1201         {
1202             debugserver_args.AppendArgument("--setsid");
1203         }
1204 
1205         llvm::SmallString<PATH_MAX> named_pipe_path;
1206         Pipe port_pipe;
1207 
1208         if (in_port == 0)
1209         {
1210             if (host_and_port[0])
1211             {
1212                 // Create a temporary file to get the stdout/stderr and redirect the
1213                 // output of the command into this file. We will later read this file
1214                 // if all goes well and fill the data into "command_output_ptr"
1215 
1216 #if defined(__APPLE__)
1217                 // Binding to port zero, we need to figure out what port it ends up
1218                 // using using a named pipe...
1219                 error = port_pipe.CreateWithUniqueName("debugserver-named-pipe", false, named_pipe_path);
1220                 if (error.Fail())
1221                 {
1222                     if (log)
1223                         log->Printf("GDBRemoteCommunication::%s() "
1224                                 "named pipe creation failed: %s",
1225                                 __FUNCTION__, error.AsCString());
1226                     return error;
1227                 }
1228                 debugserver_args.AppendArgument("--named-pipe");
1229                 debugserver_args.AppendArgument(named_pipe_path.c_str());
1230 #else
1231                 // Binding to port zero, we need to figure out what port it ends up
1232                 // using using an unnamed pipe...
1233                 error = port_pipe.CreateNew(true);
1234                 if (error.Fail())
1235                 {
1236                     if (log)
1237                         log->Printf("GDBRemoteCommunication::%s() "
1238                                 "unnamed pipe creation failed: %s",
1239                                 __FUNCTION__, error.AsCString());
1240                     return error;
1241                 }
1242                 int write_fd = port_pipe.GetWriteFileDescriptor();
1243                 debugserver_args.AppendArgument("--pipe");
1244                 debugserver_args.AppendArgument(std::to_string(write_fd).c_str());
1245                 launch_info.AppendCloseFileAction(port_pipe.GetReadFileDescriptor());
1246 #endif
1247             }
1248             else
1249             {
1250                 // No host and port given, so lets listen on our end and make the debugserver
1251                 // connect to us..
1252                 error = StartListenThread ("127.0.0.1", 0);
1253                 if (error.Fail())
1254                 {
1255                     if (log)
1256                         log->Printf ("GDBRemoteCommunication::%s() unable to start listen thread: %s", __FUNCTION__, error.AsCString());
1257                     return error;
1258                 }
1259 
1260                 ConnectionFileDescriptor *connection = (ConnectionFileDescriptor *)GetConnection ();
1261                 // Wait for 10 seconds to resolve the bound port
1262                 out_port = connection->GetListeningPort(10);
1263                 if (out_port > 0)
1264                 {
1265                     char port_cstr[32];
1266                     snprintf(port_cstr, sizeof(port_cstr), "127.0.0.1:%i", out_port);
1267                     // Send the host and port down that debugserver and specify an option
1268                     // so that it connects back to the port we are listening to in this process
1269                     debugserver_args.AppendArgument("--reverse-connect");
1270                     debugserver_args.AppendArgument(port_cstr);
1271                 }
1272                 else
1273                 {
1274                     error.SetErrorString ("failed to bind to port 0 on 127.0.0.1");
1275                     if (log)
1276                         log->Printf ("GDBRemoteCommunication::%s() failed: %s", __FUNCTION__, error.AsCString());
1277                     return error;
1278                 }
1279             }
1280         }
1281 
1282         const char *env_debugserver_log_file = getenv("LLDB_DEBUGSERVER_LOG_FILE");
1283         if (env_debugserver_log_file)
1284         {
1285             ::snprintf (arg_cstr, sizeof(arg_cstr), "--log-file=%s", env_debugserver_log_file);
1286             debugserver_args.AppendArgument(arg_cstr);
1287         }
1288 
1289 #if defined(__APPLE__)
1290         const char *env_debugserver_log_flags = getenv("LLDB_DEBUGSERVER_LOG_FLAGS");
1291         if (env_debugserver_log_flags)
1292         {
1293             ::snprintf (arg_cstr, sizeof(arg_cstr), "--log-flags=%s", env_debugserver_log_flags);
1294             debugserver_args.AppendArgument(arg_cstr);
1295         }
1296 #else
1297         const char *env_debugserver_log_channels = getenv("LLDB_SERVER_LOG_CHANNELS");
1298         if (env_debugserver_log_channels)
1299         {
1300             ::snprintf (arg_cstr, sizeof(arg_cstr), "--log-channels=%s", env_debugserver_log_channels);
1301             debugserver_args.AppendArgument(arg_cstr);
1302         }
1303 #endif
1304 
1305         // Add additional args, starting with LLDB_DEBUGSERVER_EXTRA_ARG_1 until an env var doesn't come back.
1306         uint32_t env_var_index = 1;
1307         bool has_env_var;
1308         do
1309         {
1310             char env_var_name[64];
1311             snprintf (env_var_name, sizeof (env_var_name), "LLDB_DEBUGSERVER_EXTRA_ARG_%" PRIu32, env_var_index++);
1312             const char *extra_arg = getenv(env_var_name);
1313             has_env_var = extra_arg != nullptr;
1314 
1315             if (has_env_var)
1316             {
1317                 debugserver_args.AppendArgument (extra_arg);
1318                 if (log)
1319                     log->Printf ("GDBRemoteCommunication::%s adding env var %s contents to stub command line (%s)", __FUNCTION__, env_var_name, extra_arg);
1320             }
1321         } while (has_env_var);
1322 
1323         // Close STDIN, STDOUT and STDERR.
1324         launch_info.AppendCloseFileAction (STDIN_FILENO);
1325         launch_info.AppendCloseFileAction (STDOUT_FILENO);
1326         launch_info.AppendCloseFileAction (STDERR_FILENO);
1327 
1328         // Redirect STDIN, STDOUT and STDERR to "/dev/null".
1329         launch_info.AppendSuppressFileAction (STDIN_FILENO, true, false);
1330         launch_info.AppendSuppressFileAction (STDOUT_FILENO, false, true);
1331         launch_info.AppendSuppressFileAction (STDERR_FILENO, false, true);
1332 
1333         error = Host::LaunchProcess(launch_info);
1334 
1335         if (error.Success() && launch_info.GetProcessID() != LLDB_INVALID_PROCESS_ID)
1336         {
1337             if (named_pipe_path.size() > 0)
1338             {
1339                 error = port_pipe.OpenAsReader(named_pipe_path, false);
1340                 if (error.Fail())
1341                     if (log)
1342                         log->Printf("GDBRemoteCommunication::%s() "
1343                                 "failed to open named pipe %s for reading: %s",
1344                                 __FUNCTION__, named_pipe_path.c_str(), error.AsCString());
1345             }
1346 
1347             if (port_pipe.CanWrite())
1348                 port_pipe.CloseWriteFileDescriptor();
1349             if (port_pipe.CanRead())
1350             {
1351                 char port_cstr[256];
1352                 port_cstr[0] = '\0';
1353                 size_t num_bytes = sizeof(port_cstr);
1354                 // Read port from pipe with 10 second timeout.
1355                 error = port_pipe.ReadWithTimeout(port_cstr, num_bytes,
1356                         std::chrono::seconds{10}, num_bytes);
1357                 if (error.Success())
1358                 {
1359                     assert(num_bytes > 0 && port_cstr[num_bytes-1] == '\0');
1360                     out_port = StringConvert::ToUInt32(port_cstr, 0);
1361                     if (log)
1362                         log->Printf("GDBRemoteCommunication::%s() "
1363                                 "debugserver listens %u port",
1364                                 __FUNCTION__, out_port);
1365                 }
1366                 else
1367                 {
1368                     if (log)
1369                         log->Printf("GDBRemoteCommunication::%s() "
1370                                 "failed to read a port value from pipe %s: %s",
1371                                 __FUNCTION__, named_pipe_path.c_str(), error.AsCString());
1372 
1373                 }
1374                 port_pipe.Close();
1375             }
1376 
1377             if (named_pipe_path.size() > 0)
1378             {
1379                 const auto err = port_pipe.Delete(named_pipe_path);
1380                 if (err.Fail())
1381                 {
1382                     if (log)
1383                         log->Printf ("GDBRemoteCommunication::%s failed to delete pipe %s: %s",
1384                                 __FUNCTION__, named_pipe_path.c_str(), err.AsCString());
1385                 }
1386             }
1387 
1388             // Make sure we actually connect with the debugserver...
1389             JoinListenThread();
1390         }
1391     }
1392     else
1393     {
1394         error.SetErrorStringWithFormat ("unable to locate " DEBUGSERVER_BASENAME );
1395     }
1396 
1397     if (error.Fail())
1398     {
1399         if (log)
1400             log->Printf ("GDBRemoteCommunication::%s() failed: %s", __FUNCTION__, error.AsCString());
1401     }
1402 
1403     return error;
1404 }
1405 
1406 void
1407 GDBRemoteCommunication::DumpHistory(Stream &strm)
1408 {
1409     m_history.Dump (strm);
1410 }
1411 
1412 GDBRemoteCommunication::ScopedTimeout::ScopedTimeout (GDBRemoteCommunication& gdb_comm,
1413                                                       uint32_t timeout) :
1414     m_gdb_comm (gdb_comm)
1415 {
1416     m_saved_timeout = m_gdb_comm.SetPacketTimeout (timeout);
1417 }
1418 
1419 GDBRemoteCommunication::ScopedTimeout::~ScopedTimeout ()
1420 {
1421     m_gdb_comm.SetPacketTimeout (m_saved_timeout);
1422 }
1423 
1424 // This function is called via the Communications class read thread when bytes become available
1425 // for this connection. This function will consume all incoming bytes and try to parse whole
1426 // packets as they become available. Full packets are placed in a queue, so that all packet
1427 // requests can simply pop from this queue. Async notification packets will be dispatched
1428 // immediately to the ProcessGDBRemote Async thread via an event.
1429 void GDBRemoteCommunication::AppendBytesToCache (const uint8_t * bytes, size_t len, bool broadcast, lldb::ConnectionStatus status)
1430 {
1431     StringExtractorGDBRemote packet;
1432 
1433     while (true)
1434     {
1435         PacketType type = CheckForPacket(bytes, len, packet);
1436 
1437         // scrub the data so we do not pass it back to CheckForPacket
1438         // on future passes of the loop
1439         bytes = nullptr;
1440         len = 0;
1441 
1442         // we may have received no packet so lets bail out
1443         if (type == PacketType::Invalid)
1444             break;
1445 
1446         if (type == PacketType::Standard)
1447         {
1448             // scope for the mutex
1449             {
1450                 // lock down the packet queue
1451                 Mutex::Locker locker(m_packet_queue_mutex);
1452                 // push a new packet into the queue
1453                 m_packet_queue.push(packet);
1454                 // Signal condition variable that we have a packet
1455                 m_condition_queue_not_empty.Signal();
1456 
1457             }
1458         }
1459 
1460         if (type == PacketType::Notify)
1461         {
1462             // put this packet into an event
1463             const char *pdata = packet.GetStringRef().c_str();
1464 
1465             // as the communication class, we are a broadcaster and the
1466             // async thread is tuned to listen to us
1467             BroadcastEvent(
1468                 eBroadcastBitGdbReadThreadGotNotify,
1469                 new EventDataBytes(pdata));
1470         }
1471     }
1472 }
1473