GDBRemoteCommunicationClient.cpp revision 801417e453f8531ac176cd952200587bf15d9ccf
1//===-- GDBRemoteCommunicationClient.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 "GDBRemoteCommunicationClient.h" 12 13// C Includes 14// C++ Includes 15// Other libraries and framework includes 16#include "llvm/ADT/Triple.h" 17#include "lldb/Interpreter/Args.h" 18#include "lldb/Core/ConnectionFileDescriptor.h" 19#include "lldb/Core/Log.h" 20#include "lldb/Core/State.h" 21#include "lldb/Core/StreamString.h" 22#include "lldb/Host/Endian.h" 23#include "lldb/Host/Host.h" 24#include "lldb/Host/TimeValue.h" 25 26// Project includes 27#include "Utility/StringExtractorGDBRemote.h" 28#include "ProcessGDBRemote.h" 29#include "ProcessGDBRemoteLog.h" 30 31using namespace lldb; 32using namespace lldb_private; 33 34//---------------------------------------------------------------------- 35// GDBRemoteCommunicationClient constructor 36//---------------------------------------------------------------------- 37GDBRemoteCommunicationClient::GDBRemoteCommunicationClient(bool is_platform) : 38 GDBRemoteCommunication("gdb-remote.client", "gdb-remote.client.rx_packet", is_platform), 39 m_supports_not_sending_acks (eLazyBoolCalculate), 40 m_supports_thread_suffix (eLazyBoolCalculate), 41 m_supports_vCont_all (eLazyBoolCalculate), 42 m_supports_vCont_any (eLazyBoolCalculate), 43 m_supports_vCont_c (eLazyBoolCalculate), 44 m_supports_vCont_C (eLazyBoolCalculate), 45 m_supports_vCont_s (eLazyBoolCalculate), 46 m_supports_vCont_S (eLazyBoolCalculate), 47 m_qHostInfo_is_valid (eLazyBoolCalculate), 48 m_supports_alloc_dealloc_memory (eLazyBoolCalculate), 49 m_supports_qProcessInfoPID (true), 50 m_supports_qfProcessInfo (true), 51 m_supports_qUserName (true), 52 m_supports_qGroupName (true), 53 m_supports_qThreadStopInfo (true), 54 m_supports_z0 (true), 55 m_supports_z1 (true), 56 m_supports_z2 (true), 57 m_supports_z3 (true), 58 m_supports_z4 (true), 59 m_curr_tid (LLDB_INVALID_THREAD_ID), 60 m_curr_tid_run (LLDB_INVALID_THREAD_ID), 61 m_async_mutex (Mutex::eMutexTypeRecursive), 62 m_async_packet_predicate (false), 63 m_async_packet (), 64 m_async_response (), 65 m_async_signal (-1), 66 m_host_arch(), 67 m_os_version_major (UINT32_MAX), 68 m_os_version_minor (UINT32_MAX), 69 m_os_version_update (UINT32_MAX) 70{ 71} 72 73//---------------------------------------------------------------------- 74// Destructor 75//---------------------------------------------------------------------- 76GDBRemoteCommunicationClient::~GDBRemoteCommunicationClient() 77{ 78 if (IsConnected()) 79 Disconnect(); 80} 81 82bool 83GDBRemoteCommunicationClient::HandshakeWithServer (Error *error_ptr) 84{ 85 // Start the read thread after we send the handshake ack since if we 86 // fail to send the handshake ack, there is no reason to continue... 87 if (SendAck()) 88 return true; 89 90 if (error_ptr) 91 error_ptr->SetErrorString("failed to send the handshake ack"); 92 return false; 93} 94 95void 96GDBRemoteCommunicationClient::QueryNoAckModeSupported () 97{ 98 if (m_supports_not_sending_acks == eLazyBoolCalculate) 99 { 100 m_send_acks = true; 101 m_supports_not_sending_acks = eLazyBoolNo; 102 103 StringExtractorGDBRemote response; 104 if (SendPacketAndWaitForResponse("QStartNoAckMode", response, false)) 105 { 106 if (response.IsOKResponse()) 107 { 108 m_send_acks = false; 109 m_supports_not_sending_acks = eLazyBoolYes; 110 } 111 } 112 } 113} 114 115void 116GDBRemoteCommunicationClient::ResetDiscoverableSettings() 117{ 118 m_supports_not_sending_acks = eLazyBoolCalculate; 119 m_supports_thread_suffix = eLazyBoolCalculate; 120 m_supports_vCont_c = eLazyBoolCalculate; 121 m_supports_vCont_C = eLazyBoolCalculate; 122 m_supports_vCont_s = eLazyBoolCalculate; 123 m_supports_vCont_S = eLazyBoolCalculate; 124 m_qHostInfo_is_valid = eLazyBoolCalculate; 125 m_supports_alloc_dealloc_memory = eLazyBoolCalculate; 126 127 m_supports_qProcessInfoPID = true; 128 m_supports_qfProcessInfo = true; 129 m_supports_qUserName = true; 130 m_supports_qGroupName = true; 131 m_supports_qThreadStopInfo = true; 132 m_supports_z0 = true; 133 m_supports_z1 = true; 134 m_supports_z2 = true; 135 m_supports_z3 = true; 136 m_supports_z4 = true; 137 m_host_arch.Clear(); 138} 139 140 141bool 142GDBRemoteCommunicationClient::GetThreadSuffixSupported () 143{ 144 if (m_supports_thread_suffix == eLazyBoolCalculate) 145 { 146 StringExtractorGDBRemote response; 147 m_supports_thread_suffix = eLazyBoolNo; 148 if (SendPacketAndWaitForResponse("QThreadSuffixSupported", response, false)) 149 { 150 if (response.IsOKResponse()) 151 m_supports_thread_suffix = eLazyBoolYes; 152 } 153 } 154 return m_supports_thread_suffix; 155} 156bool 157GDBRemoteCommunicationClient::GetVContSupported (char flavor) 158{ 159 if (m_supports_vCont_c == eLazyBoolCalculate) 160 { 161 StringExtractorGDBRemote response; 162 m_supports_vCont_any = eLazyBoolNo; 163 m_supports_vCont_all = eLazyBoolNo; 164 m_supports_vCont_c = eLazyBoolNo; 165 m_supports_vCont_C = eLazyBoolNo; 166 m_supports_vCont_s = eLazyBoolNo; 167 m_supports_vCont_S = eLazyBoolNo; 168 if (SendPacketAndWaitForResponse("vCont?", response, false)) 169 { 170 const char *response_cstr = response.GetStringRef().c_str(); 171 if (::strstr (response_cstr, ";c")) 172 m_supports_vCont_c = eLazyBoolYes; 173 174 if (::strstr (response_cstr, ";C")) 175 m_supports_vCont_C = eLazyBoolYes; 176 177 if (::strstr (response_cstr, ";s")) 178 m_supports_vCont_s = eLazyBoolYes; 179 180 if (::strstr (response_cstr, ";S")) 181 m_supports_vCont_S = eLazyBoolYes; 182 183 if (m_supports_vCont_c == eLazyBoolYes && 184 m_supports_vCont_C == eLazyBoolYes && 185 m_supports_vCont_s == eLazyBoolYes && 186 m_supports_vCont_S == eLazyBoolYes) 187 { 188 m_supports_vCont_all = eLazyBoolYes; 189 } 190 191 if (m_supports_vCont_c == eLazyBoolYes || 192 m_supports_vCont_C == eLazyBoolYes || 193 m_supports_vCont_s == eLazyBoolYes || 194 m_supports_vCont_S == eLazyBoolYes) 195 { 196 m_supports_vCont_any = eLazyBoolYes; 197 } 198 } 199 } 200 201 switch (flavor) 202 { 203 case 'a': return m_supports_vCont_any; 204 case 'A': return m_supports_vCont_all; 205 case 'c': return m_supports_vCont_c; 206 case 'C': return m_supports_vCont_C; 207 case 's': return m_supports_vCont_s; 208 case 'S': return m_supports_vCont_S; 209 default: break; 210 } 211 return false; 212} 213 214 215size_t 216GDBRemoteCommunicationClient::SendPacketAndWaitForResponse 217( 218 const char *payload, 219 StringExtractorGDBRemote &response, 220 bool send_async 221) 222{ 223 return SendPacketAndWaitForResponse (payload, 224 ::strlen (payload), 225 response, 226 send_async); 227} 228 229size_t 230GDBRemoteCommunicationClient::SendPacketAndWaitForResponse 231( 232 const char *payload, 233 size_t payload_length, 234 StringExtractorGDBRemote &response, 235 bool send_async 236) 237{ 238 Mutex::Locker locker; 239 LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PROCESS)); 240 size_t response_len = 0; 241 if (GetSequenceMutex (locker)) 242 { 243 if (SendPacketNoLock (payload, payload_length)) 244 response_len = WaitForPacketWithTimeoutMicroSecondsNoLock (response, GetPacketTimeoutInMicroSeconds ()); 245 else 246 { 247 if (log) 248 log->Printf("error: failed to send '%*s'", payload_length, payload); 249 } 250 } 251 else 252 { 253 if (send_async) 254 { 255 Mutex::Locker async_locker (m_async_mutex); 256 m_async_packet.assign(payload, payload_length); 257 m_async_packet_predicate.SetValue (true, eBroadcastNever); 258 259 if (log) 260 log->Printf ("async: async packet = %s", m_async_packet.c_str()); 261 262 bool timed_out = false; 263 bool sent_interrupt = false; 264 if (SendInterrupt(locker, 2, sent_interrupt, timed_out)) 265 { 266 if (sent_interrupt) 267 { 268 TimeValue timeout_time; 269 timeout_time = TimeValue::Now(); 270 timeout_time.OffsetWithSeconds (m_packet_timeout); 271 272 if (log) 273 log->Printf ("async: sent interrupt"); 274 275 if (m_async_packet_predicate.WaitForValueEqualTo (false, &timeout_time, &timed_out)) 276 { 277 if (log) 278 log->Printf ("async: got response"); 279 280 // Swap the response buffer to avoid malloc and string copy 281 response.GetStringRef().swap (m_async_response.GetStringRef()); 282 response_len = response.GetStringRef().size(); 283 } 284 else 285 { 286 if (log) 287 log->Printf ("async: timed out waiting for response"); 288 } 289 290 // Make sure we wait until the continue packet has been sent again... 291 if (m_private_is_running.WaitForValueEqualTo (true, &timeout_time, &timed_out)) 292 { 293 if (log) 294 log->Printf ("async: timed out waiting for process to resume"); 295 } 296 } 297 else 298 { 299 // We had a racy condition where we went to send the interrupt 300 // yet we were able to get the lock 301 if (log) 302 log->Printf ("async: got lock but failed to send interrupt"); 303 } 304 } 305 else 306 { 307 if (log) 308 log->Printf ("async: failed to interrupt"); 309 } 310 } 311 else 312 { 313 if (log) 314 log->Printf("error: packet mutex taken and send_async == false, not sending packet '%*s'", payload_length, payload); 315 } 316 } 317 if (response_len == 0) 318 { 319 if (log) 320 log->Printf("error: failed to get response for '%*s'", payload_length, payload); 321 } 322 return response_len; 323} 324 325//template<typename _Tp> 326//class ScopedValueChanger 327//{ 328//public: 329// // Take a value reference and the value to assign it to when this class 330// // instance goes out of scope. 331// ScopedValueChanger (_Tp &value_ref, _Tp value) : 332// m_value_ref (value_ref), 333// m_value (value) 334// { 335// } 336// 337// // This object is going out of scope, change the value pointed to by 338// // m_value_ref to the value we got during construction which was stored in 339// // m_value; 340// ~ScopedValueChanger () 341// { 342// m_value_ref = m_value; 343// } 344//protected: 345// _Tp &m_value_ref; // A reference to the value we will change when this object destructs 346// _Tp m_value; // The value to assign to m_value_ref when this goes out of scope. 347//}; 348 349StateType 350GDBRemoteCommunicationClient::SendContinuePacketAndWaitForResponse 351( 352 ProcessGDBRemote *process, 353 const char *payload, 354 size_t packet_length, 355 StringExtractorGDBRemote &response 356) 357{ 358 LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PROCESS)); 359 if (log) 360 log->Printf ("GDBRemoteCommunicationClient::%s ()", __FUNCTION__); 361 362 Mutex::Locker locker(m_sequence_mutex); 363 StateType state = eStateRunning; 364 365 BroadcastEvent(eBroadcastBitRunPacketSent, NULL); 366 m_public_is_running.SetValue (true, eBroadcastNever); 367 // Set the starting continue packet into "continue_packet". This packet 368 // make change if we are interrupted and we continue after an async packet... 369 std::string continue_packet(payload, packet_length); 370 371 bool got_stdout = false; 372 373 while (state == eStateRunning) 374 { 375 if (!got_stdout) 376 { 377 if (log) 378 log->Printf ("GDBRemoteCommunicationClient::%s () sending continue packet: %s", __FUNCTION__, continue_packet.c_str()); 379 if (SendPacket(continue_packet.c_str(), continue_packet.size()) == 0) 380 state = eStateInvalid; 381 382 m_private_is_running.SetValue (true, eBroadcastNever); 383 } 384 385 got_stdout = false; 386 387 if (log) 388 log->Printf ("GDBRemoteCommunicationClient::%s () WaitForPacket(%.*s)", __FUNCTION__); 389 390 if (WaitForPacketWithTimeoutMicroSeconds (response, UINT32_MAX)) 391 { 392 if (response.Empty()) 393 state = eStateInvalid; 394 else 395 { 396 const char stop_type = response.GetChar(); 397 if (log) 398 log->Printf ("GDBRemoteCommunicationClient::%s () got packet: %s", __FUNCTION__, response.GetStringRef().c_str()); 399 switch (stop_type) 400 { 401 case 'T': 402 case 'S': 403 if (process->GetStopID() == 0) 404 { 405 if (process->GetID() == LLDB_INVALID_PROCESS_ID) 406 { 407 lldb::pid_t pid = GetCurrentProcessID (); 408 if (pid != LLDB_INVALID_PROCESS_ID) 409 process->SetID (pid); 410 } 411 process->BuildDynamicRegisterInfo (true); 412 } 413 414 // Privately notify any internal threads that we have stopped 415 // in case we wanted to interrupt our process, yet we might 416 // send a packet and continue without returning control to the 417 // user. 418 m_private_is_running.SetValue (false, eBroadcastAlways); 419 if (m_async_signal != -1) 420 { 421 if (log) 422 log->Printf ("async: send signo = %s", Host::GetSignalAsCString (m_async_signal)); 423 424 // Save off the async signal we are supposed to send 425 const int async_signal = m_async_signal; 426 // Clear the async signal member so we don't end up 427 // sending the signal multiple times... 428 m_async_signal = -1; 429 // Check which signal we stopped with 430 uint8_t signo = response.GetHexU8(255); 431 if (signo == async_signal) 432 { 433 if (log) 434 log->Printf ("async: stopped with signal %s, we are done running", Host::GetSignalAsCString (signo)); 435 436 // We already stopped with a signal that we wanted 437 // to stop with, so we are done 438 response.SetFilePos (0); 439 } 440 else 441 { 442 // We stopped with a different signal that the one 443 // we wanted to stop with, so now we must resume 444 // with the signal we want 445 char signal_packet[32]; 446 int signal_packet_len = 0; 447 signal_packet_len = ::snprintf (signal_packet, 448 sizeof (signal_packet), 449 "C%2.2x", 450 async_signal); 451 452 if (log) 453 log->Printf ("async: stopped with signal %s, resume with %s", 454 Host::GetSignalAsCString (signo), 455 Host::GetSignalAsCString (async_signal)); 456 457 // Set the continue packet to resume... 458 continue_packet.assign(signal_packet, signal_packet_len); 459 continue; 460 } 461 } 462 else if (m_async_packet_predicate.GetValue()) 463 { 464 // We are supposed to send an asynchronous packet while 465 // we are running. 466 m_async_response.Clear(); 467 if (m_async_packet.empty()) 468 { 469 if (log) 470 log->Printf ("async: error: empty async packet"); 471 472 } 473 else 474 { 475 if (log) 476 log->Printf ("async: sending packet: %s", 477 m_async_packet.c_str()); 478 479 SendPacketAndWaitForResponse (&m_async_packet[0], 480 m_async_packet.size(), 481 m_async_response, 482 false); 483 } 484 // Let the other thread that was trying to send the async 485 // packet know that the packet has been sent and response is 486 // ready... 487 m_async_packet_predicate.SetValue(false, eBroadcastAlways); 488 489 // Set the continue packet to resume... 490 continue_packet.assign (1, 'c'); 491 continue; 492 } 493 // Stop with signal and thread info 494 state = eStateStopped; 495 break; 496 497 case 'W': 498 case 'X': 499 // process exited 500 state = eStateExited; 501 break; 502 503 case 'O': 504 // STDOUT 505 { 506 got_stdout = true; 507 std::string inferior_stdout; 508 inferior_stdout.reserve(response.GetBytesLeft () / 2); 509 char ch; 510 while ((ch = response.GetHexU8()) != '\0') 511 inferior_stdout.append(1, ch); 512 process->AppendSTDOUT (inferior_stdout.c_str(), inferior_stdout.size()); 513 } 514 break; 515 516 case 'E': 517 // ERROR 518 state = eStateInvalid; 519 break; 520 521 default: 522 if (log) 523 log->Printf ("GDBRemoteCommunicationClient::%s () unrecognized async packet", __FUNCTION__); 524 state = eStateInvalid; 525 break; 526 } 527 } 528 } 529 else 530 { 531 if (log) 532 log->Printf ("GDBRemoteCommunicationClient::%s () WaitForPacket(...) => false", __FUNCTION__); 533 state = eStateInvalid; 534 } 535 } 536 if (log) 537 log->Printf ("GDBRemoteCommunicationClient::%s () => %s", __FUNCTION__, StateAsCString(state)); 538 response.SetFilePos(0); 539 m_private_is_running.SetValue (false, eBroadcastAlways); 540 m_public_is_running.SetValue (false, eBroadcastAlways); 541 return state; 542} 543 544bool 545GDBRemoteCommunicationClient::SendAsyncSignal (int signo) 546{ 547 m_async_signal = signo; 548 bool timed_out = false; 549 bool sent_interrupt = false; 550 Mutex::Locker locker; 551 if (SendInterrupt (locker, 1, sent_interrupt, timed_out)) 552 return true; 553 m_async_signal = -1; 554 return false; 555} 556 557// This function takes a mutex locker as a parameter in case the GetSequenceMutex 558// actually succeeds. If it doesn't succeed in acquiring the sequence mutex 559// (the expected result), then it will send the halt packet. If it does succeed 560// then the caller that requested the interrupt will want to keep the sequence 561// locked down so that no one else can send packets while the caller has control. 562// This function usually gets called when we are running and need to stop the 563// target. It can also be used when we are running and and we need to do something 564// else (like read/write memory), so we need to interrupt the running process 565// (gdb remote protocol requires this), and do what we need to do, then resume. 566 567bool 568GDBRemoteCommunicationClient::SendInterrupt 569( 570 Mutex::Locker& locker, 571 uint32_t seconds_to_wait_for_stop, 572 bool &sent_interrupt, 573 bool &timed_out 574) 575{ 576 sent_interrupt = false; 577 timed_out = false; 578 LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PROCESS)); 579 580 if (IsRunning()) 581 { 582 // Only send an interrupt if our debugserver is running... 583 if (GetSequenceMutex (locker) == false) 584 { 585 // Someone has the mutex locked waiting for a response or for the 586 // inferior to stop, so send the interrupt on the down low... 587 char ctrl_c = '\x03'; 588 ConnectionStatus status = eConnectionStatusSuccess; 589 TimeValue timeout; 590 if (seconds_to_wait_for_stop) 591 { 592 timeout = TimeValue::Now(); 593 timeout.OffsetWithSeconds (seconds_to_wait_for_stop); 594 } 595 size_t bytes_written = Write (&ctrl_c, 1, status, NULL); 596 ProcessGDBRemoteLog::LogIf (GDBR_LOG_PACKETS | GDBR_LOG_PROCESS, "send packet: \\x03"); 597 if (bytes_written > 0) 598 { 599 sent_interrupt = true; 600 if (seconds_to_wait_for_stop) 601 { 602 if (m_private_is_running.WaitForValueEqualTo (false, &timeout, &timed_out)) 603 { 604 if (log) 605 log->Printf ("GDBRemoteCommunicationClient::%s () - sent interrupt, private state stopped", __FUNCTION__); 606 return true; 607 } 608 else 609 { 610 if (log) 611 log->Printf ("GDBRemoteCommunicationClient::%s () - sent interrupt, timed out wating for async thread resume", __FUNCTION__); 612 } 613 } 614 else 615 { 616 if (log) 617 log->Printf ("GDBRemoteCommunicationClient::%s () - sent interrupt, not waiting for stop...", __FUNCTION__); 618 return true; 619 } 620 } 621 else 622 { 623 if (log) 624 log->Printf ("GDBRemoteCommunicationClient::%s () - failed to write interrupt", __FUNCTION__); 625 } 626 return false; 627 } 628 else 629 { 630 if (log) 631 log->Printf ("GDBRemoteCommunicationClient::%s () - got sequence mutex without having to interrupt", __FUNCTION__); 632 } 633 } 634 return true; 635} 636 637lldb::pid_t 638GDBRemoteCommunicationClient::GetCurrentProcessID () 639{ 640 StringExtractorGDBRemote response; 641 if (SendPacketAndWaitForResponse("qC", strlen("qC"), response, false)) 642 { 643 if (response.GetChar() == 'Q') 644 if (response.GetChar() == 'C') 645 return response.GetHexMaxU32 (false, LLDB_INVALID_PROCESS_ID); 646 } 647 return LLDB_INVALID_PROCESS_ID; 648} 649 650bool 651GDBRemoteCommunicationClient::GetLaunchSuccess (std::string &error_str) 652{ 653 error_str.clear(); 654 StringExtractorGDBRemote response; 655 if (SendPacketAndWaitForResponse("qLaunchSuccess", strlen("qLaunchSuccess"), response, false)) 656 { 657 if (response.IsOKResponse()) 658 return true; 659 if (response.GetChar() == 'E') 660 { 661 // A string the describes what failed when launching... 662 error_str = response.GetStringRef().substr(1); 663 } 664 else 665 { 666 error_str.assign ("unknown error occurred launching process"); 667 } 668 } 669 else 670 { 671 error_str.assign ("failed to send the qLaunchSuccess packet"); 672 } 673 return false; 674} 675 676int 677GDBRemoteCommunicationClient::SendArgumentsPacket (char const *argv[]) 678{ 679 if (argv && argv[0]) 680 { 681 StreamString packet; 682 packet.PutChar('A'); 683 const char *arg; 684 for (uint32_t i = 0; (arg = argv[i]) != NULL; ++i) 685 { 686 const int arg_len = strlen(arg); 687 if (i > 0) 688 packet.PutChar(','); 689 packet.Printf("%i,%i,", arg_len * 2, i); 690 packet.PutBytesAsRawHex8 (arg, arg_len); 691 } 692 693 StringExtractorGDBRemote response; 694 if (SendPacketAndWaitForResponse (packet.GetData(), packet.GetSize(), response, false)) 695 { 696 if (response.IsOKResponse()) 697 return 0; 698 uint8_t error = response.GetError(); 699 if (error) 700 return error; 701 } 702 } 703 return -1; 704} 705 706int 707GDBRemoteCommunicationClient::SendEnvironmentPacket (char const *name_equal_value) 708{ 709 if (name_equal_value && name_equal_value[0]) 710 { 711 StreamString packet; 712 packet.Printf("QEnvironment:%s", name_equal_value); 713 StringExtractorGDBRemote response; 714 if (SendPacketAndWaitForResponse (packet.GetData(), packet.GetSize(), response, false)) 715 { 716 if (response.IsOKResponse()) 717 return 0; 718 uint8_t error = response.GetError(); 719 if (error) 720 return error; 721 } 722 } 723 return -1; 724} 725 726int 727GDBRemoteCommunicationClient::SendLaunchArchPacket (char const *arch) 728{ 729 if (arch && arch[0]) 730 { 731 StreamString packet; 732 packet.Printf("QLaunchArch:%s", arch); 733 StringExtractorGDBRemote response; 734 if (SendPacketAndWaitForResponse (packet.GetData(), packet.GetSize(), response, false)) 735 { 736 if (response.IsOKResponse()) 737 return 0; 738 uint8_t error = response.GetError(); 739 if (error) 740 return error; 741 } 742 } 743 return -1; 744} 745 746bool 747GDBRemoteCommunicationClient::GetOSVersion (uint32_t &major, 748 uint32_t &minor, 749 uint32_t &update) 750{ 751 if (GetHostInfo ()) 752 { 753 if (m_os_version_major != UINT32_MAX) 754 { 755 major = m_os_version_major; 756 minor = m_os_version_minor; 757 update = m_os_version_update; 758 return true; 759 } 760 } 761 return false; 762} 763 764bool 765GDBRemoteCommunicationClient::GetOSBuildString (std::string &s) 766{ 767 if (GetHostInfo ()) 768 { 769 if (!m_os_build.empty()) 770 { 771 s = m_os_build; 772 return true; 773 } 774 } 775 s.clear(); 776 return false; 777} 778 779 780bool 781GDBRemoteCommunicationClient::GetOSKernelDescription (std::string &s) 782{ 783 if (GetHostInfo ()) 784 { 785 if (!m_os_kernel.empty()) 786 { 787 s = m_os_kernel; 788 return true; 789 } 790 } 791 s.clear(); 792 return false; 793} 794 795bool 796GDBRemoteCommunicationClient::GetHostname (std::string &s) 797{ 798 if (GetHostInfo ()) 799 { 800 if (!m_hostname.empty()) 801 { 802 s = m_hostname; 803 return true; 804 } 805 } 806 s.clear(); 807 return false; 808} 809 810ArchSpec 811GDBRemoteCommunicationClient::GetSystemArchitecture () 812{ 813 if (GetHostInfo ()) 814 return m_host_arch; 815 return ArchSpec(); 816} 817 818 819bool 820GDBRemoteCommunicationClient::GetHostInfo (bool force) 821{ 822 if (force || m_qHostInfo_is_valid == eLazyBoolCalculate) 823 { 824 m_qHostInfo_is_valid = eLazyBoolNo; 825 StringExtractorGDBRemote response; 826 if (SendPacketAndWaitForResponse ("qHostInfo", response, false)) 827 { 828 if (response.IsNormalResponse()) 829 { 830 std::string name; 831 std::string value; 832 uint32_t cpu = LLDB_INVALID_CPUTYPE; 833 uint32_t sub = 0; 834 std::string arch_name; 835 std::string os_name; 836 std::string vendor_name; 837 std::string triple; 838 uint32_t pointer_byte_size = 0; 839 StringExtractor extractor; 840 ByteOrder byte_order = eByteOrderInvalid; 841 uint32_t num_keys_decoded = 0; 842 while (response.GetNameColonValue(name, value)) 843 { 844 if (name.compare("cputype") == 0) 845 { 846 // exception type in big endian hex 847 cpu = Args::StringToUInt32 (value.c_str(), LLDB_INVALID_CPUTYPE, 0); 848 if (cpu != LLDB_INVALID_CPUTYPE) 849 ++num_keys_decoded; 850 } 851 else if (name.compare("cpusubtype") == 0) 852 { 853 // exception count in big endian hex 854 sub = Args::StringToUInt32 (value.c_str(), 0, 0); 855 if (sub != 0) 856 ++num_keys_decoded; 857 } 858 else if (name.compare("arch") == 0) 859 { 860 arch_name.swap (value); 861 ++num_keys_decoded; 862 } 863 else if (name.compare("triple") == 0) 864 { 865 // The triple comes as ASCII hex bytes since it contains '-' chars 866 extractor.GetStringRef().swap(value); 867 extractor.SetFilePos(0); 868 extractor.GetHexByteString (triple); 869 ++num_keys_decoded; 870 } 871 else if (name.compare("os_build") == 0) 872 { 873 extractor.GetStringRef().swap(value); 874 extractor.SetFilePos(0); 875 extractor.GetHexByteString (m_os_build); 876 ++num_keys_decoded; 877 } 878 else if (name.compare("hostname") == 0) 879 { 880 extractor.GetStringRef().swap(value); 881 extractor.SetFilePos(0); 882 extractor.GetHexByteString (m_hostname); 883 ++num_keys_decoded; 884 } 885 else if (name.compare("os_kernel") == 0) 886 { 887 extractor.GetStringRef().swap(value); 888 extractor.SetFilePos(0); 889 extractor.GetHexByteString (m_os_kernel); 890 ++num_keys_decoded; 891 } 892 else if (name.compare("ostype") == 0) 893 { 894 os_name.swap (value); 895 ++num_keys_decoded; 896 } 897 else if (name.compare("vendor") == 0) 898 { 899 vendor_name.swap(value); 900 ++num_keys_decoded; 901 } 902 else if (name.compare("endian") == 0) 903 { 904 ++num_keys_decoded; 905 if (value.compare("little") == 0) 906 byte_order = eByteOrderLittle; 907 else if (value.compare("big") == 0) 908 byte_order = eByteOrderBig; 909 else if (value.compare("pdp") == 0) 910 byte_order = eByteOrderPDP; 911 else 912 --num_keys_decoded; 913 } 914 else if (name.compare("ptrsize") == 0) 915 { 916 pointer_byte_size = Args::StringToUInt32 (value.c_str(), 0, 0); 917 if (pointer_byte_size != 0) 918 ++num_keys_decoded; 919 } 920 else if (name.compare("os_version") == 0) 921 { 922 Args::StringToVersion (value.c_str(), 923 m_os_version_major, 924 m_os_version_minor, 925 m_os_version_update); 926 if (m_os_version_major != UINT32_MAX) 927 ++num_keys_decoded; 928 } 929 } 930 931 if (num_keys_decoded > 0) 932 m_qHostInfo_is_valid = eLazyBoolYes; 933 934 if (triple.empty()) 935 { 936 if (arch_name.empty()) 937 { 938 if (cpu != LLDB_INVALID_CPUTYPE) 939 { 940 m_host_arch.SetArchitecture (eArchTypeMachO, cpu, sub); 941 if (pointer_byte_size) 942 { 943 assert (pointer_byte_size == m_host_arch.GetAddressByteSize()); 944 } 945 if (byte_order != eByteOrderInvalid) 946 { 947 assert (byte_order == m_host_arch.GetByteOrder()); 948 } 949 if (!vendor_name.empty()) 950 m_host_arch.GetTriple().setVendorName (llvm::StringRef (vendor_name)); 951 if (!os_name.empty()) 952 m_host_arch.GetTriple().setVendorName (llvm::StringRef (os_name)); 953 954 } 955 } 956 else 957 { 958 std::string triple; 959 triple += arch_name; 960 triple += '-'; 961 if (vendor_name.empty()) 962 triple += "unknown"; 963 else 964 triple += vendor_name; 965 triple += '-'; 966 if (os_name.empty()) 967 triple += "unknown"; 968 else 969 triple += os_name; 970 m_host_arch.SetTriple (triple.c_str(), NULL); 971 if (pointer_byte_size) 972 { 973 assert (pointer_byte_size == m_host_arch.GetAddressByteSize()); 974 } 975 if (byte_order != eByteOrderInvalid) 976 { 977 assert (byte_order == m_host_arch.GetByteOrder()); 978 } 979 980 } 981 } 982 else 983 { 984 m_host_arch.SetTriple (triple.c_str(), NULL); 985 if (pointer_byte_size) 986 { 987 assert (pointer_byte_size == m_host_arch.GetAddressByteSize()); 988 } 989 if (byte_order != eByteOrderInvalid) 990 { 991 assert (byte_order == m_host_arch.GetByteOrder()); 992 } 993 } 994 } 995 } 996 } 997 return m_qHostInfo_is_valid == eLazyBoolYes; 998} 999 1000int 1001GDBRemoteCommunicationClient::SendAttach 1002( 1003 lldb::pid_t pid, 1004 StringExtractorGDBRemote& response 1005) 1006{ 1007 if (pid != LLDB_INVALID_PROCESS_ID) 1008 { 1009 char packet[64]; 1010 const int packet_len = ::snprintf (packet, sizeof(packet), "vAttach;%x", pid); 1011 assert (packet_len < sizeof(packet)); 1012 if (SendPacketAndWaitForResponse (packet, packet_len, response, false)) 1013 { 1014 if (response.IsErrorResponse()) 1015 return response.GetError(); 1016 return 0; 1017 } 1018 } 1019 return -1; 1020} 1021 1022const lldb_private::ArchSpec & 1023GDBRemoteCommunicationClient::GetHostArchitecture () 1024{ 1025 if (m_qHostInfo_is_valid == eLazyBoolCalculate) 1026 GetHostInfo (); 1027 return m_host_arch; 1028} 1029 1030addr_t 1031GDBRemoteCommunicationClient::AllocateMemory (size_t size, uint32_t permissions) 1032{ 1033 if (m_supports_alloc_dealloc_memory != eLazyBoolNo) 1034 { 1035 m_supports_alloc_dealloc_memory = eLazyBoolYes; 1036 char packet[64]; 1037 const int packet_len = ::snprintf (packet, sizeof(packet), "_M%zx,%s%s%s", size, 1038 permissions & lldb::ePermissionsReadable ? "r" : "", 1039 permissions & lldb::ePermissionsWritable ? "w" : "", 1040 permissions & lldb::ePermissionsExecutable ? "x" : ""); 1041 assert (packet_len < sizeof(packet)); 1042 StringExtractorGDBRemote response; 1043 if (SendPacketAndWaitForResponse (packet, packet_len, response, false)) 1044 { 1045 if (!response.IsErrorResponse()) 1046 return response.GetHexMaxU64(false, LLDB_INVALID_ADDRESS); 1047 } 1048 else 1049 { 1050 m_supports_alloc_dealloc_memory = eLazyBoolNo; 1051 } 1052 } 1053 return LLDB_INVALID_ADDRESS; 1054} 1055 1056bool 1057GDBRemoteCommunicationClient::DeallocateMemory (addr_t addr) 1058{ 1059 if (m_supports_alloc_dealloc_memory != eLazyBoolNo) 1060 { 1061 m_supports_alloc_dealloc_memory = eLazyBoolYes; 1062 char packet[64]; 1063 const int packet_len = ::snprintf(packet, sizeof(packet), "_m%llx", (uint64_t)addr); 1064 assert (packet_len < sizeof(packet)); 1065 StringExtractorGDBRemote response; 1066 if (SendPacketAndWaitForResponse (packet, packet_len, response, false)) 1067 { 1068 if (response.IsOKResponse()) 1069 return true; 1070 } 1071 else 1072 { 1073 m_supports_alloc_dealloc_memory = eLazyBoolNo; 1074 } 1075 } 1076 return false; 1077} 1078 1079int 1080GDBRemoteCommunicationClient::SetSTDIN (char const *path) 1081{ 1082 if (path && path[0]) 1083 { 1084 StreamString packet; 1085 packet.PutCString("QSetSTDIN:"); 1086 packet.PutBytesAsRawHex8(path, strlen(path)); 1087 1088 StringExtractorGDBRemote response; 1089 if (SendPacketAndWaitForResponse (packet.GetData(), packet.GetSize(), response, false)) 1090 { 1091 if (response.IsOKResponse()) 1092 return 0; 1093 uint8_t error = response.GetError(); 1094 if (error) 1095 return error; 1096 } 1097 } 1098 return -1; 1099} 1100 1101int 1102GDBRemoteCommunicationClient::SetSTDOUT (char const *path) 1103{ 1104 if (path && path[0]) 1105 { 1106 StreamString packet; 1107 packet.PutCString("QSetSTDOUT:"); 1108 packet.PutBytesAsRawHex8(path, strlen(path)); 1109 1110 StringExtractorGDBRemote response; 1111 if (SendPacketAndWaitForResponse (packet.GetData(), packet.GetSize(), response, false)) 1112 { 1113 if (response.IsOKResponse()) 1114 return 0; 1115 uint8_t error = response.GetError(); 1116 if (error) 1117 return error; 1118 } 1119 } 1120 return -1; 1121} 1122 1123int 1124GDBRemoteCommunicationClient::SetSTDERR (char const *path) 1125{ 1126 if (path && path[0]) 1127 { 1128 StreamString packet; 1129 packet.PutCString("QSetSTDERR:"); 1130 packet.PutBytesAsRawHex8(path, strlen(path)); 1131 1132 StringExtractorGDBRemote response; 1133 if (SendPacketAndWaitForResponse (packet.GetData(), packet.GetSize(), response, false)) 1134 { 1135 if (response.IsOKResponse()) 1136 return 0; 1137 uint8_t error = response.GetError(); 1138 if (error) 1139 return error; 1140 } 1141 } 1142 return -1; 1143} 1144 1145int 1146GDBRemoteCommunicationClient::SetWorkingDir (char const *path) 1147{ 1148 if (path && path[0]) 1149 { 1150 StreamString packet; 1151 packet.PutCString("QSetWorkingDir:"); 1152 packet.PutBytesAsRawHex8(path, strlen(path)); 1153 1154 StringExtractorGDBRemote response; 1155 if (SendPacketAndWaitForResponse (packet.GetData(), packet.GetSize(), response, false)) 1156 { 1157 if (response.IsOKResponse()) 1158 return 0; 1159 uint8_t error = response.GetError(); 1160 if (error) 1161 return error; 1162 } 1163 } 1164 return -1; 1165} 1166 1167int 1168GDBRemoteCommunicationClient::SetDisableASLR (bool enable) 1169{ 1170 char packet[32]; 1171 const int packet_len = ::snprintf (packet, sizeof (packet), "QSetDisableASLR:%i", enable ? 1 : 0); 1172 assert (packet_len < sizeof(packet)); 1173 StringExtractorGDBRemote response; 1174 if (SendPacketAndWaitForResponse (packet, packet_len, response, false)) 1175 { 1176 if (response.IsOKResponse()) 1177 return 0; 1178 uint8_t error = response.GetError(); 1179 if (error) 1180 return error; 1181 } 1182 return -1; 1183} 1184 1185bool 1186GDBRemoteCommunicationClient::DecodeProcessInfoResponse (StringExtractorGDBRemote &response, ProcessInstanceInfo &process_info) 1187{ 1188 if (response.IsNormalResponse()) 1189 { 1190 std::string name; 1191 std::string value; 1192 StringExtractor extractor; 1193 1194 while (response.GetNameColonValue(name, value)) 1195 { 1196 if (name.compare("pid") == 0) 1197 { 1198 process_info.SetProcessID (Args::StringToUInt32 (value.c_str(), LLDB_INVALID_PROCESS_ID, 0)); 1199 } 1200 else if (name.compare("ppid") == 0) 1201 { 1202 process_info.SetParentProcessID (Args::StringToUInt32 (value.c_str(), LLDB_INVALID_PROCESS_ID, 0)); 1203 } 1204 else if (name.compare("uid") == 0) 1205 { 1206 process_info.SetUserID (Args::StringToUInt32 (value.c_str(), UINT32_MAX, 0)); 1207 } 1208 else if (name.compare("euid") == 0) 1209 { 1210 process_info.SetEffectiveUserID (Args::StringToUInt32 (value.c_str(), UINT32_MAX, 0)); 1211 } 1212 else if (name.compare("gid") == 0) 1213 { 1214 process_info.SetGroupID (Args::StringToUInt32 (value.c_str(), UINT32_MAX, 0)); 1215 } 1216 else if (name.compare("egid") == 0) 1217 { 1218 process_info.SetEffectiveGroupID (Args::StringToUInt32 (value.c_str(), UINT32_MAX, 0)); 1219 } 1220 else if (name.compare("triple") == 0) 1221 { 1222 // The triple comes as ASCII hex bytes since it contains '-' chars 1223 extractor.GetStringRef().swap(value); 1224 extractor.SetFilePos(0); 1225 extractor.GetHexByteString (value); 1226 process_info.GetArchitecture ().SetTriple (value.c_str(), NULL); 1227 } 1228 else if (name.compare("name") == 0) 1229 { 1230 StringExtractor extractor; 1231 // The the process name from ASCII hex bytes since we can't 1232 // control the characters in a process name 1233 extractor.GetStringRef().swap(value); 1234 extractor.SetFilePos(0); 1235 extractor.GetHexByteString (value); 1236 process_info.SetName (value.c_str()); 1237 } 1238 } 1239 1240 if (process_info.GetProcessID() != LLDB_INVALID_PROCESS_ID) 1241 return true; 1242 } 1243 return false; 1244} 1245 1246bool 1247GDBRemoteCommunicationClient::GetProcessInfo (lldb::pid_t pid, ProcessInstanceInfo &process_info) 1248{ 1249 process_info.Clear(); 1250 1251 if (m_supports_qProcessInfoPID) 1252 { 1253 char packet[32]; 1254 const int packet_len = ::snprintf (packet, sizeof (packet), "qProcessInfoPID:%i", pid); 1255 assert (packet_len < sizeof(packet)); 1256 StringExtractorGDBRemote response; 1257 if (SendPacketAndWaitForResponse (packet, packet_len, response, false)) 1258 { 1259 return DecodeProcessInfoResponse (response, process_info); 1260 } 1261 else 1262 { 1263 m_supports_qProcessInfoPID = false; 1264 return false; 1265 } 1266 } 1267 return false; 1268} 1269 1270uint32_t 1271GDBRemoteCommunicationClient::FindProcesses (const ProcessInstanceInfoMatch &match_info, 1272 ProcessInstanceInfoList &process_infos) 1273{ 1274 process_infos.Clear(); 1275 1276 if (m_supports_qfProcessInfo) 1277 { 1278 StreamString packet; 1279 packet.PutCString ("qfProcessInfo"); 1280 if (!match_info.MatchAllProcesses()) 1281 { 1282 packet.PutChar (':'); 1283 const char *name = match_info.GetProcessInfo().GetName(); 1284 bool has_name_match = false; 1285 if (name && name[0]) 1286 { 1287 has_name_match = true; 1288 NameMatchType name_match_type = match_info.GetNameMatchType(); 1289 switch (name_match_type) 1290 { 1291 case eNameMatchIgnore: 1292 has_name_match = false; 1293 break; 1294 1295 case eNameMatchEquals: 1296 packet.PutCString ("name_match:equals;"); 1297 break; 1298 1299 case eNameMatchContains: 1300 packet.PutCString ("name_match:contains;"); 1301 break; 1302 1303 case eNameMatchStartsWith: 1304 packet.PutCString ("name_match:starts_with;"); 1305 break; 1306 1307 case eNameMatchEndsWith: 1308 packet.PutCString ("name_match:ends_with;"); 1309 break; 1310 1311 case eNameMatchRegularExpression: 1312 packet.PutCString ("name_match:regex;"); 1313 break; 1314 } 1315 if (has_name_match) 1316 { 1317 packet.PutCString ("name:"); 1318 packet.PutBytesAsRawHex8(name, ::strlen(name)); 1319 packet.PutChar (';'); 1320 } 1321 } 1322 1323 if (match_info.GetProcessInfo().ProcessIDIsValid()) 1324 packet.Printf("pid:%u;",match_info.GetProcessInfo().GetProcessID()); 1325 if (match_info.GetProcessInfo().ParentProcessIDIsValid()) 1326 packet.Printf("parent_pid:%u;",match_info.GetProcessInfo().GetParentProcessID()); 1327 if (match_info.GetProcessInfo().UserIDIsValid()) 1328 packet.Printf("uid:%u;",match_info.GetProcessInfo().GetUserID()); 1329 if (match_info.GetProcessInfo().GroupIDIsValid()) 1330 packet.Printf("gid:%u;",match_info.GetProcessInfo().GetGroupID()); 1331 if (match_info.GetProcessInfo().EffectiveUserIDIsValid()) 1332 packet.Printf("euid:%u;",match_info.GetProcessInfo().GetEffectiveUserID()); 1333 if (match_info.GetProcessInfo().EffectiveGroupIDIsValid()) 1334 packet.Printf("egid:%u;",match_info.GetProcessInfo().GetEffectiveGroupID()); 1335 if (match_info.GetProcessInfo().EffectiveGroupIDIsValid()) 1336 packet.Printf("all_users:%u;",match_info.GetMatchAllUsers() ? 1 : 0); 1337 if (match_info.GetProcessInfo().GetArchitecture().IsValid()) 1338 { 1339 const ArchSpec &match_arch = match_info.GetProcessInfo().GetArchitecture(); 1340 const llvm::Triple &triple = match_arch.GetTriple(); 1341 packet.PutCString("triple:"); 1342 packet.PutCStringAsRawHex8(triple.getTriple().c_str()); 1343 packet.PutChar (';'); 1344 } 1345 } 1346 StringExtractorGDBRemote response; 1347 if (SendPacketAndWaitForResponse (packet.GetData(), packet.GetSize(), response, false)) 1348 { 1349 do 1350 { 1351 ProcessInstanceInfo process_info; 1352 if (!DecodeProcessInfoResponse (response, process_info)) 1353 break; 1354 process_infos.Append(process_info); 1355 response.GetStringRef().clear(); 1356 response.SetFilePos(0); 1357 } while (SendPacketAndWaitForResponse ("qsProcessInfo", strlen ("qsProcessInfo"), response, false)); 1358 } 1359 else 1360 { 1361 m_supports_qfProcessInfo = false; 1362 return 0; 1363 } 1364 } 1365 return process_infos.GetSize(); 1366 1367} 1368 1369bool 1370GDBRemoteCommunicationClient::GetUserName (uint32_t uid, std::string &name) 1371{ 1372 if (m_supports_qUserName) 1373 { 1374 char packet[32]; 1375 const int packet_len = ::snprintf (packet, sizeof (packet), "qUserName:%i", uid); 1376 assert (packet_len < sizeof(packet)); 1377 StringExtractorGDBRemote response; 1378 if (SendPacketAndWaitForResponse (packet, packet_len, response, false)) 1379 { 1380 if (response.IsNormalResponse()) 1381 { 1382 // Make sure we parsed the right number of characters. The response is 1383 // the hex encoded user name and should make up the entire packet. 1384 // If there are any non-hex ASCII bytes, the length won't match below.. 1385 if (response.GetHexByteString (name) * 2 == response.GetStringRef().size()) 1386 return true; 1387 } 1388 } 1389 else 1390 { 1391 m_supports_qUserName = false; 1392 return false; 1393 } 1394 } 1395 return false; 1396 1397} 1398 1399bool 1400GDBRemoteCommunicationClient::GetGroupName (uint32_t gid, std::string &name) 1401{ 1402 if (m_supports_qGroupName) 1403 { 1404 char packet[32]; 1405 const int packet_len = ::snprintf (packet, sizeof (packet), "qGroupName:%i", gid); 1406 assert (packet_len < sizeof(packet)); 1407 StringExtractorGDBRemote response; 1408 if (SendPacketAndWaitForResponse (packet, packet_len, response, false)) 1409 { 1410 if (response.IsNormalResponse()) 1411 { 1412 // Make sure we parsed the right number of characters. The response is 1413 // the hex encoded group name and should make up the entire packet. 1414 // If there are any non-hex ASCII bytes, the length won't match below.. 1415 if (response.GetHexByteString (name) * 2 == response.GetStringRef().size()) 1416 return true; 1417 } 1418 } 1419 else 1420 { 1421 m_supports_qGroupName = false; 1422 return false; 1423 } 1424 } 1425 return false; 1426} 1427 1428void 1429GDBRemoteCommunicationClient::TestPacketSpeed (const uint32_t num_packets) 1430{ 1431 uint32_t i; 1432 TimeValue start_time, end_time; 1433 uint64_t total_time_nsec; 1434 float packets_per_second; 1435 if (SendSpeedTestPacket (0, 0)) 1436 { 1437 for (uint32_t send_size = 0; send_size <= 1024; send_size *= 2) 1438 { 1439 for (uint32_t recv_size = 0; recv_size <= 1024; recv_size *= 2) 1440 { 1441 start_time = TimeValue::Now(); 1442 for (i=0; i<num_packets; ++i) 1443 { 1444 SendSpeedTestPacket (send_size, recv_size); 1445 } 1446 end_time = TimeValue::Now(); 1447 total_time_nsec = end_time.GetAsNanoSecondsSinceJan1_1970() - start_time.GetAsNanoSecondsSinceJan1_1970(); 1448 packets_per_second = (((float)num_packets)/(float)total_time_nsec) * (float)TimeValue::NanoSecPerSec; 1449 printf ("%u qSpeedTest(send=%-5u, recv=%-5u) in %llu.%09.9llu sec for %f packets/sec.\n", 1450 num_packets, 1451 send_size, 1452 recv_size, 1453 total_time_nsec / TimeValue::NanoSecPerSec, 1454 total_time_nsec % TimeValue::NanoSecPerSec, 1455 packets_per_second); 1456 if (recv_size == 0) 1457 recv_size = 32; 1458 } 1459 if (send_size == 0) 1460 send_size = 32; 1461 } 1462 } 1463 else 1464 { 1465 start_time = TimeValue::Now(); 1466 for (i=0; i<num_packets; ++i) 1467 { 1468 GetCurrentProcessID (); 1469 } 1470 end_time = TimeValue::Now(); 1471 total_time_nsec = end_time.GetAsNanoSecondsSinceJan1_1970() - start_time.GetAsNanoSecondsSinceJan1_1970(); 1472 packets_per_second = (((float)num_packets)/(float)total_time_nsec) * (float)TimeValue::NanoSecPerSec; 1473 printf ("%u 'qC' packets packets in 0x%llu%09.9llu sec for %f packets/sec.\n", 1474 num_packets, 1475 total_time_nsec / TimeValue::NanoSecPerSec, 1476 total_time_nsec % TimeValue::NanoSecPerSec, 1477 packets_per_second); 1478 } 1479} 1480 1481bool 1482GDBRemoteCommunicationClient::SendSpeedTestPacket (uint32_t send_size, uint32_t recv_size) 1483{ 1484 StreamString packet; 1485 packet.Printf ("qSpeedTest:response_size:%i;data:", recv_size); 1486 uint32_t bytes_left = send_size; 1487 while (bytes_left > 0) 1488 { 1489 if (bytes_left >= 26) 1490 { 1491 packet.PutCString("abcdefghijklmnopqrstuvwxyz"); 1492 bytes_left -= 26; 1493 } 1494 else 1495 { 1496 packet.Printf ("%*.*s;", bytes_left, bytes_left, "abcdefghijklmnopqrstuvwxyz"); 1497 bytes_left = 0; 1498 } 1499 } 1500 1501 StringExtractorGDBRemote response; 1502 return SendPacketAndWaitForResponse (packet.GetData(), packet.GetSize(), response, false) > 0; 1503 return false; 1504} 1505 1506uint16_t 1507GDBRemoteCommunicationClient::LaunchGDBserverAndGetPort () 1508{ 1509 StringExtractorGDBRemote response; 1510 if (SendPacketAndWaitForResponse("qLaunchGDBServer", strlen("qLaunchGDBServer"), response, false)) 1511 { 1512 std::string name; 1513 std::string value; 1514 uint16_t port = 0; 1515 lldb::pid_t pid = LLDB_INVALID_PROCESS_ID; 1516 while (response.GetNameColonValue(name, value)) 1517 { 1518 if (name.size() == 4 && name.compare("port") == 0) 1519 port = Args::StringToUInt32(value.c_str(), 0, 0); 1520 if (name.size() == 3 && name.compare("pid") == 0) 1521 pid = Args::StringToUInt32(value.c_str(), LLDB_INVALID_PROCESS_ID, 0); 1522 } 1523 return port; 1524 } 1525 return 0; 1526} 1527 1528bool 1529GDBRemoteCommunicationClient::SetCurrentThread (int tid) 1530{ 1531 if (m_curr_tid == tid) 1532 return true; 1533 1534 char packet[32]; 1535 int packet_len; 1536 if (tid <= 0) 1537 packet_len = ::snprintf (packet, sizeof(packet), "Hg%i", tid); 1538 else 1539 packet_len = ::snprintf (packet, sizeof(packet), "Hg%x", tid); 1540 assert (packet_len + 1 < sizeof(packet)); 1541 StringExtractorGDBRemote response; 1542 if (SendPacketAndWaitForResponse(packet, packet_len, response, false)) 1543 { 1544 if (response.IsOKResponse()) 1545 { 1546 m_curr_tid = tid; 1547 return true; 1548 } 1549 } 1550 return false; 1551} 1552 1553bool 1554GDBRemoteCommunicationClient::SetCurrentThreadForRun (int tid) 1555{ 1556 if (m_curr_tid_run == tid) 1557 return true; 1558 1559 char packet[32]; 1560 int packet_len; 1561 if (tid <= 0) 1562 packet_len = ::snprintf (packet, sizeof(packet), "Hc%i", tid); 1563 else 1564 packet_len = ::snprintf (packet, sizeof(packet), "Hc%x", tid); 1565 1566 assert (packet_len + 1 < sizeof(packet)); 1567 StringExtractorGDBRemote response; 1568 if (SendPacketAndWaitForResponse(packet, packet_len, response, false)) 1569 { 1570 if (response.IsOKResponse()) 1571 { 1572 m_curr_tid_run = tid; 1573 return true; 1574 } 1575 } 1576 return false; 1577} 1578 1579bool 1580GDBRemoteCommunicationClient::GetStopReply (StringExtractorGDBRemote &response) 1581{ 1582 if (SendPacketAndWaitForResponse("?", 1, response, false)) 1583 return response.IsNormalResponse(); 1584 return false; 1585} 1586 1587bool 1588GDBRemoteCommunicationClient::GetThreadStopInfo (uint32_t tid, StringExtractorGDBRemote &response) 1589{ 1590 if (m_supports_qThreadStopInfo) 1591 { 1592 char packet[256]; 1593 int packet_len = ::snprintf(packet, sizeof(packet), "qThreadStopInfo%x", tid); 1594 assert (packet_len < sizeof(packet)); 1595 if (SendPacketAndWaitForResponse(packet, packet_len, response, false)) 1596 { 1597 if (response.IsNormalResponse()) 1598 return true; 1599 else 1600 return false; 1601 } 1602 else 1603 { 1604 m_supports_qThreadStopInfo = false; 1605 } 1606 } 1607// if (SetCurrentThread (tid)) 1608// return GetStopReply (response); 1609 return false; 1610} 1611 1612 1613uint8_t 1614GDBRemoteCommunicationClient::SendGDBStoppointTypePacket (GDBStoppointType type, bool insert, addr_t addr, uint32_t length) 1615{ 1616 switch (type) 1617 { 1618 case eBreakpointSoftware: if (!m_supports_z0) return UINT8_MAX; break; 1619 case eBreakpointHardware: if (!m_supports_z1) return UINT8_MAX; break; 1620 case eWatchpointWrite: if (!m_supports_z2) return UINT8_MAX; break; 1621 case eWatchpointRead: if (!m_supports_z3) return UINT8_MAX; break; 1622 case eWatchpointReadWrite: if (!m_supports_z4) return UINT8_MAX; break; 1623 default: return UINT8_MAX; 1624 } 1625 1626 char packet[64]; 1627 const int packet_len = ::snprintf (packet, 1628 sizeof(packet), 1629 "%c%i,%llx,%x", 1630 insert ? 'Z' : 'z', 1631 type, 1632 addr, 1633 length); 1634 1635 assert (packet_len + 1 < sizeof(packet)); 1636 StringExtractorGDBRemote response; 1637 if (SendPacketAndWaitForResponse(packet, packet_len, response, true)) 1638 { 1639 if (response.IsOKResponse()) 1640 return 0; 1641 else if (response.IsErrorResponse()) 1642 return response.GetError(); 1643 } 1644 else 1645 { 1646 switch (type) 1647 { 1648 case eBreakpointSoftware: m_supports_z0 = false; break; 1649 case eBreakpointHardware: m_supports_z1 = false; break; 1650 case eWatchpointWrite: m_supports_z2 = false; break; 1651 case eWatchpointRead: m_supports_z3 = false; break; 1652 case eWatchpointReadWrite: m_supports_z4 = false; break; 1653 default: break; 1654 } 1655 } 1656 1657 return UINT8_MAX; 1658} 1659 1660size_t 1661GDBRemoteCommunicationClient::GetCurrentThreadIDs (std::vector<lldb::tid_t> &thread_ids, 1662 bool &sequence_mutex_unavailable) 1663{ 1664 Mutex::Locker locker; 1665 thread_ids.clear(); 1666 1667 if (GetSequenceMutex (locker)) 1668 { 1669 sequence_mutex_unavailable = false; 1670 StringExtractorGDBRemote response; 1671 1672 for (SendPacketNoLock ("qfThreadInfo", strlen("qfThreadInfo")) && WaitForPacketWithTimeoutMicroSecondsNoLock (response, GetPacketTimeoutInMicroSeconds ()); 1673 response.IsNormalResponse(); 1674 SendPacketNoLock ("qsThreadInfo", strlen("qsThreadInfo")) && WaitForPacketWithTimeoutMicroSecondsNoLock (response, GetPacketTimeoutInMicroSeconds ())) 1675 { 1676 char ch = response.GetChar(); 1677 if (ch == 'l') 1678 break; 1679 if (ch == 'm') 1680 { 1681 do 1682 { 1683 tid_t tid = response.GetHexMaxU32(false, LLDB_INVALID_THREAD_ID); 1684 1685 if (tid != LLDB_INVALID_THREAD_ID) 1686 { 1687 thread_ids.push_back (tid); 1688 } 1689 ch = response.GetChar(); // Skip the command separator 1690 } while (ch == ','); // Make sure we got a comma separator 1691 } 1692 } 1693 } 1694 else 1695 { 1696 sequence_mutex_unavailable = true; 1697 } 1698 return thread_ids.size(); 1699} 1700