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