GDBRemoteCommunication.cpp revision 7e2f91cb958c8670774cb2190db7b858618b5b9b
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// C++ Includes 15// Other libraries and framework includes 16#include "lldb/Interpreter/Args.h" 17#include "lldb/Core/ConnectionFileDescriptor.h" 18#include "lldb/Core/Log.h" 19#include "lldb/Core/State.h" 20#include "lldb/Core/StreamString.h" 21#include "lldb/Host/TimeValue.h" 22 23// Project includes 24#include "Utility/StringExtractorGDBRemote.h" 25#include "ProcessGDBRemote.h" 26#include "ProcessGDBRemoteLog.h" 27 28using namespace lldb; 29using namespace lldb_private; 30 31//---------------------------------------------------------------------- 32// GDBRemoteCommunication constructor 33//---------------------------------------------------------------------- 34GDBRemoteCommunication::GDBRemoteCommunication() : 35 Communication("gdb-remote.packets"), 36 m_send_acks (true), 37 m_thread_suffix_supported (false), 38 m_rx_packet_listener ("gdbremote.rx_packet"), 39 m_sequence_mutex (Mutex::eMutexTypeRecursive), 40 m_public_is_running (false), 41 m_private_is_running (false), 42 m_async_mutex (Mutex::eMutexTypeRecursive), 43 m_async_packet_predicate (false), 44 m_async_packet (), 45 m_async_response (), 46 m_async_timeout (UINT32_MAX), 47 m_async_signal (-1), 48 m_arch(), 49 m_os(), 50 m_vendor(), 51 m_byte_order(eByteOrderHost), 52 m_pointer_byte_size(0) 53{ 54 m_rx_packet_listener.StartListeningForEvents(this, 55 Communication::eBroadcastBitPacketAvailable | 56 Communication::eBroadcastBitReadThreadDidExit); 57} 58 59//---------------------------------------------------------------------- 60// Destructor 61//---------------------------------------------------------------------- 62GDBRemoteCommunication::~GDBRemoteCommunication() 63{ 64 m_rx_packet_listener.StopListeningForEvents(this, 65 Communication::eBroadcastBitPacketAvailable | 66 Communication::eBroadcastBitReadThreadDidExit); 67 if (IsConnected()) 68 { 69 StopReadThread(); 70 Disconnect(); 71 } 72} 73 74 75char 76GDBRemoteCommunication::CalculcateChecksum (const char *payload, size_t payload_length) 77{ 78 int checksum = 0; 79 80 // We only need to compute the checksum if we are sending acks 81 if (m_send_acks) 82 { 83 for (size_t i = 0; i < payload_length; ++i) 84 checksum += payload[i]; 85 } 86 return checksum & 255; 87} 88 89size_t 90GDBRemoteCommunication::SendAck () 91{ 92 ProcessGDBRemoteLog::LogIf (GDBR_LOG_PACKETS, "send packet: +"); 93 ConnectionStatus status = eConnectionStatusSuccess; 94 char ack_char = '+'; 95 return Write (&ack_char, 1, status, NULL) == 1; 96} 97 98size_t 99GDBRemoteCommunication::SendNack () 100{ 101 ProcessGDBRemoteLog::LogIf (GDBR_LOG_PACKETS, "send packet: -"); 102 ConnectionStatus status = eConnectionStatusSuccess; 103 char nack_char = '-'; 104 return Write (&nack_char, 1, status, NULL) == 1; 105} 106 107size_t 108GDBRemoteCommunication::SendPacketAndWaitForResponse 109( 110 const char *payload, 111 StringExtractorGDBRemote &response, 112 uint32_t timeout_seconds, 113 bool send_async 114) 115{ 116 return SendPacketAndWaitForResponse (payload, 117 ::strlen (payload), 118 response, 119 timeout_seconds, 120 send_async); 121} 122 123size_t 124GDBRemoteCommunication::SendPacketAndWaitForResponse 125( 126 const char *payload, 127 size_t payload_length, 128 StringExtractorGDBRemote &response, 129 uint32_t timeout_seconds, 130 bool send_async 131) 132{ 133 Mutex::Locker locker; 134 TimeValue timeout_time; 135 timeout_time = TimeValue::Now(); 136 timeout_time.OffsetWithSeconds (timeout_seconds); 137 LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PROCESS)); 138 139 if (GetSequenceMutex (locker)) 140 { 141 if (SendPacketNoLock (payload, strlen(payload))) 142 return WaitForPacketNoLock (response, &timeout_time); 143 } 144 else 145 { 146 if (send_async) 147 { 148 Mutex::Locker async_locker (m_async_mutex); 149 m_async_packet.assign(payload, payload_length); 150 m_async_timeout = timeout_seconds; 151 m_async_packet_predicate.SetValue (true, eBroadcastNever); 152 153 if (log) 154 log->Printf ("async: async packet = %s", m_async_packet.c_str()); 155 156 bool timed_out = false; 157 bool sent_interrupt = false; 158 if (SendInterrupt(locker, 2, sent_interrupt, timed_out)) 159 { 160 if (sent_interrupt) 161 { 162 if (log) 163 log->Printf ("async: sent interrupt"); 164 if (m_async_packet_predicate.WaitForValueEqualTo (false, &timeout_time, &timed_out)) 165 { 166 if (log) 167 log->Printf ("async: got response"); 168 response = m_async_response; 169 return response.GetStringRef().size(); 170 } 171 else 172 { 173 if (log) 174 log->Printf ("async: timed out waiting for response"); 175 } 176 177 // Make sure we wait until the continue packet has been sent again... 178 if (m_private_is_running.WaitForValueEqualTo (true, &timeout_time, &timed_out)) 179 { 180 if (log) 181 log->Printf ("async: timed out waiting for process to resume"); 182 } 183 } 184 else 185 { 186 // We had a racy condition where we went to send the interrupt 187 // yet we were able to get the loc 188 } 189 } 190 else 191 { 192 if (log) 193 log->Printf ("async: failed to interrupt"); 194 } 195 } 196 else 197 { 198 if (log) 199 log->Printf ("mutex taken and send_async == false, aborting packet"); 200 } 201 } 202 return 0; 203} 204 205//template<typename _Tp> 206//class ScopedValueChanger 207//{ 208//public: 209// // Take a value reference and the value to assign it to when this class 210// // instance goes out of scope. 211// ScopedValueChanger (_Tp &value_ref, _Tp value) : 212// m_value_ref (value_ref), 213// m_value (value) 214// { 215// } 216// 217// // This object is going out of scope, change the value pointed to by 218// // m_value_ref to the value we got during construction which was stored in 219// // m_value; 220// ~ScopedValueChanger () 221// { 222// m_value_ref = m_value; 223// } 224//protected: 225// _Tp &m_value_ref; // A reference to the value we will change when this object destructs 226// _Tp m_value; // The value to assign to m_value_ref when this goes out of scope. 227//}; 228 229StateType 230GDBRemoteCommunication::SendContinuePacketAndWaitForResponse 231( 232 ProcessGDBRemote *process, 233 const char *payload, 234 size_t packet_length, 235 StringExtractorGDBRemote &response 236) 237{ 238 LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PROCESS)); 239 if (log) 240 log->Printf ("GDBRemoteCommunication::%s ()", __FUNCTION__); 241 242 Mutex::Locker locker(m_sequence_mutex); 243 StateType state = eStateRunning; 244 245 BroadcastEvent(eBroadcastBitRunPacketSent, NULL); 246 m_public_is_running.SetValue (true, eBroadcastNever); 247 // Set the starting continue packet into "continue_packet". This packet 248 // make change if we are interrupted and we continue after an async packet... 249 std::string continue_packet(payload, packet_length); 250 251 while (state == eStateRunning) 252 { 253 if (log) 254 log->Printf ("GDBRemoteCommunication::%s () sending continue packet: %s", __FUNCTION__, continue_packet.c_str()); 255 if (SendPacket(continue_packet.c_str(), continue_packet.size()) == 0) 256 state = eStateInvalid; 257 258 m_private_is_running.SetValue (true, eBroadcastNever); 259 260 if (log) 261 log->Printf ("GDBRemoteCommunication::%s () WaitForPacket(%.*s)", __FUNCTION__); 262 263 if (WaitForPacket (response, (TimeValue*)NULL)) 264 { 265 if (response.Empty()) 266 state = eStateInvalid; 267 else 268 { 269 const char stop_type = response.GetChar(); 270 if (log) 271 log->Printf ("GDBRemoteCommunication::%s () got packet: %s", __FUNCTION__, response.GetStringRef().c_str()); 272 switch (stop_type) 273 { 274 case 'T': 275 case 'S': 276 if (process->GetStopID() == 0) 277 { 278 if (process->GetID() == LLDB_INVALID_PROCESS_ID) 279 { 280 lldb::pid_t pid = GetCurrentProcessID (1); 281 if (pid != LLDB_INVALID_PROCESS_ID) 282 process->SetID (pid); 283 } 284 process->BuildDynamicRegisterInfo (true); 285 } 286 287 // Privately notify any internal threads that we have stopped 288 // in case we wanted to interrupt our process, yet we might 289 // send a packet and continue without returning control to the 290 // user. 291 m_private_is_running.SetValue (false, eBroadcastAlways); 292 if (m_async_signal != -1) 293 { 294 if (log) 295 log->Printf ("async: send signo = %s", Host::GetSignalAsCString (m_async_signal)); 296 297 // Save off the async signal we are supposed to send 298 const int async_signal = m_async_signal; 299 // Clear the async signal member so we don't end up 300 // sending the signal multiple times... 301 m_async_signal = -1; 302 // Check which signal we stopped with 303 uint8_t signo = response.GetHexU8(255); 304 if (signo == async_signal) 305 { 306 if (log) 307 log->Printf ("async: stopped with signal %s, we are done running", Host::GetSignalAsCString (signo)); 308 309 // We already stopped with a signal that we wanted 310 // to stop with, so we are done 311 response.SetFilePos (0); 312 } 313 else 314 { 315 // We stopped with a different signal that the one 316 // we wanted to stop with, so now we must resume 317 // with the signal we want 318 char signal_packet[32]; 319 int signal_packet_len = 0; 320 signal_packet_len = ::snprintf (signal_packet, 321 sizeof (signal_packet), 322 "C%2.2x", 323 async_signal); 324 325 if (log) 326 log->Printf ("async: stopped with signal %s, resume with %s", 327 Host::GetSignalAsCString (signo), 328 Host::GetSignalAsCString (async_signal)); 329 330 // Set the continue packet to resume... 331 continue_packet.assign(signal_packet, signal_packet_len); 332 continue; 333 } 334 } 335 else if (m_async_packet_predicate.GetValue()) 336 { 337 // We are supposed to send an asynchronous packet while 338 // we are running. 339 m_async_response.Clear(); 340 if (m_async_packet.empty()) 341 { 342 if (log) 343 log->Printf ("async: error: empty async packet"); 344 345 } 346 else 347 { 348 if (log) 349 log->Printf ("async: sending packet: %s", 350 m_async_packet.c_str()); 351 352 SendPacketAndWaitForResponse (&m_async_packet[0], 353 m_async_packet.size(), 354 m_async_response, 355 m_async_timeout, 356 false); 357 } 358 // Let the other thread that was trying to send the async 359 // packet know that the packet has been sent and response is 360 // ready... 361 m_async_packet_predicate.SetValue(false, eBroadcastAlways); 362 363 // Set the continue packet to resume... 364 continue_packet.assign (1, 'c'); 365 continue; 366 } 367 // Stop with signal and thread info 368 state = eStateStopped; 369 break; 370 371 case 'W': 372 case 'X': 373 // process exited 374 state = eStateExited; 375 break; 376 377 case 'O': 378 // STDOUT 379 { 380 std::string inferior_stdout; 381 inferior_stdout.reserve(response.GetBytesLeft () / 2); 382 char ch; 383 while ((ch = response.GetHexU8()) != '\0') 384 inferior_stdout.append(1, ch); 385 process->AppendSTDOUT (inferior_stdout.c_str(), inferior_stdout.size()); 386 } 387 break; 388 389 case 'E': 390 // ERROR 391 state = eStateInvalid; 392 break; 393 394 default: 395 if (log) 396 log->Printf ("GDBRemoteCommunication::%s () unrecognized async packet", __FUNCTION__); 397 break; 398 } 399 } 400 } 401 else 402 { 403 if (log) 404 log->Printf ("GDBRemoteCommunication::%s () WaitForPacket(...) => false", __FUNCTION__); 405 state = eStateInvalid; 406 } 407 } 408 if (log) 409 log->Printf ("GDBRemoteCommunication::%s () => %s", __FUNCTION__, StateAsCString(state)); 410 response.SetFilePos(0); 411 m_private_is_running.SetValue (false, eBroadcastAlways); 412 m_public_is_running.SetValue (false, eBroadcastAlways); 413 return state; 414} 415 416size_t 417GDBRemoteCommunication::SendPacket (const char *payload) 418{ 419 Mutex::Locker locker(m_sequence_mutex); 420 return SendPacketNoLock (payload, ::strlen (payload)); 421} 422 423size_t 424GDBRemoteCommunication::SendPacket (const char *payload, size_t payload_length) 425{ 426 Mutex::Locker locker(m_sequence_mutex); 427 return SendPacketNoLock (payload, payload_length); 428} 429 430size_t 431GDBRemoteCommunication::SendPacketNoLock (const char *payload, size_t payload_length) 432{ 433 if (IsConnected()) 434 { 435 StreamString packet(0, 4, eByteOrderBig); 436 437 packet.PutChar('$'); 438 packet.Write (payload, payload_length); 439 packet.PutChar('#'); 440 packet.PutHex8(CalculcateChecksum (payload, payload_length)); 441 442 ProcessGDBRemoteLog::LogIf (GDBR_LOG_PACKETS, "send packet: %s", packet.GetData()); 443 ConnectionStatus status = eConnectionStatusSuccess; 444 size_t bytes_written = Write (packet.GetData(), packet.GetSize(), status, NULL); 445 if (bytes_written == packet.GetSize()) 446 { 447 if (m_send_acks) 448 { 449 if (GetAck (1) != '+') 450 return 0; 451 } 452 } 453 else 454 { 455 ProcessGDBRemoteLog::LogIf (GDBR_LOG_PACKETS, "error: failed to send packet: %s", packet.GetData()); 456 } 457 return bytes_written; 458 } 459 return 0; 460} 461 462char 463GDBRemoteCommunication::GetAck (uint32_t timeout_seconds) 464{ 465 StringExtractorGDBRemote response; 466 if (WaitForPacket (response, timeout_seconds) == 1) 467 return response.GetChar(); 468 return 0; 469} 470 471bool 472GDBRemoteCommunication::GetSequenceMutex (Mutex::Locker& locker) 473{ 474 return locker.TryLock (m_sequence_mutex.GetMutex()); 475} 476 477bool 478GDBRemoteCommunication::SendAsyncSignal (int signo) 479{ 480 m_async_signal = signo; 481 bool timed_out = false; 482 bool sent_interrupt = false; 483 Mutex::Locker locker; 484 if (SendInterrupt (locker, 1, sent_interrupt, timed_out)) 485 return true; 486 m_async_signal = -1; 487 return false; 488} 489 490// This function takes a mutex locker as a parameter in case the GetSequenceMutex 491// actually succeeds. If it doesn't succeed in acquiring the sequence mutex 492// (the expected result), then it will send the halt packet. If it does succeed 493// then the caller that requested the interrupt will want to keep the sequence 494// locked down so that no one else can send packets while the caller has control. 495// This function usually gets called when we are running and need to stop the 496// target. It can also be used when we are running and and we need to do something 497// else (like read/write memory), so we need to interrupt the running process 498// (gdb remote protocol requires this), and do what we need to do, then resume. 499 500bool 501GDBRemoteCommunication::SendInterrupt 502( 503 Mutex::Locker& locker, 504 uint32_t seconds_to_wait_for_stop, 505 bool &sent_interrupt, 506 bool &timed_out 507) 508{ 509 sent_interrupt = false; 510 timed_out = false; 511 LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PROCESS)); 512 513 if (IsRunning()) 514 { 515 // Only send an interrupt if our debugserver is running... 516 if (GetSequenceMutex (locker) == false) 517 { 518 // Someone has the mutex locked waiting for a response or for the 519 // inferior to stop, so send the interrupt on the down low... 520 char ctrl_c = '\x03'; 521 ConnectionStatus status = eConnectionStatusSuccess; 522 TimeValue timeout; 523 if (seconds_to_wait_for_stop) 524 { 525 timeout = TimeValue::Now(); 526 timeout.OffsetWithSeconds (seconds_to_wait_for_stop); 527 } 528 size_t bytes_written = Write (&ctrl_c, 1, status, NULL); 529 ProcessGDBRemoteLog::LogIf (GDBR_LOG_PACKETS | GDBR_LOG_PROCESS, "send packet: \\x03"); 530 if (bytes_written > 0) 531 { 532 sent_interrupt = true; 533 if (seconds_to_wait_for_stop) 534 { 535 m_private_is_running.WaitForValueEqualTo (false, &timeout, &timed_out); 536 if (log) 537 log->Printf ("GDBRemoteCommunication::%s () - sent interrupt, private state stopped", __FUNCTION__); 538 539 } 540 else 541 { 542 if (log) 543 log->Printf ("GDBRemoteCommunication::%s () - sent interrupt, not waiting for stop...", __FUNCTION__); 544 } 545 return true; 546 } 547 else 548 { 549 if (log) 550 log->Printf ("GDBRemoteCommunication::%s () - failed to write interrupt", __FUNCTION__); 551 } 552 } 553 else 554 { 555 if (log) 556 log->Printf ("GDBRemoteCommunication::%s () - got sequence mutex without having to interrupt", __FUNCTION__); 557 } 558 } 559 return false; 560} 561 562bool 563GDBRemoteCommunication::WaitForNotRunning (const TimeValue *timeout_ptr) 564{ 565 return m_public_is_running.WaitForValueEqualTo (false, timeout_ptr, NULL); 566} 567 568bool 569GDBRemoteCommunication::WaitForNotRunningPrivate (const TimeValue *timeout_ptr) 570{ 571 return m_private_is_running.WaitForValueEqualTo (false, timeout_ptr, NULL); 572} 573 574size_t 575GDBRemoteCommunication::WaitForPacket (StringExtractorGDBRemote &response, uint32_t timeout_seconds) 576{ 577 Mutex::Locker locker(m_sequence_mutex); 578 TimeValue timeout_time; 579 timeout_time = TimeValue::Now(); 580 timeout_time.OffsetWithSeconds (timeout_seconds); 581 return WaitForPacketNoLock (response, &timeout_time); 582} 583 584size_t 585GDBRemoteCommunication::WaitForPacket (StringExtractorGDBRemote &response, const TimeValue* timeout_time_ptr) 586{ 587 Mutex::Locker locker(m_sequence_mutex); 588 return WaitForPacketNoLock (response, timeout_time_ptr); 589} 590 591size_t 592GDBRemoteCommunication::WaitForPacketNoLock (StringExtractorGDBRemote &response, const TimeValue* timeout_time_ptr) 593{ 594 bool checksum_error = false; 595 response.Clear (); 596 597 EventSP event_sp; 598 599 if (m_rx_packet_listener.WaitForEvent (timeout_time_ptr, event_sp)) 600 { 601 const uint32_t event_type = event_sp->GetType(); 602 if (event_type | Communication::eBroadcastBitPacketAvailable) 603 { 604 const EventDataBytes *event_bytes = EventDataBytes::GetEventDataFromEvent(event_sp.get()); 605 if (event_bytes) 606 { 607 const char * packet_data = (const char *)event_bytes->GetBytes(); 608 ProcessGDBRemoteLog::LogIf (GDBR_LOG_PACKETS, "read packet: %s", packet_data); 609 const size_t packet_size = event_bytes->GetByteSize(); 610 if (packet_data && packet_size > 0) 611 { 612 std::string &response_str = response.GetStringRef(); 613 if (packet_data[0] == '$') 614 { 615 bool success = false; 616 if (packet_size < 4) 617 ::fprintf (stderr, "Packet that starts with $ is too short: '%s'\n", packet_data); 618 else if (packet_data[packet_size-3] != '#' || 619 !::isxdigit (packet_data[packet_size-2]) || 620 !::isxdigit (packet_data[packet_size-1])) 621 ::fprintf (stderr, "Invalid checksum footer for packet: '%s'\n", packet_data); 622 else 623 success = true; 624 625 if (success) 626 response_str.assign (packet_data + 1, packet_size - 4); 627 if (m_send_acks) 628 { 629 char packet_checksum = strtol (&packet_data[packet_size-2], NULL, 16); 630 char actual_checksum = CalculcateChecksum (&response_str[0], response_str.size()); 631 checksum_error = packet_checksum != actual_checksum; 632 // Send the ack or nack if needed 633 if (checksum_error || !success) 634 SendNack(); 635 else 636 SendAck(); 637 } 638 } 639 else 640 { 641 response_str.assign (packet_data, packet_size); 642 } 643 return response_str.size(); 644 } 645 } 646 } 647 else if (Communication::eBroadcastBitReadThreadDidExit) 648 { 649 // Our read thread exited on us so just fall through and return zero... 650 } 651 } 652 return 0; 653} 654 655void 656GDBRemoteCommunication::AppendBytesToCache (const uint8_t *src, size_t src_len, bool broadcast, 657 ConnectionStatus status) 658{ 659 // Put the packet data into the buffer in a thread safe fashion 660 Mutex::Locker locker(m_bytes_mutex); 661 m_bytes.append ((const char *)src, src_len); 662 663 // Parse up the packets into gdb remote packets 664 while (!m_bytes.empty()) 665 { 666 // end_idx must be one past the last valid packet byte. Start 667 // it off with an invalid value that is the same as the current 668 // index. 669 size_t end_idx = 0; 670 671 switch (m_bytes[0]) 672 { 673 case '+': // Look for ack 674 case '-': // Look for cancel 675 case '\x03': // ^C to halt target 676 end_idx = 1; // The command is one byte long... 677 break; 678 679 case '$': 680 // Look for a standard gdb packet? 681 end_idx = m_bytes.find('#'); 682 if (end_idx != std::string::npos) 683 { 684 if (end_idx + 2 < m_bytes.size()) 685 { 686 end_idx += 3; 687 } 688 else 689 { 690 // Checksum bytes aren't all here yet 691 end_idx = std::string::npos; 692 } 693 } 694 break; 695 696 default: 697 break; 698 } 699 700 if (end_idx == std::string::npos) 701 { 702 //ProcessGDBRemoteLog::LogIf (GDBR_LOG_PACKETS | GDBR_LOG_VERBOSE, "GDBRemoteCommunication::%s packet not yet complete: '%s'",__FUNCTION__, m_bytes.c_str()); 703 return; 704 } 705 else if (end_idx > 0) 706 { 707 // We have a valid packet... 708 assert (end_idx <= m_bytes.size()); 709 std::auto_ptr<EventDataBytes> event_bytes_ap (new EventDataBytes (&m_bytes[0], end_idx)); 710 ProcessGDBRemoteLog::LogIf (GDBR_LOG_COMM, "got full packet: %s", event_bytes_ap->GetBytes()); 711 BroadcastEvent (eBroadcastBitPacketAvailable, event_bytes_ap.release()); 712 m_bytes.erase(0, end_idx); 713 } 714 else 715 { 716 assert (1 <= m_bytes.size()); 717 ProcessGDBRemoteLog::LogIf (GDBR_LOG_COMM, "GDBRemoteCommunication::%s tossing junk byte at %c",__FUNCTION__, m_bytes[0]); 718 m_bytes.erase(0, 1); 719 } 720 } 721} 722 723lldb::pid_t 724GDBRemoteCommunication::GetCurrentProcessID (uint32_t timeout_seconds) 725{ 726 StringExtractorGDBRemote response; 727 if (SendPacketAndWaitForResponse("qC", strlen("qC"), response, timeout_seconds, false)) 728 { 729 if (response.GetChar() == 'Q') 730 if (response.GetChar() == 'C') 731 return response.GetHexMaxU32 (false, LLDB_INVALID_PROCESS_ID); 732 } 733 return LLDB_INVALID_PROCESS_ID; 734} 735 736bool 737GDBRemoteCommunication::GetLaunchSuccess (uint32_t timeout_seconds, std::string &error_str) 738{ 739 error_str.clear(); 740 StringExtractorGDBRemote response; 741 if (SendPacketAndWaitForResponse("qLaunchSuccess", strlen("qLaunchSuccess"), response, timeout_seconds, false)) 742 { 743 if (response.IsOKPacket()) 744 return true; 745 if (response.GetChar() == 'E') 746 { 747 // A string the describes what failed when launching... 748 error_str = response.GetStringRef().substr(1); 749 } 750 else 751 { 752 error_str.assign ("unknown error occurred launching process"); 753 } 754 } 755 else 756 { 757 error_str.assign ("failed to send the qLaunchSuccess packet"); 758 } 759 return false; 760} 761 762int 763GDBRemoteCommunication::SendArgumentsPacket (char const *argv[], uint32_t timeout_seconds) 764{ 765 if (argv && argv[0]) 766 { 767 StreamString packet; 768 packet.PutChar('A'); 769 const char *arg; 770 for (uint32_t i = 0; (arg = argv[i]) != NULL; ++i) 771 { 772 const int arg_len = strlen(arg); 773 if (i > 0) 774 packet.PutChar(','); 775 packet.Printf("%i,%i,", arg_len * 2, i); 776 packet.PutBytesAsRawHex8(arg, arg_len, eByteOrderHost, eByteOrderHost); 777 } 778 779 StringExtractorGDBRemote response; 780 if (SendPacketAndWaitForResponse (packet.GetData(), packet.GetSize(), response, timeout_seconds, false)) 781 { 782 if (response.IsOKPacket()) 783 return 0; 784 uint8_t error = response.GetError(); 785 if (error) 786 return error; 787 } 788 } 789 return -1; 790} 791 792int 793GDBRemoteCommunication::SendEnvironmentPacket (char const *name_equal_value, uint32_t timeout_seconds) 794{ 795 if (name_equal_value && name_equal_value[0]) 796 { 797 StreamString packet; 798 packet.Printf("QEnvironment:%s", name_equal_value); 799 StringExtractorGDBRemote response; 800 if (SendPacketAndWaitForResponse (packet.GetData(), packet.GetSize(), response, timeout_seconds, false)) 801 { 802 if (response.IsOKPacket()) 803 return 0; 804 uint8_t error = response.GetError(); 805 if (error) 806 return error; 807 } 808 } 809 return -1; 810} 811 812bool 813GDBRemoteCommunication::GetHostInfo (uint32_t timeout_seconds) 814{ 815 m_arch.Clear(); 816 m_os.Clear(); 817 m_vendor.Clear(); 818 m_byte_order = eByteOrderHost; 819 m_pointer_byte_size = 0; 820 821 StringExtractorGDBRemote response; 822 if (SendPacketAndWaitForResponse ("qHostInfo", response, timeout_seconds, false)) 823 { 824 if (response.IsUnsupportedPacket()) 825 return false; 826 827 828 std::string name; 829 std::string value; 830 while (response.GetNameColonValue(name, value)) 831 { 832 if (name.compare("cputype") == 0) 833 { 834 // exception type in big endian hex 835 m_arch.SetCPUType(Args::StringToUInt32 (value.c_str(), LLDB_INVALID_CPUTYPE, 0)); 836 } 837 else if (name.compare("cpusubtype") == 0) 838 { 839 // exception count in big endian hex 840 m_arch.SetCPUSubtype(Args::StringToUInt32 (value.c_str(), 0, 0)); 841 } 842 else if (name.compare("ostype") == 0) 843 { 844 // exception data in big endian hex 845 m_os.SetCString(value.c_str()); 846 } 847 else if (name.compare("vendor") == 0) 848 { 849 m_vendor.SetCString(value.c_str()); 850 } 851 else if (name.compare("endian") == 0) 852 { 853 if (value.compare("little") == 0) 854 m_byte_order = eByteOrderLittle; 855 else if (value.compare("big") == 0) 856 m_byte_order = eByteOrderBig; 857 else if (value.compare("pdp") == 0) 858 m_byte_order = eByteOrderPDP; 859 } 860 else if (name.compare("ptrsize") == 0) 861 { 862 m_pointer_byte_size = Args::StringToUInt32 (value.c_str(), 0, 0); 863 } 864 } 865 } 866 return HostInfoIsValid(); 867} 868 869int 870GDBRemoteCommunication::SendAttach 871( 872 lldb::pid_t pid, 873 uint32_t timeout_seconds, 874 StringExtractorGDBRemote& response 875) 876{ 877 if (pid != LLDB_INVALID_PROCESS_ID) 878 { 879 StreamString packet; 880 packet.Printf("vAttach;%x", pid); 881 882 if (SendPacketAndWaitForResponse (packet.GetData(), packet.GetSize(), response, timeout_seconds, false)) 883 { 884 if (response.IsErrorPacket()) 885 return response.GetError(); 886 return 0; 887 } 888 } 889 return -1; 890} 891 892const lldb_private::ArchSpec & 893GDBRemoteCommunication::GetHostArchitecture () 894{ 895 if (!HostInfoIsValid ()) 896 GetHostInfo (1); 897 return m_arch; 898} 899 900const lldb_private::ConstString & 901GDBRemoteCommunication::GetOSString () 902{ 903 if (!HostInfoIsValid ()) 904 GetHostInfo (1); 905 return m_os; 906} 907 908const lldb_private::ConstString & 909GDBRemoteCommunication::GetVendorString() 910{ 911 if (!HostInfoIsValid ()) 912 GetHostInfo (1); 913 return m_vendor; 914} 915 916lldb::ByteOrder 917GDBRemoteCommunication::GetByteOrder () 918{ 919 if (!HostInfoIsValid ()) 920 GetHostInfo (1); 921 return m_byte_order; 922} 923 924uint32_t 925GDBRemoteCommunication::GetAddressByteSize () 926{ 927 if (!HostInfoIsValid ()) 928 GetHostInfo (1); 929 return m_pointer_byte_size; 930} 931 932addr_t 933GDBRemoteCommunication::AllocateMemory (size_t size, uint32_t permissions, uint32_t timeout_seconds) 934{ 935 char packet[64]; 936 ::snprintf (packet, sizeof(packet), "_M%zx,%s%s%s", size, 937 permissions & lldb::ePermissionsReadable ? "r" : "", 938 permissions & lldb::ePermissionsWritable ? "w" : "", 939 permissions & lldb::ePermissionsExecutable ? "x" : ""); 940 StringExtractorGDBRemote response; 941 if (SendPacketAndWaitForResponse (packet, response, timeout_seconds, false)) 942 { 943 if (!response.IsErrorPacket()) 944 return response.GetHexMaxU64(false, LLDB_INVALID_ADDRESS); 945 } 946 return LLDB_INVALID_ADDRESS; 947} 948 949bool 950GDBRemoteCommunication::DeallocateMemory (addr_t addr, uint32_t timeout_seconds) 951{ 952 char packet[64]; 953 snprintf(packet, sizeof(packet), "_m%llx", (uint64_t)addr); 954 StringExtractorGDBRemote response; 955 if (SendPacketAndWaitForResponse (packet, response, timeout_seconds, false)) 956 { 957 if (response.IsOKPacket()) 958 return true; 959 } 960 return false; 961} 962 963