blob: 30bd762ba7c952f679293f3e0f604ec984c8c713 [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001//===-- 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
Johnny Chena5663552011-05-13 20:07:25 +000014#include <limits.h>
Stephen Wilsona78867b2011-03-25 18:16:28 +000015#include <string.h>
Greg Clayton91a9b2472013-12-04 19:19:12 +000016#include <sys/stat.h>
Stephen Wilsona78867b2011-03-25 18:16:28 +000017
Chris Lattner30fdc8d2010-06-08 16:52:24 +000018// C++ Includes
19// Other libraries and framework includes
Greg Clayton00fe87b2013-12-05 22:58:22 +000020#include "lldb/Core/ConnectionFileDescriptor.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000021#include "lldb/Core/Log.h"
Greg Claytonc1422c12012-04-09 22:46:21 +000022#include "lldb/Core/StreamFile.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000023#include "lldb/Core/StreamString.h"
Greg Clayton8b82f082011-04-12 05:54:46 +000024#include "lldb/Host/FileSpec.h"
25#include "lldb/Host/Host.h"
Zachary Turner98688922014-08-06 18:16:26 +000026#include "lldb/Host/Socket.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000027#include "lldb/Host/TimeValue.h"
Greg Clayton8b82f082011-04-12 05:54:46 +000028#include "lldb/Target/Process.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000029
30// Project includes
Chris Lattner30fdc8d2010-06-08 16:52:24 +000031#include "ProcessGDBRemoteLog.h"
32
Todd Fiala015d8182014-07-22 23:41:36 +000033#if defined(__APPLE__)
34# define DEBUGSERVER_BASENAME "debugserver"
35#else
36# define DEBUGSERVER_BASENAME "lldb-gdbserver"
37#endif
Greg Clayton8b82f082011-04-12 05:54:46 +000038
Chris Lattner30fdc8d2010-06-08 16:52:24 +000039using namespace lldb;
40using namespace lldb_private;
41
Greg Claytonc1422c12012-04-09 22:46:21 +000042GDBRemoteCommunication::History::History (uint32_t size) :
43 m_packets(),
44 m_curr_idx (0),
45 m_total_packet_count (0),
46 m_dumped_to_log (false)
47{
48 m_packets.resize(size);
49}
50
51GDBRemoteCommunication::History::~History ()
52{
53}
54
55void
Greg Claytond451c1a2012-04-13 21:24:18 +000056GDBRemoteCommunication::History::AddPacket (char packet_char,
57 PacketType type,
58 uint32_t bytes_transmitted)
59{
60 const size_t size = m_packets.size();
61 if (size > 0)
62 {
63 const uint32_t idx = GetNextIndex();
64 m_packets[idx].packet.assign (1, packet_char);
65 m_packets[idx].type = type;
66 m_packets[idx].bytes_transmitted = bytes_transmitted;
67 m_packets[idx].packet_idx = m_total_packet_count;
68 m_packets[idx].tid = Host::GetCurrentThreadID();
69 }
70}
71
72void
73GDBRemoteCommunication::History::AddPacket (const std::string &src,
74 uint32_t src_len,
75 PacketType type,
76 uint32_t bytes_transmitted)
77{
78 const size_t size = m_packets.size();
79 if (size > 0)
80 {
81 const uint32_t idx = GetNextIndex();
82 m_packets[idx].packet.assign (src, 0, src_len);
83 m_packets[idx].type = type;
84 m_packets[idx].bytes_transmitted = bytes_transmitted;
85 m_packets[idx].packet_idx = m_total_packet_count;
86 m_packets[idx].tid = Host::GetCurrentThreadID();
87 }
88}
89
90void
Greg Claytonc1422c12012-04-09 22:46:21 +000091GDBRemoteCommunication::History::Dump (lldb_private::Stream &strm) const
92{
93 const uint32_t size = GetNumPacketsInHistory ();
94 const uint32_t first_idx = GetFirstSavedPacketIndex ();
95 const uint32_t stop_idx = m_curr_idx + size;
96 for (uint32_t i = first_idx; i < stop_idx; ++i)
97 {
98 const uint32_t idx = NormalizeIndex (i);
99 const Entry &entry = m_packets[idx];
100 if (entry.type == ePacketTypeInvalid || entry.packet.empty())
101 break;
Daniel Malead01b2952012-11-29 21:49:15 +0000102 strm.Printf ("history[%u] tid=0x%4.4" PRIx64 " <%4u> %s packet: %s\n",
Greg Claytonc1422c12012-04-09 22:46:21 +0000103 entry.packet_idx,
Greg Claytond451c1a2012-04-13 21:24:18 +0000104 entry.tid,
Greg Claytonc1422c12012-04-09 22:46:21 +0000105 entry.bytes_transmitted,
106 (entry.type == ePacketTypeSend) ? "send" : "read",
107 entry.packet.c_str());
108 }
109}
110
111void
112GDBRemoteCommunication::History::Dump (lldb_private::Log *log) const
113{
114 if (log && !m_dumped_to_log)
115 {
116 m_dumped_to_log = true;
117 const uint32_t size = GetNumPacketsInHistory ();
118 const uint32_t first_idx = GetFirstSavedPacketIndex ();
119 const uint32_t stop_idx = m_curr_idx + size;
120 for (uint32_t i = first_idx; i < stop_idx; ++i)
121 {
122 const uint32_t idx = NormalizeIndex (i);
123 const Entry &entry = m_packets[idx];
124 if (entry.type == ePacketTypeInvalid || entry.packet.empty())
125 break;
Daniel Malead01b2952012-11-29 21:49:15 +0000126 log->Printf ("history[%u] tid=0x%4.4" PRIx64 " <%4u> %s packet: %s",
Greg Claytonc1422c12012-04-09 22:46:21 +0000127 entry.packet_idx,
Greg Claytond451c1a2012-04-13 21:24:18 +0000128 entry.tid,
Greg Claytonc1422c12012-04-09 22:46:21 +0000129 entry.bytes_transmitted,
130 (entry.type == ePacketTypeSend) ? "send" : "read",
131 entry.packet.c_str());
132 }
133 }
134}
135
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000136//----------------------------------------------------------------------
137// GDBRemoteCommunication constructor
138//----------------------------------------------------------------------
Greg Clayton8b82f082011-04-12 05:54:46 +0000139GDBRemoteCommunication::GDBRemoteCommunication(const char *comm_name,
140 const char *listener_name,
141 bool is_platform) :
Greg Clayton576d8832011-03-22 04:00:09 +0000142 Communication(comm_name),
Daniel Maleae0f8f572013-08-26 23:57:52 +0000143#ifdef LLDB_CONFIGURATION_DEBUG
144 m_packet_timeout (1000),
145#else
Greg Claytonf3dd93c2011-06-17 03:31:01 +0000146 m_packet_timeout (1),
Daniel Maleae0f8f572013-08-26 23:57:52 +0000147#endif
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000148 m_sequence_mutex (Mutex::eMutexTypeRecursive),
Greg Clayton4dc72282011-01-20 07:53:45 +0000149 m_public_is_running (false),
Greg Clayton1cb64962011-03-24 04:28:38 +0000150 m_private_is_running (false),
Greg Claytonc1422c12012-04-09 22:46:21 +0000151 m_history (512),
Greg Clayton8b82f082011-04-12 05:54:46 +0000152 m_send_acks (true),
Greg Clayton00fe87b2013-12-05 22:58:22 +0000153 m_is_platform (is_platform),
154 m_listen_thread (LLDB_INVALID_HOST_THREAD),
155 m_listen_url ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000156{
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000157}
158
159//----------------------------------------------------------------------
160// Destructor
161//----------------------------------------------------------------------
162GDBRemoteCommunication::~GDBRemoteCommunication()
163{
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000164 if (IsConnected())
165 {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000166 Disconnect();
167 }
168}
169
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000170char
171GDBRemoteCommunication::CalculcateChecksum (const char *payload, size_t payload_length)
172{
173 int checksum = 0;
174
Ed Mastea6b4c772013-08-20 14:12:58 +0000175 for (size_t i = 0; i < payload_length; ++i)
176 checksum += payload[i];
177
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000178 return checksum & 255;
179}
180
181size_t
Greg Clayton6ed95942011-01-22 07:12:45 +0000182GDBRemoteCommunication::SendAck ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000183{
Greg Clayton5160ce52013-03-27 23:08:40 +0000184 Log *log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PACKETS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000185 ConnectionStatus status = eConnectionStatusSuccess;
Greg Claytonc1422c12012-04-09 22:46:21 +0000186 char ch = '+';
187 const size_t bytes_written = Write (&ch, 1, status, NULL);
188 if (log)
Greg Clayton45989072013-10-23 18:24:30 +0000189 log->Printf ("<%4" PRIu64 "> send packet: %c", (uint64_t)bytes_written, ch);
Greg Claytonc1422c12012-04-09 22:46:21 +0000190 m_history.AddPacket (ch, History::ePacketTypeSend, bytes_written);
191 return bytes_written;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000192}
193
194size_t
Greg Clayton6ed95942011-01-22 07:12:45 +0000195GDBRemoteCommunication::SendNack ()
196{
Greg Clayton5160ce52013-03-27 23:08:40 +0000197 Log *log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PACKETS));
Greg Clayton6ed95942011-01-22 07:12:45 +0000198 ConnectionStatus status = eConnectionStatusSuccess;
Greg Claytonc1422c12012-04-09 22:46:21 +0000199 char ch = '-';
200 const size_t bytes_written = Write (&ch, 1, status, NULL);
201 if (log)
Greg Clayton45989072013-10-23 18:24:30 +0000202 log->Printf("<%4" PRIu64 "> send packet: %c", (uint64_t)bytes_written, ch);
Greg Claytonc1422c12012-04-09 22:46:21 +0000203 m_history.AddPacket (ch, History::ePacketTypeSend, bytes_written);
204 return bytes_written;
Greg Clayton32e0a752011-03-30 18:16:51 +0000205}
206
Greg Clayton3dedae12013-12-06 21:45:27 +0000207GDBRemoteCommunication::PacketResult
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000208GDBRemoteCommunication::SendPacket (const char *payload, size_t payload_length)
209{
210 Mutex::Locker locker(m_sequence_mutex);
211 return SendPacketNoLock (payload, payload_length);
212}
213
Greg Clayton3dedae12013-12-06 21:45:27 +0000214GDBRemoteCommunication::PacketResult
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000215GDBRemoteCommunication::SendPacketNoLock (const char *payload, size_t payload_length)
216{
217 if (IsConnected())
218 {
219 StreamString packet(0, 4, eByteOrderBig);
220
221 packet.PutChar('$');
222 packet.Write (payload, payload_length);
223 packet.PutChar('#');
224 packet.PutHex8(CalculcateChecksum (payload, payload_length));
225
Greg Clayton5160ce52013-03-27 23:08:40 +0000226 Log *log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PACKETS));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000227 ConnectionStatus status = eConnectionStatusSuccess;
228 size_t bytes_written = Write (packet.GetData(), packet.GetSize(), status, NULL);
Greg Claytonc1422c12012-04-09 22:46:21 +0000229 if (log)
230 {
231 // If logging was just enabled and we have history, then dump out what
232 // we have to the log so we get the historical context. The Dump() call that
233 // logs all of the packet will set a boolean so that we don't dump this more
234 // than once
235 if (!m_history.DidDumpToLog ())
Greg Clayton5160ce52013-03-27 23:08:40 +0000236 m_history.Dump (log);
Greg Claytonc1422c12012-04-09 22:46:21 +0000237
Greg Clayton45989072013-10-23 18:24:30 +0000238 log->Printf("<%4" PRIu64 "> send packet: %.*s", (uint64_t)bytes_written, (int)packet.GetSize(), packet.GetData());
Greg Claytonc1422c12012-04-09 22:46:21 +0000239 }
240
241 m_history.AddPacket (packet.GetString(), packet.GetSize(), History::ePacketTypeSend, bytes_written);
242
243
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000244 if (bytes_written == packet.GetSize())
245 {
Greg Clayton71fc2a32011-02-12 06:28:37 +0000246 if (GetSendAcks ())
Greg Clayton3dedae12013-12-06 21:45:27 +0000247 return GetAck ();
248 else
249 return PacketResult::Success;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000250 }
Johnny Chend0c40dd2010-09-14 22:10:43 +0000251 else
252 {
Greg Clayton6d093452011-02-05 02:25:06 +0000253 if (log)
Greg Clayton5fe15d22011-05-20 03:15:54 +0000254 log->Printf ("error: failed to send packet: %.*s", (int)packet.GetSize(), packet.GetData());
Johnny Chend0c40dd2010-09-14 22:10:43 +0000255 }
Greg Claytonf5e56de2010-09-14 23:36:40 +0000256 }
Greg Clayton3dedae12013-12-06 21:45:27 +0000257 return PacketResult::ErrorSendFailed;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000258}
259
Greg Clayton3dedae12013-12-06 21:45:27 +0000260GDBRemoteCommunication::PacketResult
Greg Claytonc574ede2011-03-10 02:26:48 +0000261GDBRemoteCommunication::GetAck ()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000262{
Greg Clayton576d8832011-03-22 04:00:09 +0000263 StringExtractorGDBRemote packet;
Greg Clayton3dedae12013-12-06 21:45:27 +0000264 PacketResult result = WaitForPacketWithTimeoutMicroSecondsNoLock (packet, GetPacketTimeoutInMicroSeconds ());
265 if (result == PacketResult::Success)
266 {
267 if (packet.GetResponseType() == StringExtractorGDBRemote::ResponseType::eAck)
268 return PacketResult::Success;
269 else
270 return PacketResult::ErrorSendAck;
271 }
272 return result;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000273}
274
275bool
Jim Ingham4ceb9282012-06-08 22:50:40 +0000276GDBRemoteCommunication::GetSequenceMutex (Mutex::Locker& locker, const char *failure_message)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000277{
Greg Claytond9896732012-05-31 16:54:51 +0000278 if (IsRunning())
Jim Ingham4ceb9282012-06-08 22:50:40 +0000279 return locker.TryLock (m_sequence_mutex, failure_message);
Greg Claytond9896732012-05-31 16:54:51 +0000280
281 locker.Lock (m_sequence_mutex);
282 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000283}
284
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000285
Greg Clayton6779606a2011-01-22 23:43:18 +0000286bool
Greg Clayton6779606a2011-01-22 23:43:18 +0000287GDBRemoteCommunication::WaitForNotRunningPrivate (const TimeValue *timeout_ptr)
288{
289 return m_private_is_running.WaitForValueEqualTo (false, timeout_ptr, NULL);
290}
291
Greg Clayton3dedae12013-12-06 21:45:27 +0000292GDBRemoteCommunication::PacketResult
Greg Clayton73bf5db2011-06-17 01:22:15 +0000293GDBRemoteCommunication::WaitForPacketWithTimeoutMicroSecondsNoLock (StringExtractorGDBRemote &packet, uint32_t timeout_usec)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000294{
Greg Clayton73bf5db2011-06-17 01:22:15 +0000295 uint8_t buffer[8192];
296 Error error;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000297
Greg Clayton5160ce52013-03-27 23:08:40 +0000298 Log *log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PACKETS | GDBR_LOG_VERBOSE));
Greg Clayton644247c2011-07-07 01:59:51 +0000299
Greg Clayton73bf5db2011-06-17 01:22:15 +0000300 // Check for a packet from our cache first without trying any reading...
301 if (CheckForPacket (NULL, 0, packet))
Greg Clayton3dedae12013-12-06 21:45:27 +0000302 return PacketResult::Success;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000303
Greg Clayton0c51ac32011-07-02 23:21:06 +0000304 bool timed_out = false;
Greg Clayton3dedae12013-12-06 21:45:27 +0000305 bool disconnected = false;
Greg Clayton0c51ac32011-07-02 23:21:06 +0000306 while (IsConnected() && !timed_out)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000307 {
Johnny Chen74549c82011-07-19 01:13:00 +0000308 lldb::ConnectionStatus status = eConnectionStatusNoConnection;
Greg Clayton73bf5db2011-06-17 01:22:15 +0000309 size_t bytes_read = Read (buffer, sizeof(buffer), timeout_usec, status, &error);
Greg Clayton644247c2011-07-07 01:59:51 +0000310
311 if (log)
Daniel Malead01b2952012-11-29 21:49:15 +0000312 log->Printf ("%s: Read (buffer, (sizeof(buffer), timeout_usec = 0x%x, status = %s, error = %s) => bytes_read = %" PRIu64,
Greg Clayton644247c2011-07-07 01:59:51 +0000313 __PRETTY_FUNCTION__,
314 timeout_usec,
315 Communication::ConnectionStatusAsCString (status),
316 error.AsCString(),
Greg Clayton43e0af02012-09-18 18:04:04 +0000317 (uint64_t)bytes_read);
Greg Clayton644247c2011-07-07 01:59:51 +0000318
Greg Clayton73bf5db2011-06-17 01:22:15 +0000319 if (bytes_read > 0)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000320 {
Greg Clayton73bf5db2011-06-17 01:22:15 +0000321 if (CheckForPacket (buffer, bytes_read, packet))
Greg Clayton3dedae12013-12-06 21:45:27 +0000322 return PacketResult::Success;
Greg Clayton73bf5db2011-06-17 01:22:15 +0000323 }
324 else
325 {
326 switch (status)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000327 {
Greg Clayton197bacf2011-07-02 21:07:54 +0000328 case eConnectionStatusTimedOut:
Greg Claytonf0066ad2014-05-02 00:45:31 +0000329 case eConnectionStatusInterrupted:
Greg Clayton0c51ac32011-07-02 23:21:06 +0000330 timed_out = true;
331 break;
332 case eConnectionStatusSuccess:
333 //printf ("status = success but error = %s\n", error.AsCString("<invalid>"));
Greg Clayton73bf5db2011-06-17 01:22:15 +0000334 break;
335
336 case eConnectionStatusEndOfFile:
337 case eConnectionStatusNoConnection:
338 case eConnectionStatusLostConnection:
339 case eConnectionStatusError:
Greg Clayton3dedae12013-12-06 21:45:27 +0000340 disconnected = true;
Greg Clayton73bf5db2011-06-17 01:22:15 +0000341 Disconnect();
342 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000343 }
344 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000345 }
Greg Clayton3dedae12013-12-06 21:45:27 +0000346 packet.Clear ();
347 if (disconnected)
348 return PacketResult::ErrorDisconnected;
349 if (timed_out)
350 return PacketResult::ErrorReplyTimeout;
351 else
352 return PacketResult::ErrorReplyFailed;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000353}
354
Greg Clayton73bf5db2011-06-17 01:22:15 +0000355bool
356GDBRemoteCommunication::CheckForPacket (const uint8_t *src, size_t src_len, StringExtractorGDBRemote &packet)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000357{
358 // Put the packet data into the buffer in a thread safe fashion
359 Mutex::Locker locker(m_bytes_mutex);
Greg Clayton197bacf2011-07-02 21:07:54 +0000360
Greg Clayton5160ce52013-03-27 23:08:40 +0000361 Log *log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PACKETS));
Greg Clayton197bacf2011-07-02 21:07:54 +0000362
Greg Clayton73bf5db2011-06-17 01:22:15 +0000363 if (src && src_len > 0)
Greg Clayton197bacf2011-07-02 21:07:54 +0000364 {
Greg Clayton0c51ac32011-07-02 23:21:06 +0000365 if (log && log->GetVerbose())
Greg Clayton197bacf2011-07-02 21:07:54 +0000366 {
367 StreamString s;
Greg Clayton0c51ac32011-07-02 23:21:06 +0000368 log->Printf ("GDBRemoteCommunication::%s adding %u bytes: %.*s",
369 __FUNCTION__,
370 (uint32_t)src_len,
371 (uint32_t)src_len,
372 src);
Greg Clayton197bacf2011-07-02 21:07:54 +0000373 }
Greg Clayton73bf5db2011-06-17 01:22:15 +0000374 m_bytes.append ((const char *)src, src_len);
Greg Clayton197bacf2011-07-02 21:07:54 +0000375 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000376
377 // Parse up the packets into gdb remote packets
Greg Clayton197bacf2011-07-02 21:07:54 +0000378 if (!m_bytes.empty())
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000379 {
380 // end_idx must be one past the last valid packet byte. Start
381 // it off with an invalid value that is the same as the current
382 // index.
Greg Clayton73bf5db2011-06-17 01:22:15 +0000383 size_t content_start = 0;
384 size_t content_length = 0;
385 size_t total_length = 0;
386 size_t checksum_idx = std::string::npos;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000387
388 switch (m_bytes[0])
389 {
390 case '+': // Look for ack
391 case '-': // Look for cancel
392 case '\x03': // ^C to halt target
Greg Clayton73bf5db2011-06-17 01:22:15 +0000393 content_length = total_length = 1; // The command is one byte long...
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000394 break;
395
396 case '$':
397 // Look for a standard gdb packet?
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000398 {
Greg Clayton73bf5db2011-06-17 01:22:15 +0000399 size_t hash_pos = m_bytes.find('#');
400 if (hash_pos != std::string::npos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000401 {
Greg Clayton73bf5db2011-06-17 01:22:15 +0000402 if (hash_pos + 2 < m_bytes.size())
403 {
404 checksum_idx = hash_pos + 1;
405 // Skip the dollar sign
406 content_start = 1;
407 // Don't include the # in the content or the $ in the content length
408 content_length = hash_pos - 1;
409
410 total_length = hash_pos + 3; // Skip the # and the two hex checksum bytes
411 }
412 else
413 {
414 // Checksum bytes aren't all here yet
415 content_length = std::string::npos;
416 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000417 }
418 }
419 break;
420
421 default:
Greg Claytonf3dd93c2011-06-17 03:31:01 +0000422 {
Greg Clayton197bacf2011-07-02 21:07:54 +0000423 // We have an unexpected byte and we need to flush all bad
424 // data that is in m_bytes, so we need to find the first
425 // byte that is a '+' (ACK), '-' (NACK), \x03 (CTRL+C interrupt),
426 // or '$' character (start of packet header) or of course,
427 // the end of the data in m_bytes...
428 const size_t bytes_len = m_bytes.size();
429 bool done = false;
430 uint32_t idx;
431 for (idx = 1; !done && idx < bytes_len; ++idx)
432 {
433 switch (m_bytes[idx])
434 {
435 case '+':
436 case '-':
437 case '\x03':
438 case '$':
439 done = true;
440 break;
441
442 default:
443 break;
444 }
445 }
Greg Claytonf3dd93c2011-06-17 03:31:01 +0000446 if (log)
Greg Clayton197bacf2011-07-02 21:07:54 +0000447 log->Printf ("GDBRemoteCommunication::%s tossing %u junk bytes: '%.*s'",
448 __FUNCTION__, idx, idx, m_bytes.c_str());
449 m_bytes.erase(0, idx);
Greg Claytonf3dd93c2011-06-17 03:31:01 +0000450 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000451 break;
452 }
453
Greg Clayton73bf5db2011-06-17 01:22:15 +0000454 if (content_length == std::string::npos)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000455 {
Greg Clayton73bf5db2011-06-17 01:22:15 +0000456 packet.Clear();
457 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000458 }
Greg Claytonf3dd93c2011-06-17 03:31:01 +0000459 else if (total_length > 0)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000460 {
Greg Clayton73bf5db2011-06-17 01:22:15 +0000461
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000462 // We have a valid packet...
Greg Clayton73bf5db2011-06-17 01:22:15 +0000463 assert (content_length <= m_bytes.size());
464 assert (total_length <= m_bytes.size());
465 assert (content_length <= total_length);
Greg Clayton06f09b52014-06-20 20:41:07 +0000466 const size_t content_end = content_start + content_length;
467
Greg Clayton73bf5db2011-06-17 01:22:15 +0000468 bool success = true;
469 std::string &packet_str = packet.GetStringRef();
Greg Claytonc1422c12012-04-09 22:46:21 +0000470
471
472 if (log)
473 {
474 // If logging was just enabled and we have history, then dump out what
475 // we have to the log so we get the historical context. The Dump() call that
476 // logs all of the packet will set a boolean so that we don't dump this more
477 // than once
478 if (!m_history.DidDumpToLog ())
Greg Clayton5160ce52013-03-27 23:08:40 +0000479 m_history.Dump (log);
Greg Claytonc1422c12012-04-09 22:46:21 +0000480
Greg Clayton06f09b52014-06-20 20:41:07 +0000481 bool binary = false;
482 // Only detect binary for packets that start with a '$' and have a '#CC' checksum
483 if (m_bytes[0] == '$' && total_length > 4)
484 {
485 for (size_t i=0; !binary && i<total_length; ++i)
486 {
487 if (isprint(m_bytes[i]) == 0)
488 binary = true;
489 }
490 }
491 if (binary)
492 {
493 StreamString strm;
494 // Packet header...
495 strm.Printf("<%4" PRIu64 "> read packet: %c", (uint64_t)total_length, m_bytes[0]);
496 for (size_t i=content_start; i<content_end; ++i)
497 {
498 // Remove binary escaped bytes when displaying the packet...
499 const char ch = m_bytes[i];
500 if (ch == 0x7d)
501 {
502 // 0x7d is the escape character. The next character is to
503 // be XOR'd with 0x20.
504 const char escapee = m_bytes[++i] ^ 0x20;
505 strm.Printf("%2.2x", escapee);
506 }
507 else
508 {
509 strm.Printf("%2.2x", (uint8_t)ch);
510 }
511 }
512 // Packet footer...
513 strm.Printf("%c%c%c", m_bytes[total_length-3], m_bytes[total_length-2], m_bytes[total_length-1]);
514 log->PutCString(strm.GetString().c_str());
515 }
516 else
517 {
518 log->Printf("<%4" PRIu64 "> read packet: %.*s", (uint64_t)total_length, (int)(total_length), m_bytes.c_str());
519 }
Greg Claytonc1422c12012-04-09 22:46:21 +0000520 }
521
522 m_history.AddPacket (m_bytes.c_str(), total_length, History::ePacketTypeRecv, total_length);
523
Hafiz Abid Qadeere5fd5e12013-08-28 15:10:37 +0000524 // Clear packet_str in case there is some existing data in it.
525 packet_str.clear();
Hafiz Abid Qadeerda96ef22013-08-28 10:31:52 +0000526 // Copy the packet from m_bytes to packet_str expanding the
527 // run-length encoding in the process.
528 // Reserve enough byte for the most common case (no RLE used)
529 packet_str.reserve(m_bytes.length());
Greg Clayton06f09b52014-06-20 20:41:07 +0000530 for (std::string::const_iterator c = m_bytes.begin() + content_start; c != m_bytes.begin() + content_end; ++c)
Hafiz Abid Qadeerda96ef22013-08-28 10:31:52 +0000531 {
532 if (*c == '*')
533 {
534 // '*' indicates RLE. Next character will give us the
535 // repeat count and previous character is what is to be
536 // repeated.
537 char char_to_repeat = packet_str.back();
538 // Number of time the previous character is repeated
539 int repeat_count = *++c + 3 - ' ';
540 // We have the char_to_repeat and repeat_count. Now push
541 // it in the packet.
542 for (int i = 0; i < repeat_count; ++i)
543 packet_str.push_back(char_to_repeat);
544 }
Steve Pucci3c5d3332014-02-24 19:07:29 +0000545 else if (*c == 0x7d)
546 {
547 // 0x7d is the escape character. The next character is to
548 // be XOR'd with 0x20.
549 char escapee = *++c ^ 0x20;
550 packet_str.push_back(escapee);
551 }
Hafiz Abid Qadeerda96ef22013-08-28 10:31:52 +0000552 else
553 {
554 packet_str.push_back(*c);
555 }
556 }
557
Greg Clayton73bf5db2011-06-17 01:22:15 +0000558 if (m_bytes[0] == '$')
559 {
560 assert (checksum_idx < m_bytes.size());
561 if (::isxdigit (m_bytes[checksum_idx+0]) ||
562 ::isxdigit (m_bytes[checksum_idx+1]))
563 {
564 if (GetSendAcks ())
565 {
566 const char *packet_checksum_cstr = &m_bytes[checksum_idx];
567 char packet_checksum = strtol (packet_checksum_cstr, NULL, 16);
568 char actual_checksum = CalculcateChecksum (packet_str.c_str(), packet_str.size());
569 success = packet_checksum == actual_checksum;
570 if (!success)
571 {
572 if (log)
573 log->Printf ("error: checksum mismatch: %.*s expected 0x%2.2x, got 0x%2.2x",
574 (int)(total_length),
575 m_bytes.c_str(),
576 (uint8_t)packet_checksum,
577 (uint8_t)actual_checksum);
578 }
579 // Send the ack or nack if needed
580 if (!success)
581 SendNack();
582 else
583 SendAck();
584 }
Greg Clayton73bf5db2011-06-17 01:22:15 +0000585 }
586 else
587 {
588 success = false;
589 if (log)
Jason Molendafd54b362011-09-20 21:44:10 +0000590 log->Printf ("error: invalid checksum in packet: '%s'\n", m_bytes.c_str());
Greg Clayton73bf5db2011-06-17 01:22:15 +0000591 }
592 }
Greg Claytonc1422c12012-04-09 22:46:21 +0000593
Greg Clayton73bf5db2011-06-17 01:22:15 +0000594 m_bytes.erase(0, total_length);
595 packet.SetFilePos(0);
596 return success;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000597 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000598 }
Greg Clayton73bf5db2011-06-17 01:22:15 +0000599 packet.Clear();
600 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000601}
602
Greg Clayton8b82f082011-04-12 05:54:46 +0000603Error
Greg Claytond6299802013-12-06 17:46:35 +0000604GDBRemoteCommunication::StartListenThread (const char *hostname, uint16_t port)
Greg Clayton00fe87b2013-12-05 22:58:22 +0000605{
606 Error error;
607 if (IS_VALID_LLDB_HOST_THREAD(m_listen_thread))
608 {
609 error.SetErrorString("listen thread already running");
610 }
611 else
612 {
613 char listen_url[512];
614 if (hostname && hostname[0])
Jean-Daniel Dupas3c6774a2014-02-08 20:29:40 +0000615 snprintf(listen_url, sizeof(listen_url), "listen://%s:%i", hostname, port);
Greg Clayton00fe87b2013-12-05 22:58:22 +0000616 else
617 snprintf(listen_url, sizeof(listen_url), "listen://%i", port);
618 m_listen_url = listen_url;
619 SetConnection(new ConnectionFileDescriptor());
620 m_listen_thread = Host::ThreadCreate (listen_url, GDBRemoteCommunication::ListenThread, this, &error);
621 }
622 return error;
623}
624
625bool
626GDBRemoteCommunication::JoinListenThread ()
627{
628 if (IS_VALID_LLDB_HOST_THREAD(m_listen_thread))
629 {
630 Host::ThreadJoin(m_listen_thread, NULL, NULL);
631 m_listen_thread = LLDB_INVALID_HOST_THREAD;
632 }
633 return true;
634}
635
636lldb::thread_result_t
637GDBRemoteCommunication::ListenThread (lldb::thread_arg_t arg)
638{
639 GDBRemoteCommunication *comm = (GDBRemoteCommunication *)arg;
640 Error error;
641 ConnectionFileDescriptor *connection = (ConnectionFileDescriptor *)comm->GetConnection ();
642
643 if (connection)
644 {
645 // Do the listen on another thread so we can continue on...
646 if (connection->Connect(comm->m_listen_url.c_str(), &error) != eConnectionStatusSuccess)
647 comm->SetConnection(NULL);
648 }
649 return NULL;
650}
651
652Error
Greg Claytonfda4fab2014-01-10 22:24:11 +0000653GDBRemoteCommunication::StartDebugserverProcess (const char *hostname,
654 uint16_t in_port,
Greg Clayton91a9b2472013-12-04 19:19:12 +0000655 lldb_private::ProcessLaunchInfo &launch_info,
Greg Claytonfda4fab2014-01-10 22:24:11 +0000656 uint16_t &out_port)
Greg Clayton8b82f082011-04-12 05:54:46 +0000657{
Todd Fiala015d8182014-07-22 23:41:36 +0000658 Log *log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PROCESS));
659 if (log)
660 log->Printf ("GDBRemoteCommunication::%s(hostname=%s, in_port=%" PRIu16 ", out_port=%" PRIu16, __FUNCTION__, hostname ? hostname : "<empty>", in_port, out_port);
661
Greg Claytonfda4fab2014-01-10 22:24:11 +0000662 out_port = in_port;
Greg Clayton8b82f082011-04-12 05:54:46 +0000663 Error error;
664 // If we locate debugserver, keep that located version around
665 static FileSpec g_debugserver_file_spec;
666
Greg Clayton8b82f082011-04-12 05:54:46 +0000667 char debugserver_path[PATH_MAX];
668 FileSpec &debugserver_file_spec = launch_info.GetExecutableFile();
669
670 // Always check to see if we have an environment override for the path
671 // to the debugserver to use and use it if we do.
672 const char *env_debugserver_path = getenv("LLDB_DEBUGSERVER_PATH");
673 if (env_debugserver_path)
Todd Fiala015d8182014-07-22 23:41:36 +0000674 {
Greg Clayton8b82f082011-04-12 05:54:46 +0000675 debugserver_file_spec.SetFile (env_debugserver_path, false);
Todd Fiala015d8182014-07-22 23:41:36 +0000676 if (log)
677 log->Printf ("GDBRemoteCommunication::%s() gdb-remote stub exe path set from environment variable: %s", __FUNCTION__, env_debugserver_path);
678 }
Greg Clayton8b82f082011-04-12 05:54:46 +0000679 else
680 debugserver_file_spec = g_debugserver_file_spec;
681 bool debugserver_exists = debugserver_file_spec.Exists();
682 if (!debugserver_exists)
683 {
684 // The debugserver binary is in the LLDB.framework/Resources
685 // directory.
686 if (Host::GetLLDBPath (ePathTypeSupportExecutableDir, debugserver_file_spec))
687 {
688 debugserver_file_spec.GetFilename().SetCString(DEBUGSERVER_BASENAME);
689 debugserver_exists = debugserver_file_spec.Exists();
690 if (debugserver_exists)
691 {
Todd Fiala015d8182014-07-22 23:41:36 +0000692 if (log)
693 log->Printf ("GDBRemoteCommunication::%s() found gdb-remote stub exe '%s'", __FUNCTION__, debugserver_file_spec.GetPath ().c_str ());
694
Greg Clayton8b82f082011-04-12 05:54:46 +0000695 g_debugserver_file_spec = debugserver_file_spec;
696 }
697 else
698 {
Todd Fiala015d8182014-07-22 23:41:36 +0000699 if (log)
700 log->Printf ("GDBRemoteCommunication::%s() could not find gdb-remote stub exe '%s'", __FUNCTION__, debugserver_file_spec.GetPath ().c_str ());
701
Greg Clayton8b82f082011-04-12 05:54:46 +0000702 g_debugserver_file_spec.Clear();
703 debugserver_file_spec.Clear();
704 }
705 }
706 }
707
708 if (debugserver_exists)
709 {
710 debugserver_file_spec.GetPath (debugserver_path, sizeof(debugserver_path));
711
712 Args &debugserver_args = launch_info.GetArguments();
713 debugserver_args.Clear();
714 char arg_cstr[PATH_MAX];
715
716 // Start args with "debugserver /file/path -r --"
717 debugserver_args.AppendArgument(debugserver_path);
Greg Clayton00fe87b2013-12-05 22:58:22 +0000718
719 // If a host and port is supplied then use it
Greg Claytonfda4fab2014-01-10 22:24:11 +0000720 char host_and_port[128];
721 if (hostname)
722 {
723 snprintf (host_and_port, sizeof(host_and_port), "%s:%u", hostname, in_port);
Greg Clayton00fe87b2013-12-05 22:58:22 +0000724 debugserver_args.AppendArgument(host_and_port);
Greg Claytonfda4fab2014-01-10 22:24:11 +0000725 }
726 else
727 {
728 host_and_port[0] = '\0';
729 }
730
Greg Clayton8b82f082011-04-12 05:54:46 +0000731 // use native registers, not the GDB registers
732 debugserver_args.AppendArgument("--native-regs");
733 // make debugserver run in its own session so signals generated by
734 // special terminal key sequences (^C) don't affect debugserver
735 debugserver_args.AppendArgument("--setsid");
Greg Clayton91a9b2472013-12-04 19:19:12 +0000736
Greg Clayton00fe87b2013-12-05 22:58:22 +0000737 char named_pipe_path[PATH_MAX];
Jason Molenda6e205542014-01-25 03:57:13 +0000738 named_pipe_path[0] = '\0';
Greg Clayton00fe87b2013-12-05 22:58:22 +0000739
Greg Claytonfda4fab2014-01-10 22:24:11 +0000740 bool listen = false;
741 if (host_and_port[0])
Greg Clayton91a9b2472013-12-04 19:19:12 +0000742 {
Greg Clayton00fe87b2013-12-05 22:58:22 +0000743 // Create a temporary file to get the stdout/stderr and redirect the
744 // output of the command into this file. We will later read this file
745 // if all goes well and fill the data into "command_output_ptr"
Greg Clayton00fe87b2013-12-05 22:58:22 +0000746
Greg Claytonfda4fab2014-01-10 22:24:11 +0000747 if (in_port == 0)
Greg Clayton00fe87b2013-12-05 22:58:22 +0000748 {
Greg Claytonfda4fab2014-01-10 22:24:11 +0000749 // Binding to port zero, we need to figure out what port it ends up
750 // using using a named pipe...
751 FileSpec tmpdir_file_spec;
752 if (Host::GetLLDBPath (ePathTypeLLDBTempSystemDir, tmpdir_file_spec))
Greg Clayton00fe87b2013-12-05 22:58:22 +0000753 {
Greg Claytonfda4fab2014-01-10 22:24:11 +0000754 tmpdir_file_spec.GetFilename().SetCString("debugserver-named-pipe.XXXXXX");
755 strncpy(named_pipe_path, tmpdir_file_spec.GetPath().c_str(), sizeof(named_pipe_path));
756 }
757 else
758 {
759 strncpy(named_pipe_path, "/tmp/debugserver-named-pipe.XXXXXX", sizeof(named_pipe_path));
760 }
761
762 if (::mktemp (named_pipe_path))
763 {
Hafiz Abid Qadeer6eff1012014-03-12 10:45:23 +0000764#if defined(_WIN32)
Deepak Panickalb36da432014-01-13 14:55:15 +0000765 if ( false )
766#else
Greg Claytonfda4fab2014-01-10 22:24:11 +0000767 if (::mkfifo(named_pipe_path, 0600) == 0)
Deepak Panickalb36da432014-01-13 14:55:15 +0000768#endif
Greg Claytonfda4fab2014-01-10 22:24:11 +0000769 {
770 debugserver_args.AppendArgument("--named-pipe");
771 debugserver_args.AppendArgument(named_pipe_path);
772 }
Greg Clayton00fe87b2013-12-05 22:58:22 +0000773 }
Greg Clayton91a9b2472013-12-04 19:19:12 +0000774 }
775 else
Greg Claytonfda4fab2014-01-10 22:24:11 +0000776 {
777 listen = true;
778 }
Greg Clayton91a9b2472013-12-04 19:19:12 +0000779 }
780 else
Greg Clayton00fe87b2013-12-05 22:58:22 +0000781 {
Greg Clayton00fe87b2013-12-05 22:58:22 +0000782 // No host and port given, so lets listen on our end and make the debugserver
783 // connect to us..
Greg Clayton16810922014-02-27 19:38:18 +0000784 error = StartListenThread ("127.0.0.1", 0);
Greg Clayton00fe87b2013-12-05 22:58:22 +0000785 if (error.Fail())
786 return error;
Greg Clayton8b82f082011-04-12 05:54:46 +0000787
Greg Clayton00fe87b2013-12-05 22:58:22 +0000788 ConnectionFileDescriptor *connection = (ConnectionFileDescriptor *)GetConnection ();
Greg Clayton16810922014-02-27 19:38:18 +0000789 // Wait for 10 seconds to resolve the bound port
Zachary Turner98688922014-08-06 18:16:26 +0000790 out_port = connection->GetListeningPort(10);
Greg Clayton16810922014-02-27 19:38:18 +0000791 if (out_port > 0)
792 {
793 char port_cstr[32];
794 snprintf(port_cstr, sizeof(port_cstr), "127.0.0.1:%i", out_port);
795 // Send the host and port down that debugserver and specify an option
796 // so that it connects back to the port we are listening to in this process
797 debugserver_args.AppendArgument("--reverse-connect");
798 debugserver_args.AppendArgument(port_cstr);
799 }
800 else
801 {
802 error.SetErrorString ("failed to bind to port 0 on 127.0.0.1");
803 return error;
804 }
Greg Clayton00fe87b2013-12-05 22:58:22 +0000805 }
Greg Clayton00fe87b2013-12-05 22:58:22 +0000806
Greg Clayton8b82f082011-04-12 05:54:46 +0000807 const char *env_debugserver_log_file = getenv("LLDB_DEBUGSERVER_LOG_FILE");
808 if (env_debugserver_log_file)
809 {
810 ::snprintf (arg_cstr, sizeof(arg_cstr), "--log-file=%s", env_debugserver_log_file);
811 debugserver_args.AppendArgument(arg_cstr);
812 }
813
814 const char *env_debugserver_log_flags = getenv("LLDB_DEBUGSERVER_LOG_FLAGS");
815 if (env_debugserver_log_flags)
816 {
817 ::snprintf (arg_cstr, sizeof(arg_cstr), "--log-flags=%s", env_debugserver_log_flags);
818 debugserver_args.AppendArgument(arg_cstr);
819 }
Greg Clayton8b82f082011-04-12 05:54:46 +0000820
821 // Close STDIN, STDOUT and STDERR. We might need to redirect them
822 // to "/dev/null" if we run into any problems.
Greg Clayton91a9b2472013-12-04 19:19:12 +0000823 launch_info.AppendCloseFileAction (STDIN_FILENO);
824 launch_info.AppendCloseFileAction (STDOUT_FILENO);
825 launch_info.AppendCloseFileAction (STDERR_FILENO);
Greg Clayton8b82f082011-04-12 05:54:46 +0000826
827 error = Host::LaunchProcess(launch_info);
Greg Clayton91a9b2472013-12-04 19:19:12 +0000828
Greg Clayton3121fde2014-02-28 20:47:08 +0000829 if (error.Success() && launch_info.GetProcessID() != LLDB_INVALID_PROCESS_ID)
Greg Clayton91a9b2472013-12-04 19:19:12 +0000830 {
Greg Clayton3121fde2014-02-28 20:47:08 +0000831 if (named_pipe_path[0])
Greg Clayton91a9b2472013-12-04 19:19:12 +0000832 {
Greg Clayton3121fde2014-02-28 20:47:08 +0000833 File name_pipe_file;
834 error = name_pipe_file.Open(named_pipe_path, File::eOpenOptionRead);
835 if (error.Success())
836 {
837 char port_cstr[256];
838 port_cstr[0] = '\0';
839 size_t num_bytes = sizeof(port_cstr);
840 error = name_pipe_file.Read(port_cstr, num_bytes);
841 assert (error.Success());
842 assert (num_bytes > 0 && port_cstr[num_bytes-1] == '\0');
843 out_port = Args::StringToUInt32(port_cstr, 0);
844 name_pipe_file.Close();
845 }
846 Host::Unlink(named_pipe_path);
Greg Clayton91a9b2472013-12-04 19:19:12 +0000847 }
Greg Clayton3121fde2014-02-28 20:47:08 +0000848 else if (listen)
849 {
850
851 }
852 else
853 {
854 // Make sure we actually connect with the debugserver...
855 JoinListenThread();
856 }
Greg Clayton00fe87b2013-12-05 22:58:22 +0000857 }
Greg Clayton8b82f082011-04-12 05:54:46 +0000858 }
859 else
860 {
Greg Clayton86edbf42011-10-26 00:56:27 +0000861 error.SetErrorStringWithFormat ("unable to locate " DEBUGSERVER_BASENAME );
Greg Clayton8b82f082011-04-12 05:54:46 +0000862 }
863 return error;
864}
865
Greg Claytonc1422c12012-04-09 22:46:21 +0000866void
Greg Claytond451c1a2012-04-13 21:24:18 +0000867GDBRemoteCommunication::DumpHistory(Stream &strm)
Greg Claytonc1422c12012-04-09 22:46:21 +0000868{
Greg Claytond451c1a2012-04-13 21:24:18 +0000869 m_history.Dump (strm);
Greg Claytonc1422c12012-04-09 22:46:21 +0000870}