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 #include <sys/stat.h> 15 16 // C++ Includes 17 #include <sstream> 18 19 // Other libraries and framework includes 20 #include "llvm/ADT/STLExtras.h" 21 #include "llvm/ADT/Triple.h" 22 #include "lldb/Interpreter/Args.h" 23 #include "lldb/Core/Log.h" 24 #include "lldb/Core/ModuleSpec.h" 25 #include "lldb/Core/State.h" 26 #include "lldb/Core/StreamGDBRemote.h" 27 #include "lldb/Core/StreamString.h" 28 #include "lldb/Host/ConnectionFileDescriptor.h" 29 #include "lldb/Host/Endian.h" 30 #include "lldb/Host/Host.h" 31 #include "lldb/Host/HostInfo.h" 32 #include "lldb/Host/StringConvert.h" 33 #include "lldb/Host/TimeValue.h" 34 #include "lldb/Target/Target.h" 35 #include "lldb/Target/MemoryRegionInfo.h" 36 37 // Project includes 38 #include "Utility/StringExtractorGDBRemote.h" 39 #include "ProcessGDBRemote.h" 40 #include "ProcessGDBRemoteLog.h" 41 #include "lldb/Host/Config.h" 42 43 using namespace lldb; 44 using namespace lldb_private; 45 using namespace lldb_private::process_gdb_remote; 46 47 #if defined(LLDB_DISABLE_POSIX) && !defined(SIGSTOP) 48 #define SIGSTOP 17 49 #endif 50 51 //---------------------------------------------------------------------- 52 // GDBRemoteCommunicationClient constructor 53 //---------------------------------------------------------------------- 54 GDBRemoteCommunicationClient::GDBRemoteCommunicationClient() : 55 GDBRemoteCommunication("gdb-remote.client", "gdb-remote.client.rx_packet"), 56 m_supports_not_sending_acks (eLazyBoolCalculate), 57 m_supports_thread_suffix (eLazyBoolCalculate), 58 m_supports_threads_in_stop_reply (eLazyBoolCalculate), 59 m_supports_vCont_all (eLazyBoolCalculate), 60 m_supports_vCont_any (eLazyBoolCalculate), 61 m_supports_vCont_c (eLazyBoolCalculate), 62 m_supports_vCont_C (eLazyBoolCalculate), 63 m_supports_vCont_s (eLazyBoolCalculate), 64 m_supports_vCont_S (eLazyBoolCalculate), 65 m_qHostInfo_is_valid (eLazyBoolCalculate), 66 m_curr_pid_is_valid (eLazyBoolCalculate), 67 m_qProcessInfo_is_valid (eLazyBoolCalculate), 68 m_qGDBServerVersion_is_valid (eLazyBoolCalculate), 69 m_supports_alloc_dealloc_memory (eLazyBoolCalculate), 70 m_supports_memory_region_info (eLazyBoolCalculate), 71 m_supports_watchpoint_support_info (eLazyBoolCalculate), 72 m_supports_detach_stay_stopped (eLazyBoolCalculate), 73 m_watchpoints_trigger_after_instruction(eLazyBoolCalculate), 74 m_attach_or_wait_reply(eLazyBoolCalculate), 75 m_prepare_for_reg_writing_reply (eLazyBoolCalculate), 76 m_supports_p (eLazyBoolCalculate), 77 m_supports_x (eLazyBoolCalculate), 78 m_avoid_g_packets (eLazyBoolCalculate), 79 m_supports_QSaveRegisterState (eLazyBoolCalculate), 80 m_supports_qXfer_auxv_read (eLazyBoolCalculate), 81 m_supports_qXfer_libraries_read (eLazyBoolCalculate), 82 m_supports_qXfer_libraries_svr4_read (eLazyBoolCalculate), 83 m_supports_augmented_libraries_svr4_read (eLazyBoolCalculate), 84 m_supports_jThreadExtendedInfo (eLazyBoolCalculate), 85 m_supports_qProcessInfoPID (true), 86 m_supports_qfProcessInfo (true), 87 m_supports_qUserName (true), 88 m_supports_qGroupName (true), 89 m_supports_qThreadStopInfo (true), 90 m_supports_z0 (true), 91 m_supports_z1 (true), 92 m_supports_z2 (true), 93 m_supports_z3 (true), 94 m_supports_z4 (true), 95 m_supports_QEnvironment (true), 96 m_supports_QEnvironmentHexEncoded (true), 97 m_curr_pid (LLDB_INVALID_PROCESS_ID), 98 m_curr_tid (LLDB_INVALID_THREAD_ID), 99 m_curr_tid_run (LLDB_INVALID_THREAD_ID), 100 m_num_supported_hardware_watchpoints (0), 101 m_async_mutex (Mutex::eMutexTypeRecursive), 102 m_async_packet_predicate (false), 103 m_async_packet (), 104 m_async_result (PacketResult::Success), 105 m_async_response (), 106 m_async_signal (-1), 107 m_interrupt_sent (false), 108 m_thread_id_to_used_usec_map (), 109 m_host_arch(), 110 m_process_arch(), 111 m_os_version_major (UINT32_MAX), 112 m_os_version_minor (UINT32_MAX), 113 m_os_version_update (UINT32_MAX), 114 m_os_build (), 115 m_os_kernel (), 116 m_hostname (), 117 m_gdb_server_name(), 118 m_gdb_server_version(UINT32_MAX), 119 m_default_packet_timeout (0), 120 m_max_packet_size (0) 121 { 122 } 123 124 //---------------------------------------------------------------------- 125 // Destructor 126 //---------------------------------------------------------------------- 127 GDBRemoteCommunicationClient::~GDBRemoteCommunicationClient() 128 { 129 if (IsConnected()) 130 Disconnect(); 131 } 132 133 bool 134 GDBRemoteCommunicationClient::HandshakeWithServer (Error *error_ptr) 135 { 136 ResetDiscoverableSettings(); 137 138 // Start the read thread after we send the handshake ack since if we 139 // fail to send the handshake ack, there is no reason to continue... 140 if (SendAck()) 141 { 142 // Wait for any responses that might have been queued up in the remote 143 // GDB server and flush them all 144 StringExtractorGDBRemote response; 145 PacketResult packet_result = PacketResult::Success; 146 const uint32_t timeout_usec = 10 * 1000; // Wait for 10 ms for a response 147 while (packet_result == PacketResult::Success) 148 packet_result = WaitForPacketWithTimeoutMicroSecondsNoLock (response, timeout_usec); 149 150 // The return value from QueryNoAckModeSupported() is true if the packet 151 // was sent and _any_ response (including UNIMPLEMENTED) was received), 152 // or false if no response was received. This quickly tells us if we have 153 // a live connection to a remote GDB server... 154 if (QueryNoAckModeSupported()) 155 { 156 #if 0 157 // Set above line to "#if 1" to test packet speed if remote GDB server 158 // supports the qSpeedTest packet... 159 TestPacketSpeed(10000); 160 #endif 161 return true; 162 } 163 else 164 { 165 if (error_ptr) 166 error_ptr->SetErrorString("failed to get reply to handshake packet"); 167 } 168 } 169 else 170 { 171 if (error_ptr) 172 error_ptr->SetErrorString("failed to send the handshake ack"); 173 } 174 return false; 175 } 176 177 bool 178 GDBRemoteCommunicationClient::GetAugmentedLibrariesSVR4ReadSupported () 179 { 180 if (m_supports_augmented_libraries_svr4_read == eLazyBoolCalculate) 181 { 182 GetRemoteQSupported(); 183 } 184 return (m_supports_augmented_libraries_svr4_read == eLazyBoolYes); 185 } 186 187 bool 188 GDBRemoteCommunicationClient::GetQXferLibrariesSVR4ReadSupported () 189 { 190 if (m_supports_qXfer_libraries_svr4_read == eLazyBoolCalculate) 191 { 192 GetRemoteQSupported(); 193 } 194 return (m_supports_qXfer_libraries_svr4_read == eLazyBoolYes); 195 } 196 197 bool 198 GDBRemoteCommunicationClient::GetQXferLibrariesReadSupported () 199 { 200 if (m_supports_qXfer_libraries_read == eLazyBoolCalculate) 201 { 202 GetRemoteQSupported(); 203 } 204 return (m_supports_qXfer_libraries_read == eLazyBoolYes); 205 } 206 207 bool 208 GDBRemoteCommunicationClient::GetQXferAuxvReadSupported () 209 { 210 if (m_supports_qXfer_auxv_read == eLazyBoolCalculate) 211 { 212 GetRemoteQSupported(); 213 } 214 return (m_supports_qXfer_auxv_read == eLazyBoolYes); 215 } 216 217 uint64_t 218 GDBRemoteCommunicationClient::GetRemoteMaxPacketSize() 219 { 220 if (m_max_packet_size == 0) 221 { 222 GetRemoteQSupported(); 223 } 224 return m_max_packet_size; 225 } 226 227 bool 228 GDBRemoteCommunicationClient::QueryNoAckModeSupported () 229 { 230 if (m_supports_not_sending_acks == eLazyBoolCalculate) 231 { 232 m_send_acks = true; 233 m_supports_not_sending_acks = eLazyBoolNo; 234 235 // This is the first real packet that we'll send in a debug session and it may take a little 236 // longer than normal to receive a reply. Wait at least 6 seconds for a reply to this packet. 237 238 const uint32_t minimum_timeout = 6; 239 uint32_t old_timeout = GetPacketTimeoutInMicroSeconds() / lldb_private::TimeValue::MicroSecPerSec; 240 GDBRemoteCommunication::ScopedTimeout timeout (*this, std::max (old_timeout, minimum_timeout)); 241 242 StringExtractorGDBRemote response; 243 if (SendPacketAndWaitForResponse("QStartNoAckMode", response, false) == PacketResult::Success) 244 { 245 if (response.IsOKResponse()) 246 { 247 m_send_acks = false; 248 m_supports_not_sending_acks = eLazyBoolYes; 249 } 250 return true; 251 } 252 } 253 return false; 254 } 255 256 void 257 GDBRemoteCommunicationClient::GetListThreadsInStopReplySupported () 258 { 259 if (m_supports_threads_in_stop_reply == eLazyBoolCalculate) 260 { 261 m_supports_threads_in_stop_reply = eLazyBoolNo; 262 263 StringExtractorGDBRemote response; 264 if (SendPacketAndWaitForResponse("QListThreadsInStopReply", response, false) == PacketResult::Success) 265 { 266 if (response.IsOKResponse()) 267 m_supports_threads_in_stop_reply = eLazyBoolYes; 268 } 269 } 270 } 271 272 bool 273 GDBRemoteCommunicationClient::GetVAttachOrWaitSupported () 274 { 275 if (m_attach_or_wait_reply == eLazyBoolCalculate) 276 { 277 m_attach_or_wait_reply = eLazyBoolNo; 278 279 StringExtractorGDBRemote response; 280 if (SendPacketAndWaitForResponse("qVAttachOrWaitSupported", response, false) == PacketResult::Success) 281 { 282 if (response.IsOKResponse()) 283 m_attach_or_wait_reply = eLazyBoolYes; 284 } 285 } 286 if (m_attach_or_wait_reply == eLazyBoolYes) 287 return true; 288 else 289 return false; 290 } 291 292 bool 293 GDBRemoteCommunicationClient::GetSyncThreadStateSupported () 294 { 295 if (m_prepare_for_reg_writing_reply == eLazyBoolCalculate) 296 { 297 m_prepare_for_reg_writing_reply = eLazyBoolNo; 298 299 StringExtractorGDBRemote response; 300 if (SendPacketAndWaitForResponse("qSyncThreadStateSupported", response, false) == PacketResult::Success) 301 { 302 if (response.IsOKResponse()) 303 m_prepare_for_reg_writing_reply = eLazyBoolYes; 304 } 305 } 306 if (m_prepare_for_reg_writing_reply == eLazyBoolYes) 307 return true; 308 else 309 return false; 310 } 311 312 313 void 314 GDBRemoteCommunicationClient::ResetDiscoverableSettings() 315 { 316 m_supports_not_sending_acks = eLazyBoolCalculate; 317 m_supports_thread_suffix = eLazyBoolCalculate; 318 m_supports_threads_in_stop_reply = eLazyBoolCalculate; 319 m_supports_vCont_c = eLazyBoolCalculate; 320 m_supports_vCont_C = eLazyBoolCalculate; 321 m_supports_vCont_s = eLazyBoolCalculate; 322 m_supports_vCont_S = eLazyBoolCalculate; 323 m_supports_p = eLazyBoolCalculate; 324 m_supports_x = eLazyBoolCalculate; 325 m_supports_QSaveRegisterState = eLazyBoolCalculate; 326 m_qHostInfo_is_valid = eLazyBoolCalculate; 327 m_curr_pid_is_valid = eLazyBoolCalculate; 328 m_qProcessInfo_is_valid = eLazyBoolCalculate; 329 m_qGDBServerVersion_is_valid = eLazyBoolCalculate; 330 m_supports_alloc_dealloc_memory = eLazyBoolCalculate; 331 m_supports_memory_region_info = eLazyBoolCalculate; 332 m_prepare_for_reg_writing_reply = eLazyBoolCalculate; 333 m_attach_or_wait_reply = eLazyBoolCalculate; 334 m_avoid_g_packets = eLazyBoolCalculate; 335 m_supports_qXfer_auxv_read = eLazyBoolCalculate; 336 m_supports_qXfer_libraries_read = eLazyBoolCalculate; 337 m_supports_qXfer_libraries_svr4_read = eLazyBoolCalculate; 338 m_supports_augmented_libraries_svr4_read = eLazyBoolCalculate; 339 340 m_supports_qProcessInfoPID = true; 341 m_supports_qfProcessInfo = true; 342 m_supports_qUserName = true; 343 m_supports_qGroupName = true; 344 m_supports_qThreadStopInfo = true; 345 m_supports_z0 = true; 346 m_supports_z1 = true; 347 m_supports_z2 = true; 348 m_supports_z3 = true; 349 m_supports_z4 = true; 350 m_supports_QEnvironment = true; 351 m_supports_QEnvironmentHexEncoded = true; 352 353 m_host_arch.Clear(); 354 m_process_arch.Clear(); 355 m_os_version_major = UINT32_MAX; 356 m_os_version_minor = UINT32_MAX; 357 m_os_version_update = UINT32_MAX; 358 m_os_build.clear(); 359 m_os_kernel.clear(); 360 m_hostname.clear(); 361 m_gdb_server_name.clear(); 362 m_gdb_server_version = UINT32_MAX; 363 m_default_packet_timeout = 0; 364 365 m_max_packet_size = 0; 366 } 367 368 void 369 GDBRemoteCommunicationClient::GetRemoteQSupported () 370 { 371 // Clear out any capabilities we expect to see in the qSupported response 372 m_supports_qXfer_auxv_read = eLazyBoolNo; 373 m_supports_qXfer_libraries_read = eLazyBoolNo; 374 m_supports_qXfer_libraries_svr4_read = eLazyBoolNo; 375 m_supports_augmented_libraries_svr4_read = eLazyBoolNo; 376 m_max_packet_size = UINT64_MAX; // It's supposed to always be there, but if not, we assume no limit 377 378 StringExtractorGDBRemote response; 379 if (SendPacketAndWaitForResponse("qSupported", 380 response, 381 /*send_async=*/false) == PacketResult::Success) 382 { 383 const char *response_cstr = response.GetStringRef().c_str(); 384 if (::strstr (response_cstr, "qXfer:auxv:read+")) 385 m_supports_qXfer_auxv_read = eLazyBoolYes; 386 if (::strstr (response_cstr, "qXfer:libraries-svr4:read+")) 387 m_supports_qXfer_libraries_svr4_read = eLazyBoolYes; 388 if (::strstr (response_cstr, "augmented-libraries-svr4-read")) 389 { 390 m_supports_qXfer_libraries_svr4_read = eLazyBoolYes; // implied 391 m_supports_augmented_libraries_svr4_read = eLazyBoolYes; 392 } 393 if (::strstr (response_cstr, "qXfer:libraries:read+")) 394 m_supports_qXfer_libraries_read = eLazyBoolYes; 395 396 const char *packet_size_str = ::strstr (response_cstr, "PacketSize="); 397 if (packet_size_str) 398 { 399 StringExtractorGDBRemote packet_response(packet_size_str + strlen("PacketSize=")); 400 m_max_packet_size = packet_response.GetHexMaxU64(/*little_endian=*/false, UINT64_MAX); 401 if (m_max_packet_size == 0) 402 { 403 m_max_packet_size = UINT64_MAX; // Must have been a garbled response 404 Log *log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PROCESS)); 405 if (log) 406 log->Printf ("Garbled PacketSize spec in qSupported response"); 407 } 408 } 409 } 410 } 411 412 bool 413 GDBRemoteCommunicationClient::GetThreadSuffixSupported () 414 { 415 if (m_supports_thread_suffix == eLazyBoolCalculate) 416 { 417 StringExtractorGDBRemote response; 418 m_supports_thread_suffix = eLazyBoolNo; 419 if (SendPacketAndWaitForResponse("QThreadSuffixSupported", response, false) == PacketResult::Success) 420 { 421 if (response.IsOKResponse()) 422 m_supports_thread_suffix = eLazyBoolYes; 423 } 424 } 425 return m_supports_thread_suffix; 426 } 427 bool 428 GDBRemoteCommunicationClient::GetVContSupported (char flavor) 429 { 430 if (m_supports_vCont_c == eLazyBoolCalculate) 431 { 432 StringExtractorGDBRemote response; 433 m_supports_vCont_any = eLazyBoolNo; 434 m_supports_vCont_all = eLazyBoolNo; 435 m_supports_vCont_c = eLazyBoolNo; 436 m_supports_vCont_C = eLazyBoolNo; 437 m_supports_vCont_s = eLazyBoolNo; 438 m_supports_vCont_S = eLazyBoolNo; 439 if (SendPacketAndWaitForResponse("vCont?", response, false) == PacketResult::Success) 440 { 441 const char *response_cstr = response.GetStringRef().c_str(); 442 if (::strstr (response_cstr, ";c")) 443 m_supports_vCont_c = eLazyBoolYes; 444 445 if (::strstr (response_cstr, ";C")) 446 m_supports_vCont_C = eLazyBoolYes; 447 448 if (::strstr (response_cstr, ";s")) 449 m_supports_vCont_s = eLazyBoolYes; 450 451 if (::strstr (response_cstr, ";S")) 452 m_supports_vCont_S = eLazyBoolYes; 453 454 if (m_supports_vCont_c == eLazyBoolYes && 455 m_supports_vCont_C == eLazyBoolYes && 456 m_supports_vCont_s == eLazyBoolYes && 457 m_supports_vCont_S == eLazyBoolYes) 458 { 459 m_supports_vCont_all = eLazyBoolYes; 460 } 461 462 if (m_supports_vCont_c == eLazyBoolYes || 463 m_supports_vCont_C == eLazyBoolYes || 464 m_supports_vCont_s == eLazyBoolYes || 465 m_supports_vCont_S == eLazyBoolYes) 466 { 467 m_supports_vCont_any = eLazyBoolYes; 468 } 469 } 470 } 471 472 switch (flavor) 473 { 474 case 'a': return m_supports_vCont_any; 475 case 'A': return m_supports_vCont_all; 476 case 'c': return m_supports_vCont_c; 477 case 'C': return m_supports_vCont_C; 478 case 's': return m_supports_vCont_s; 479 case 'S': return m_supports_vCont_S; 480 default: break; 481 } 482 return false; 483 } 484 485 // Check if the target supports 'p' packet. It sends out a 'p' 486 // packet and checks the response. A normal packet will tell us 487 // that support is available. 488 // 489 // Takes a valid thread ID because p needs to apply to a thread. 490 bool 491 GDBRemoteCommunicationClient::GetpPacketSupported (lldb::tid_t tid) 492 { 493 if (m_supports_p == eLazyBoolCalculate) 494 { 495 StringExtractorGDBRemote response; 496 m_supports_p = eLazyBoolNo; 497 char packet[256]; 498 if (GetThreadSuffixSupported()) 499 snprintf(packet, sizeof(packet), "p0;thread:%" PRIx64 ";", tid); 500 else 501 snprintf(packet, sizeof(packet), "p0"); 502 503 if (SendPacketAndWaitForResponse(packet, response, false) == PacketResult::Success) 504 { 505 if (response.IsNormalResponse()) 506 m_supports_p = eLazyBoolYes; 507 } 508 } 509 return m_supports_p; 510 } 511 512 bool 513 GDBRemoteCommunicationClient::GetThreadExtendedInfoSupported () 514 { 515 if (m_supports_jThreadExtendedInfo == eLazyBoolCalculate) 516 { 517 StringExtractorGDBRemote response; 518 m_supports_jThreadExtendedInfo = eLazyBoolNo; 519 if (SendPacketAndWaitForResponse("jThreadExtendedInfo:", response, false) == PacketResult::Success) 520 { 521 if (response.IsOKResponse()) 522 { 523 m_supports_jThreadExtendedInfo = eLazyBoolYes; 524 } 525 } 526 } 527 return m_supports_jThreadExtendedInfo; 528 } 529 530 bool 531 GDBRemoteCommunicationClient::GetxPacketSupported () 532 { 533 if (m_supports_x == eLazyBoolCalculate) 534 { 535 StringExtractorGDBRemote response; 536 m_supports_x = eLazyBoolNo; 537 char packet[256]; 538 snprintf (packet, sizeof (packet), "x0,0"); 539 if (SendPacketAndWaitForResponse(packet, response, false) == PacketResult::Success) 540 { 541 if (response.IsOKResponse()) 542 m_supports_x = eLazyBoolYes; 543 } 544 } 545 return m_supports_x; 546 } 547 548 GDBRemoteCommunicationClient::PacketResult 549 GDBRemoteCommunicationClient::SendPacketsAndConcatenateResponses 550 ( 551 const char *payload_prefix, 552 std::string &response_string 553 ) 554 { 555 Mutex::Locker locker; 556 if (!GetSequenceMutex(locker, 557 "ProcessGDBRemote::SendPacketsAndConcatenateResponses() failed due to not getting the sequence mutex")) 558 { 559 Log *log (ProcessGDBRemoteLog::GetLogIfAnyCategoryIsSet (GDBR_LOG_PROCESS | GDBR_LOG_PACKETS)); 560 if (log) 561 log->Printf("error: failed to get packet sequence mutex, not sending packets with prefix '%s'", 562 payload_prefix); 563 return PacketResult::ErrorNoSequenceLock; 564 } 565 566 response_string = ""; 567 std::string payload_prefix_str(payload_prefix); 568 unsigned int response_size = 0x1000; 569 if (response_size > GetRemoteMaxPacketSize()) { // May send qSupported packet 570 response_size = GetRemoteMaxPacketSize(); 571 } 572 573 for (unsigned int offset = 0; true; offset += response_size) 574 { 575 StringExtractorGDBRemote this_response; 576 // Construct payload 577 char sizeDescriptor[128]; 578 snprintf(sizeDescriptor, sizeof(sizeDescriptor), "%x,%x", offset, response_size); 579 PacketResult result = SendPacketAndWaitForResponse((payload_prefix_str + sizeDescriptor).c_str(), 580 this_response, 581 /*send_async=*/false); 582 if (result != PacketResult::Success) 583 return result; 584 585 const std::string &this_string = this_response.GetStringRef(); 586 587 // Check for m or l as first character; l seems to mean this is the last chunk 588 char first_char = *this_string.c_str(); 589 if (first_char != 'm' && first_char != 'l') 590 { 591 return PacketResult::ErrorReplyInvalid; 592 } 593 // Concatenate the result so far (skipping 'm' or 'l') 594 response_string.append(this_string, 1, std::string::npos); 595 if (first_char == 'l') 596 // We're done 597 return PacketResult::Success; 598 } 599 } 600 601 GDBRemoteCommunicationClient::PacketResult 602 GDBRemoteCommunicationClient::SendPacketAndWaitForResponse 603 ( 604 const char *payload, 605 StringExtractorGDBRemote &response, 606 bool send_async 607 ) 608 { 609 return SendPacketAndWaitForResponse (payload, 610 ::strlen (payload), 611 response, 612 send_async); 613 } 614 615 GDBRemoteCommunicationClient::PacketResult 616 GDBRemoteCommunicationClient::SendPacketAndWaitForResponseNoLock (const char *payload, 617 size_t payload_length, 618 StringExtractorGDBRemote &response) 619 { 620 PacketResult packet_result = SendPacketNoLock (payload, payload_length); 621 if (packet_result == PacketResult::Success) 622 packet_result = WaitForPacketWithTimeoutMicroSecondsNoLock (response, GetPacketTimeoutInMicroSeconds ()); 623 return packet_result; 624 } 625 626 GDBRemoteCommunicationClient::PacketResult 627 GDBRemoteCommunicationClient::SendPacketAndWaitForResponse 628 ( 629 const char *payload, 630 size_t payload_length, 631 StringExtractorGDBRemote &response, 632 bool send_async 633 ) 634 { 635 PacketResult packet_result = PacketResult::ErrorSendFailed; 636 Mutex::Locker locker; 637 Log *log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PROCESS)); 638 if (GetSequenceMutex (locker)) 639 { 640 packet_result = SendPacketAndWaitForResponseNoLock (payload, payload_length, response); 641 } 642 else 643 { 644 if (send_async) 645 { 646 if (IsRunning()) 647 { 648 Mutex::Locker async_locker (m_async_mutex); 649 m_async_packet.assign(payload, payload_length); 650 m_async_packet_predicate.SetValue (true, eBroadcastNever); 651 652 if (log) 653 log->Printf ("async: async packet = %s", m_async_packet.c_str()); 654 655 bool timed_out = false; 656 if (SendInterrupt(locker, 2, timed_out)) 657 { 658 if (m_interrupt_sent) 659 { 660 m_interrupt_sent = false; 661 TimeValue timeout_time; 662 timeout_time = TimeValue::Now(); 663 timeout_time.OffsetWithSeconds (m_packet_timeout); 664 665 if (log) 666 log->Printf ("async: sent interrupt"); 667 668 if (m_async_packet_predicate.WaitForValueEqualTo (false, &timeout_time, &timed_out)) 669 { 670 if (log) 671 log->Printf ("async: got response"); 672 673 // Swap the response buffer to avoid malloc and string copy 674 response.GetStringRef().swap (m_async_response.GetStringRef()); 675 packet_result = m_async_result; 676 } 677 else 678 { 679 if (log) 680 log->Printf ("async: timed out waiting for response"); 681 } 682 683 // Make sure we wait until the continue packet has been sent again... 684 if (m_private_is_running.WaitForValueEqualTo (true, &timeout_time, &timed_out)) 685 { 686 if (log) 687 { 688 if (timed_out) 689 log->Printf ("async: timed out waiting for process to resume, but process was resumed"); 690 else 691 log->Printf ("async: async packet sent"); 692 } 693 } 694 else 695 { 696 if (log) 697 log->Printf ("async: timed out waiting for process to resume"); 698 } 699 } 700 else 701 { 702 // We had a racy condition where we went to send the interrupt 703 // yet we were able to get the lock, so the process must have 704 // just stopped? 705 if (log) 706 log->Printf ("async: got lock without sending interrupt"); 707 // Send the packet normally since we got the lock 708 packet_result = SendPacketAndWaitForResponseNoLock (payload, payload_length, response); 709 } 710 } 711 else 712 { 713 if (log) 714 log->Printf ("async: failed to interrupt"); 715 } 716 } 717 else 718 { 719 if (log) 720 log->Printf ("async: not running, async is ignored"); 721 } 722 } 723 else 724 { 725 if (log) 726 log->Printf("error: failed to get packet sequence mutex, not sending packet '%*s'", (int) payload_length, payload); 727 } 728 } 729 return packet_result; 730 } 731 732 static const char *end_delimiter = "--end--;"; 733 static const int end_delimiter_len = 8; 734 735 std::string 736 GDBRemoteCommunicationClient::HarmonizeThreadIdsForProfileData 737 ( ProcessGDBRemote *process, 738 StringExtractorGDBRemote& profileDataExtractor 739 ) 740 { 741 std::map<uint64_t, uint32_t> new_thread_id_to_used_usec_map; 742 std::stringstream final_output; 743 std::string name, value; 744 745 // Going to assuming thread_used_usec comes first, else bail out. 746 while (profileDataExtractor.GetNameColonValue(name, value)) 747 { 748 if (name.compare("thread_used_id") == 0) 749 { 750 StringExtractor threadIDHexExtractor(value.c_str()); 751 uint64_t thread_id = threadIDHexExtractor.GetHexMaxU64(false, 0); 752 753 bool has_used_usec = false; 754 uint32_t curr_used_usec = 0; 755 std::string usec_name, usec_value; 756 uint32_t input_file_pos = profileDataExtractor.GetFilePos(); 757 if (profileDataExtractor.GetNameColonValue(usec_name, usec_value)) 758 { 759 if (usec_name.compare("thread_used_usec") == 0) 760 { 761 has_used_usec = true; 762 curr_used_usec = strtoull(usec_value.c_str(), NULL, 0); 763 } 764 else 765 { 766 // We didn't find what we want, it is probably 767 // an older version. Bail out. 768 profileDataExtractor.SetFilePos(input_file_pos); 769 } 770 } 771 772 if (has_used_usec) 773 { 774 uint32_t prev_used_usec = 0; 775 std::map<uint64_t, uint32_t>::iterator iterator = m_thread_id_to_used_usec_map.find(thread_id); 776 if (iterator != m_thread_id_to_used_usec_map.end()) 777 { 778 prev_used_usec = m_thread_id_to_used_usec_map[thread_id]; 779 } 780 781 uint32_t real_used_usec = curr_used_usec - prev_used_usec; 782 // A good first time record is one that runs for at least 0.25 sec 783 bool good_first_time = (prev_used_usec == 0) && (real_used_usec > 250000); 784 bool good_subsequent_time = (prev_used_usec > 0) && 785 ((real_used_usec > 0) || (process->HasAssignedIndexIDToThread(thread_id))); 786 787 if (good_first_time || good_subsequent_time) 788 { 789 // We try to avoid doing too many index id reservation, 790 // resulting in fast increase of index ids. 791 792 final_output << name << ":"; 793 int32_t index_id = process->AssignIndexIDToThread(thread_id); 794 final_output << index_id << ";"; 795 796 final_output << usec_name << ":" << usec_value << ";"; 797 } 798 else 799 { 800 // Skip past 'thread_used_name'. 801 std::string local_name, local_value; 802 profileDataExtractor.GetNameColonValue(local_name, local_value); 803 } 804 805 // Store current time as previous time so that they can be compared later. 806 new_thread_id_to_used_usec_map[thread_id] = curr_used_usec; 807 } 808 else 809 { 810 // Bail out and use old string. 811 final_output << name << ":" << value << ";"; 812 } 813 } 814 else 815 { 816 final_output << name << ":" << value << ";"; 817 } 818 } 819 final_output << end_delimiter; 820 m_thread_id_to_used_usec_map = new_thread_id_to_used_usec_map; 821 822 return final_output.str(); 823 } 824 825 StateType 826 GDBRemoteCommunicationClient::SendContinuePacketAndWaitForResponse 827 ( 828 ProcessGDBRemote *process, 829 const char *payload, 830 size_t packet_length, 831 StringExtractorGDBRemote &response 832 ) 833 { 834 m_curr_tid = LLDB_INVALID_THREAD_ID; 835 Log *log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PROCESS)); 836 if (log) 837 log->Printf ("GDBRemoteCommunicationClient::%s ()", __FUNCTION__); 838 839 Mutex::Locker locker(m_sequence_mutex); 840 StateType state = eStateRunning; 841 842 BroadcastEvent(eBroadcastBitRunPacketSent, NULL); 843 m_public_is_running.SetValue (true, eBroadcastNever); 844 // Set the starting continue packet into "continue_packet". This packet 845 // may change if we are interrupted and we continue after an async packet... 846 std::string continue_packet(payload, packet_length); 847 848 bool got_async_packet = false; 849 850 while (state == eStateRunning) 851 { 852 if (!got_async_packet) 853 { 854 if (log) 855 log->Printf ("GDBRemoteCommunicationClient::%s () sending continue packet: %s", __FUNCTION__, continue_packet.c_str()); 856 if (SendPacketNoLock(continue_packet.c_str(), continue_packet.size()) != PacketResult::Success) 857 state = eStateInvalid; 858 else 859 m_interrupt_sent = false; 860 861 m_private_is_running.SetValue (true, eBroadcastAlways); 862 } 863 864 got_async_packet = false; 865 866 if (log) 867 log->Printf ("GDBRemoteCommunicationClient::%s () WaitForPacket(%s)", __FUNCTION__, continue_packet.c_str()); 868 869 if (WaitForPacketWithTimeoutMicroSecondsNoLock(response, UINT32_MAX) == PacketResult::Success) 870 { 871 if (response.Empty()) 872 state = eStateInvalid; 873 else 874 { 875 const char stop_type = response.GetChar(); 876 if (log) 877 log->Printf ("GDBRemoteCommunicationClient::%s () got packet: %s", __FUNCTION__, response.GetStringRef().c_str()); 878 switch (stop_type) 879 { 880 case 'T': 881 case 'S': 882 { 883 if (process->GetStopID() == 0) 884 { 885 if (process->GetID() == LLDB_INVALID_PROCESS_ID) 886 { 887 lldb::pid_t pid = GetCurrentProcessID (); 888 if (pid != LLDB_INVALID_PROCESS_ID) 889 process->SetID (pid); 890 } 891 process->BuildDynamicRegisterInfo (true); 892 } 893 894 // Privately notify any internal threads that we have stopped 895 // in case we wanted to interrupt our process, yet we might 896 // send a packet and continue without returning control to the 897 // user. 898 m_private_is_running.SetValue (false, eBroadcastAlways); 899 900 const uint8_t signo = response.GetHexU8 (UINT8_MAX); 901 902 bool continue_after_async = m_async_signal != -1 || m_async_packet_predicate.GetValue(); 903 if (continue_after_async || m_interrupt_sent) 904 { 905 // We sent an interrupt packet to stop the inferior process 906 // for an async signal or to send an async packet while running 907 // but we might have been single stepping and received the 908 // stop packet for the step instead of for the interrupt packet. 909 // Typically when an interrupt is sent a SIGINT or SIGSTOP 910 // is used, so if we get anything else, we need to try and 911 // get another stop reply packet that may have been sent 912 // due to sending the interrupt when the target is stopped 913 // which will just re-send a copy of the last stop reply 914 // packet. If we don't do this, then the reply for our 915 // async packet will be the repeat stop reply packet and cause 916 // a lot of trouble for us! 917 if (signo != SIGINT && signo != SIGSTOP) 918 { 919 continue_after_async = false; 920 921 // We didn't get a a SIGINT or SIGSTOP, so try for a 922 // very brief time (1 ms) to get another stop reply 923 // packet to make sure it doesn't get in the way 924 StringExtractorGDBRemote extra_stop_reply_packet; 925 uint32_t timeout_usec = 1000; 926 if (WaitForPacketWithTimeoutMicroSecondsNoLock (extra_stop_reply_packet, timeout_usec) == PacketResult::Success) 927 { 928 switch (extra_stop_reply_packet.GetChar()) 929 { 930 case 'T': 931 case 'S': 932 // We did get an extra stop reply, which means 933 // our interrupt didn't stop the target so we 934 // shouldn't continue after the async signal 935 // or packet is sent... 936 continue_after_async = false; 937 break; 938 } 939 } 940 } 941 } 942 943 if (m_async_signal != -1) 944 { 945 if (log) 946 log->Printf ("async: send signo = %s", Host::GetSignalAsCString (m_async_signal)); 947 948 // Save off the async signal we are supposed to send 949 const int async_signal = m_async_signal; 950 // Clear the async signal member so we don't end up 951 // sending the signal multiple times... 952 m_async_signal = -1; 953 // Check which signal we stopped with 954 if (signo == async_signal) 955 { 956 if (log) 957 log->Printf ("async: stopped with signal %s, we are done running", Host::GetSignalAsCString (signo)); 958 959 // We already stopped with a signal that we wanted 960 // to stop with, so we are done 961 } 962 else 963 { 964 // We stopped with a different signal that the one 965 // we wanted to stop with, so now we must resume 966 // with the signal we want 967 char signal_packet[32]; 968 int signal_packet_len = 0; 969 signal_packet_len = ::snprintf (signal_packet, 970 sizeof (signal_packet), 971 "C%2.2x", 972 async_signal); 973 974 if (log) 975 log->Printf ("async: stopped with signal %s, resume with %s", 976 Host::GetSignalAsCString (signo), 977 Host::GetSignalAsCString (async_signal)); 978 979 // Set the continue packet to resume even if the 980 // interrupt didn't cause our stop (ignore continue_after_async) 981 continue_packet.assign(signal_packet, signal_packet_len); 982 continue; 983 } 984 } 985 else if (m_async_packet_predicate.GetValue()) 986 { 987 Log * packet_log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PACKETS)); 988 989 // We are supposed to send an asynchronous packet while 990 // we are running. 991 m_async_response.Clear(); 992 if (m_async_packet.empty()) 993 { 994 m_async_result = PacketResult::ErrorSendFailed; 995 if (packet_log) 996 packet_log->Printf ("async: error: empty async packet"); 997 998 } 999 else 1000 { 1001 if (packet_log) 1002 packet_log->Printf ("async: sending packet"); 1003 1004 m_async_result = SendPacketAndWaitForResponse (&m_async_packet[0], 1005 m_async_packet.size(), 1006 m_async_response, 1007 false); 1008 } 1009 // Let the other thread that was trying to send the async 1010 // packet know that the packet has been sent and response is 1011 // ready... 1012 m_async_packet_predicate.SetValue(false, eBroadcastAlways); 1013 1014 if (packet_log) 1015 packet_log->Printf ("async: sent packet, continue_after_async = %i", continue_after_async); 1016 1017 // Set the continue packet to resume if our interrupt 1018 // for the async packet did cause the stop 1019 if (continue_after_async) 1020 { 1021 // Reverting this for now as it is causing deadlocks 1022 // in programs (<rdar://problem/11529853>). In the future 1023 // we should check our thread list and "do the right thing" 1024 // for new threads that show up while we stop and run async 1025 // packets. Setting the packet to 'c' to continue all threads 1026 // is the right thing to do 99.99% of the time because if a 1027 // thread was single stepping, and we sent an interrupt, we 1028 // will notice above that we didn't stop due to an interrupt 1029 // but stopped due to stepping and we would _not_ continue. 1030 continue_packet.assign (1, 'c'); 1031 continue; 1032 } 1033 } 1034 // Stop with signal and thread info 1035 state = eStateStopped; 1036 } 1037 break; 1038 1039 case 'W': 1040 case 'X': 1041 // process exited 1042 state = eStateExited; 1043 break; 1044 1045 case 'O': 1046 // STDOUT 1047 { 1048 got_async_packet = true; 1049 std::string inferior_stdout; 1050 inferior_stdout.reserve(response.GetBytesLeft () / 2); 1051 char ch; 1052 while ((ch = response.GetHexU8()) != '\0') 1053 inferior_stdout.append(1, ch); 1054 process->AppendSTDOUT (inferior_stdout.c_str(), inferior_stdout.size()); 1055 } 1056 break; 1057 1058 case 'A': 1059 // Async miscellaneous reply. Right now, only profile data is coming through this channel. 1060 { 1061 got_async_packet = true; 1062 std::string input = response.GetStringRef().substr(1); // '1' to move beyond 'A' 1063 if (m_partial_profile_data.length() > 0) 1064 { 1065 m_partial_profile_data.append(input); 1066 input = m_partial_profile_data; 1067 m_partial_profile_data.clear(); 1068 } 1069 1070 size_t found, pos = 0, len = input.length(); 1071 while ((found = input.find(end_delimiter, pos)) != std::string::npos) 1072 { 1073 StringExtractorGDBRemote profileDataExtractor(input.substr(pos, found).c_str()); 1074 std::string profile_data = HarmonizeThreadIdsForProfileData(process, profileDataExtractor); 1075 process->BroadcastAsyncProfileData (profile_data); 1076 1077 pos = found + end_delimiter_len; 1078 } 1079 1080 if (pos < len) 1081 { 1082 // Last incomplete chunk. 1083 m_partial_profile_data = input.substr(pos); 1084 } 1085 } 1086 break; 1087 1088 case 'E': 1089 // ERROR 1090 state = eStateInvalid; 1091 break; 1092 1093 default: 1094 if (log) 1095 log->Printf ("GDBRemoteCommunicationClient::%s () unrecognized async packet", __FUNCTION__); 1096 state = eStateInvalid; 1097 break; 1098 } 1099 } 1100 } 1101 else 1102 { 1103 if (log) 1104 log->Printf ("GDBRemoteCommunicationClient::%s () WaitForPacket(...) => false", __FUNCTION__); 1105 state = eStateInvalid; 1106 } 1107 } 1108 if (log) 1109 log->Printf ("GDBRemoteCommunicationClient::%s () => %s", __FUNCTION__, StateAsCString(state)); 1110 response.SetFilePos(0); 1111 m_private_is_running.SetValue (false, eBroadcastAlways); 1112 m_public_is_running.SetValue (false, eBroadcastAlways); 1113 return state; 1114 } 1115 1116 bool 1117 GDBRemoteCommunicationClient::SendAsyncSignal (int signo) 1118 { 1119 Mutex::Locker async_locker (m_async_mutex); 1120 m_async_signal = signo; 1121 bool timed_out = false; 1122 Mutex::Locker locker; 1123 if (SendInterrupt (locker, 1, timed_out)) 1124 return true; 1125 m_async_signal = -1; 1126 return false; 1127 } 1128 1129 // This function takes a mutex locker as a parameter in case the GetSequenceMutex 1130 // actually succeeds. If it doesn't succeed in acquiring the sequence mutex 1131 // (the expected result), then it will send the halt packet. If it does succeed 1132 // then the caller that requested the interrupt will want to keep the sequence 1133 // locked down so that no one else can send packets while the caller has control. 1134 // This function usually gets called when we are running and need to stop the 1135 // target. It can also be used when we are running and we need to do something 1136 // else (like read/write memory), so we need to interrupt the running process 1137 // (gdb remote protocol requires this), and do what we need to do, then resume. 1138 1139 bool 1140 GDBRemoteCommunicationClient::SendInterrupt 1141 ( 1142 Mutex::Locker& locker, 1143 uint32_t seconds_to_wait_for_stop, 1144 bool &timed_out 1145 ) 1146 { 1147 timed_out = false; 1148 Log *log (ProcessGDBRemoteLog::GetLogIfAnyCategoryIsSet (GDBR_LOG_PROCESS | GDBR_LOG_PACKETS)); 1149 1150 if (IsRunning()) 1151 { 1152 // Only send an interrupt if our debugserver is running... 1153 if (GetSequenceMutex (locker)) 1154 { 1155 if (log) 1156 log->Printf ("SendInterrupt () - got sequence mutex without having to interrupt"); 1157 } 1158 else 1159 { 1160 // Someone has the mutex locked waiting for a response or for the 1161 // inferior to stop, so send the interrupt on the down low... 1162 char ctrl_c = '\x03'; 1163 ConnectionStatus status = eConnectionStatusSuccess; 1164 size_t bytes_written = Write (&ctrl_c, 1, status, NULL); 1165 if (log) 1166 log->PutCString("send packet: \\x03"); 1167 if (bytes_written > 0) 1168 { 1169 m_interrupt_sent = true; 1170 if (seconds_to_wait_for_stop) 1171 { 1172 TimeValue timeout; 1173 if (seconds_to_wait_for_stop) 1174 { 1175 timeout = TimeValue::Now(); 1176 timeout.OffsetWithSeconds (seconds_to_wait_for_stop); 1177 } 1178 if (m_private_is_running.WaitForValueEqualTo (false, &timeout, &timed_out)) 1179 { 1180 if (log) 1181 log->PutCString ("SendInterrupt () - sent interrupt, private state stopped"); 1182 return true; 1183 } 1184 else 1185 { 1186 if (log) 1187 log->Printf ("SendInterrupt () - sent interrupt, timed out wating for async thread resume"); 1188 } 1189 } 1190 else 1191 { 1192 if (log) 1193 log->Printf ("SendInterrupt () - sent interrupt, not waiting for stop..."); 1194 return true; 1195 } 1196 } 1197 else 1198 { 1199 if (log) 1200 log->Printf ("SendInterrupt () - failed to write interrupt"); 1201 } 1202 return false; 1203 } 1204 } 1205 else 1206 { 1207 if (log) 1208 log->Printf ("SendInterrupt () - not running"); 1209 } 1210 return true; 1211 } 1212 1213 lldb::pid_t 1214 GDBRemoteCommunicationClient::GetCurrentProcessID (bool allow_lazy) 1215 { 1216 if (allow_lazy && m_curr_pid_is_valid == eLazyBoolYes) 1217 return m_curr_pid; 1218 1219 // First try to retrieve the pid via the qProcessInfo request. 1220 GetCurrentProcessInfo (allow_lazy); 1221 if (m_curr_pid_is_valid == eLazyBoolYes) 1222 { 1223 // We really got it. 1224 return m_curr_pid; 1225 } 1226 else 1227 { 1228 // If we don't get a response for qProcessInfo, check if $qC gives us a result. 1229 // $qC only returns a real process id on older debugserver and lldb-platform stubs. 1230 // The gdb remote protocol documents $qC as returning the thread id, which newer 1231 // debugserver and lldb-gdbserver stubs return correctly. 1232 StringExtractorGDBRemote response; 1233 if (SendPacketAndWaitForResponse("qC", strlen("qC"), response, false) == PacketResult::Success) 1234 { 1235 if (response.GetChar() == 'Q') 1236 { 1237 if (response.GetChar() == 'C') 1238 { 1239 m_curr_pid = response.GetHexMaxU32 (false, LLDB_INVALID_PROCESS_ID); 1240 if (m_curr_pid != LLDB_INVALID_PROCESS_ID) 1241 { 1242 m_curr_pid_is_valid = eLazyBoolYes; 1243 return m_curr_pid; 1244 } 1245 } 1246 } 1247 } 1248 } 1249 1250 return LLDB_INVALID_PROCESS_ID; 1251 } 1252 1253 bool 1254 GDBRemoteCommunicationClient::GetLaunchSuccess (std::string &error_str) 1255 { 1256 error_str.clear(); 1257 StringExtractorGDBRemote response; 1258 if (SendPacketAndWaitForResponse("qLaunchSuccess", strlen("qLaunchSuccess"), response, false) == PacketResult::Success) 1259 { 1260 if (response.IsOKResponse()) 1261 return true; 1262 if (response.GetChar() == 'E') 1263 { 1264 // A string the describes what failed when launching... 1265 error_str = response.GetStringRef().substr(1); 1266 } 1267 else 1268 { 1269 error_str.assign ("unknown error occurred launching process"); 1270 } 1271 } 1272 else 1273 { 1274 error_str.assign ("timed out waiting for app to launch"); 1275 } 1276 return false; 1277 } 1278 1279 int 1280 GDBRemoteCommunicationClient::SendArgumentsPacket (const ProcessLaunchInfo &launch_info) 1281 { 1282 // Since we don't get the send argv0 separate from the executable path, we need to 1283 // make sure to use the actual executable path found in the launch_info... 1284 std::vector<const char *> argv; 1285 FileSpec exe_file = launch_info.GetExecutableFile(); 1286 std::string exe_path; 1287 const char *arg = NULL; 1288 const Args &launch_args = launch_info.GetArguments(); 1289 if (exe_file) 1290 exe_path = exe_file.GetPath(); 1291 else 1292 { 1293 arg = launch_args.GetArgumentAtIndex(0); 1294 if (arg) 1295 exe_path = arg; 1296 } 1297 if (!exe_path.empty()) 1298 { 1299 argv.push_back(exe_path.c_str()); 1300 for (uint32_t i=1; (arg = launch_args.GetArgumentAtIndex(i)) != NULL; ++i) 1301 { 1302 if (arg) 1303 argv.push_back(arg); 1304 } 1305 } 1306 if (!argv.empty()) 1307 { 1308 StreamString packet; 1309 packet.PutChar('A'); 1310 for (size_t i = 0, n = argv.size(); i < n; ++i) 1311 { 1312 arg = argv[i]; 1313 const int arg_len = strlen(arg); 1314 if (i > 0) 1315 packet.PutChar(','); 1316 packet.Printf("%i,%i,", arg_len * 2, (int)i); 1317 packet.PutBytesAsRawHex8 (arg, arg_len); 1318 } 1319 1320 StringExtractorGDBRemote response; 1321 if (SendPacketAndWaitForResponse (packet.GetData(), packet.GetSize(), response, false) == PacketResult::Success) 1322 { 1323 if (response.IsOKResponse()) 1324 return 0; 1325 uint8_t error = response.GetError(); 1326 if (error) 1327 return error; 1328 } 1329 } 1330 return -1; 1331 } 1332 1333 int 1334 GDBRemoteCommunicationClient::SendEnvironmentPacket (char const *name_equal_value) 1335 { 1336 if (name_equal_value && name_equal_value[0]) 1337 { 1338 StreamString packet; 1339 bool send_hex_encoding = false; 1340 for (const char *p = name_equal_value; *p != '\0' && send_hex_encoding == false; ++p) 1341 { 1342 if (isprint(*p)) 1343 { 1344 switch (*p) 1345 { 1346 case '$': 1347 case '#': 1348 send_hex_encoding = true; 1349 break; 1350 default: 1351 break; 1352 } 1353 } 1354 else 1355 { 1356 // We have non printable characters, lets hex encode this... 1357 send_hex_encoding = true; 1358 } 1359 } 1360 1361 StringExtractorGDBRemote response; 1362 if (send_hex_encoding) 1363 { 1364 if (m_supports_QEnvironmentHexEncoded) 1365 { 1366 packet.PutCString("QEnvironmentHexEncoded:"); 1367 packet.PutBytesAsRawHex8 (name_equal_value, strlen(name_equal_value)); 1368 if (SendPacketAndWaitForResponse (packet.GetData(), packet.GetSize(), response, false) == PacketResult::Success) 1369 { 1370 if (response.IsOKResponse()) 1371 return 0; 1372 uint8_t error = response.GetError(); 1373 if (error) 1374 return error; 1375 if (response.IsUnsupportedResponse()) 1376 m_supports_QEnvironmentHexEncoded = false; 1377 } 1378 } 1379 1380 } 1381 else if (m_supports_QEnvironment) 1382 { 1383 packet.Printf("QEnvironment:%s", name_equal_value); 1384 if (SendPacketAndWaitForResponse (packet.GetData(), packet.GetSize(), response, false) == PacketResult::Success) 1385 { 1386 if (response.IsOKResponse()) 1387 return 0; 1388 uint8_t error = response.GetError(); 1389 if (error) 1390 return error; 1391 if (response.IsUnsupportedResponse()) 1392 m_supports_QEnvironment = false; 1393 } 1394 } 1395 } 1396 return -1; 1397 } 1398 1399 int 1400 GDBRemoteCommunicationClient::SendLaunchArchPacket (char const *arch) 1401 { 1402 if (arch && arch[0]) 1403 { 1404 StreamString packet; 1405 packet.Printf("QLaunchArch:%s", arch); 1406 StringExtractorGDBRemote response; 1407 if (SendPacketAndWaitForResponse (packet.GetData(), packet.GetSize(), response, false) == PacketResult::Success) 1408 { 1409 if (response.IsOKResponse()) 1410 return 0; 1411 uint8_t error = response.GetError(); 1412 if (error) 1413 return error; 1414 } 1415 } 1416 return -1; 1417 } 1418 1419 int 1420 GDBRemoteCommunicationClient::SendLaunchEventDataPacket (char const *data, bool *was_supported) 1421 { 1422 if (data && *data != '\0') 1423 { 1424 StreamString packet; 1425 packet.Printf("QSetProcessEvent:%s", data); 1426 StringExtractorGDBRemote response; 1427 if (SendPacketAndWaitForResponse (packet.GetData(), packet.GetSize(), response, false) == PacketResult::Success) 1428 { 1429 if (response.IsOKResponse()) 1430 { 1431 if (was_supported) 1432 *was_supported = true; 1433 return 0; 1434 } 1435 else if (response.IsUnsupportedResponse()) 1436 { 1437 if (was_supported) 1438 *was_supported = false; 1439 return -1; 1440 } 1441 else 1442 { 1443 uint8_t error = response.GetError(); 1444 if (was_supported) 1445 *was_supported = true; 1446 if (error) 1447 return error; 1448 } 1449 } 1450 } 1451 return -1; 1452 } 1453 1454 bool 1455 GDBRemoteCommunicationClient::GetOSVersion (uint32_t &major, 1456 uint32_t &minor, 1457 uint32_t &update) 1458 { 1459 if (GetHostInfo ()) 1460 { 1461 if (m_os_version_major != UINT32_MAX) 1462 { 1463 major = m_os_version_major; 1464 minor = m_os_version_minor; 1465 update = m_os_version_update; 1466 return true; 1467 } 1468 } 1469 return false; 1470 } 1471 1472 bool 1473 GDBRemoteCommunicationClient::GetOSBuildString (std::string &s) 1474 { 1475 if (GetHostInfo ()) 1476 { 1477 if (!m_os_build.empty()) 1478 { 1479 s = m_os_build; 1480 return true; 1481 } 1482 } 1483 s.clear(); 1484 return false; 1485 } 1486 1487 1488 bool 1489 GDBRemoteCommunicationClient::GetOSKernelDescription (std::string &s) 1490 { 1491 if (GetHostInfo ()) 1492 { 1493 if (!m_os_kernel.empty()) 1494 { 1495 s = m_os_kernel; 1496 return true; 1497 } 1498 } 1499 s.clear(); 1500 return false; 1501 } 1502 1503 bool 1504 GDBRemoteCommunicationClient::GetHostname (std::string &s) 1505 { 1506 if (GetHostInfo ()) 1507 { 1508 if (!m_hostname.empty()) 1509 { 1510 s = m_hostname; 1511 return true; 1512 } 1513 } 1514 s.clear(); 1515 return false; 1516 } 1517 1518 ArchSpec 1519 GDBRemoteCommunicationClient::GetSystemArchitecture () 1520 { 1521 if (GetHostInfo ()) 1522 return m_host_arch; 1523 return ArchSpec(); 1524 } 1525 1526 const lldb_private::ArchSpec & 1527 GDBRemoteCommunicationClient::GetProcessArchitecture () 1528 { 1529 if (m_qProcessInfo_is_valid == eLazyBoolCalculate) 1530 GetCurrentProcessInfo (); 1531 return m_process_arch; 1532 } 1533 1534 bool 1535 GDBRemoteCommunicationClient::GetGDBServerVersion() 1536 { 1537 if (m_qGDBServerVersion_is_valid == eLazyBoolCalculate) 1538 { 1539 m_gdb_server_name.clear(); 1540 m_gdb_server_version = 0; 1541 m_qGDBServerVersion_is_valid = eLazyBoolNo; 1542 1543 StringExtractorGDBRemote response; 1544 if (SendPacketAndWaitForResponse ("qGDBServerVersion", response, false) == PacketResult::Success) 1545 { 1546 if (response.IsNormalResponse()) 1547 { 1548 std::string name; 1549 std::string value; 1550 bool success = false; 1551 while (response.GetNameColonValue(name, value)) 1552 { 1553 if (name.compare("name") == 0) 1554 { 1555 success = true; 1556 m_gdb_server_name.swap(value); 1557 } 1558 else if (name.compare("version") == 0) 1559 { 1560 size_t dot_pos = value.find('.'); 1561 if (dot_pos != std::string::npos) 1562 value[dot_pos] = '\0'; 1563 const uint32_t version = StringConvert::ToUInt32(value.c_str(), UINT32_MAX, 0); 1564 if (version != UINT32_MAX) 1565 { 1566 success = true; 1567 m_gdb_server_version = version; 1568 } 1569 } 1570 } 1571 if (success) 1572 m_qGDBServerVersion_is_valid = eLazyBoolYes; 1573 } 1574 } 1575 } 1576 return m_qGDBServerVersion_is_valid == eLazyBoolYes; 1577 } 1578 1579 const char * 1580 GDBRemoteCommunicationClient::GetGDBServerProgramName() 1581 { 1582 if (GetGDBServerVersion()) 1583 { 1584 if (!m_gdb_server_name.empty()) 1585 return m_gdb_server_name.c_str(); 1586 } 1587 return NULL; 1588 } 1589 1590 uint32_t 1591 GDBRemoteCommunicationClient::GetGDBServerProgramVersion() 1592 { 1593 if (GetGDBServerVersion()) 1594 return m_gdb_server_version; 1595 return 0; 1596 } 1597 1598 bool 1599 GDBRemoteCommunicationClient::GetHostInfo (bool force) 1600 { 1601 Log *log (ProcessGDBRemoteLog::GetLogIfAnyCategoryIsSet (GDBR_LOG_PROCESS)); 1602 1603 if (force || m_qHostInfo_is_valid == eLazyBoolCalculate) 1604 { 1605 m_qHostInfo_is_valid = eLazyBoolNo; 1606 StringExtractorGDBRemote response; 1607 if (SendPacketAndWaitForResponse ("qHostInfo", response, false) == PacketResult::Success) 1608 { 1609 if (response.IsNormalResponse()) 1610 { 1611 std::string name; 1612 std::string value; 1613 uint32_t cpu = LLDB_INVALID_CPUTYPE; 1614 uint32_t sub = 0; 1615 std::string arch_name; 1616 std::string os_name; 1617 std::string vendor_name; 1618 std::string triple; 1619 std::string distribution_id; 1620 uint32_t pointer_byte_size = 0; 1621 StringExtractor extractor; 1622 ByteOrder byte_order = eByteOrderInvalid; 1623 uint32_t num_keys_decoded = 0; 1624 while (response.GetNameColonValue(name, value)) 1625 { 1626 if (name.compare("cputype") == 0) 1627 { 1628 // exception type in big endian hex 1629 cpu = StringConvert::ToUInt32 (value.c_str(), LLDB_INVALID_CPUTYPE, 0); 1630 if (cpu != LLDB_INVALID_CPUTYPE) 1631 ++num_keys_decoded; 1632 } 1633 else if (name.compare("cpusubtype") == 0) 1634 { 1635 // exception count in big endian hex 1636 sub = StringConvert::ToUInt32 (value.c_str(), 0, 0); 1637 if (sub != 0) 1638 ++num_keys_decoded; 1639 } 1640 else if (name.compare("arch") == 0) 1641 { 1642 arch_name.swap (value); 1643 ++num_keys_decoded; 1644 } 1645 else if (name.compare("triple") == 0) 1646 { 1647 extractor.GetStringRef ().swap (value); 1648 extractor.SetFilePos(0); 1649 extractor.GetHexByteString (triple); 1650 ++num_keys_decoded; 1651 } 1652 else if (name.compare ("distribution_id") == 0) 1653 { 1654 extractor.GetStringRef ().swap (value); 1655 extractor.SetFilePos (0); 1656 extractor.GetHexByteString (distribution_id); 1657 ++num_keys_decoded; 1658 } 1659 else if (name.compare("os_build") == 0) 1660 { 1661 extractor.GetStringRef().swap(value); 1662 extractor.SetFilePos(0); 1663 extractor.GetHexByteString (m_os_build); 1664 ++num_keys_decoded; 1665 } 1666 else if (name.compare("hostname") == 0) 1667 { 1668 extractor.GetStringRef().swap(value); 1669 extractor.SetFilePos(0); 1670 extractor.GetHexByteString (m_hostname); 1671 ++num_keys_decoded; 1672 } 1673 else if (name.compare("os_kernel") == 0) 1674 { 1675 extractor.GetStringRef().swap(value); 1676 extractor.SetFilePos(0); 1677 extractor.GetHexByteString (m_os_kernel); 1678 ++num_keys_decoded; 1679 } 1680 else if (name.compare("ostype") == 0) 1681 { 1682 os_name.swap (value); 1683 ++num_keys_decoded; 1684 } 1685 else if (name.compare("vendor") == 0) 1686 { 1687 vendor_name.swap(value); 1688 ++num_keys_decoded; 1689 } 1690 else if (name.compare("endian") == 0) 1691 { 1692 ++num_keys_decoded; 1693 if (value.compare("little") == 0) 1694 byte_order = eByteOrderLittle; 1695 else if (value.compare("big") == 0) 1696 byte_order = eByteOrderBig; 1697 else if (value.compare("pdp") == 0) 1698 byte_order = eByteOrderPDP; 1699 else 1700 --num_keys_decoded; 1701 } 1702 else if (name.compare("ptrsize") == 0) 1703 { 1704 pointer_byte_size = StringConvert::ToUInt32 (value.c_str(), 0, 0); 1705 if (pointer_byte_size != 0) 1706 ++num_keys_decoded; 1707 } 1708 else if (name.compare("os_version") == 0) 1709 { 1710 Args::StringToVersion (value.c_str(), 1711 m_os_version_major, 1712 m_os_version_minor, 1713 m_os_version_update); 1714 if (m_os_version_major != UINT32_MAX) 1715 ++num_keys_decoded; 1716 } 1717 else if (name.compare("watchpoint_exceptions_received") == 0) 1718 { 1719 ++num_keys_decoded; 1720 if (strcmp(value.c_str(),"before") == 0) 1721 m_watchpoints_trigger_after_instruction = eLazyBoolNo; 1722 else if (strcmp(value.c_str(),"after") == 0) 1723 m_watchpoints_trigger_after_instruction = eLazyBoolYes; 1724 else 1725 --num_keys_decoded; 1726 } 1727 else if (name.compare("default_packet_timeout") == 0) 1728 { 1729 m_default_packet_timeout = StringConvert::ToUInt32(value.c_str(), 0); 1730 if (m_default_packet_timeout > 0) 1731 { 1732 SetPacketTimeout(m_default_packet_timeout); 1733 ++num_keys_decoded; 1734 } 1735 } 1736 1737 } 1738 1739 if (num_keys_decoded > 0) 1740 m_qHostInfo_is_valid = eLazyBoolYes; 1741 1742 if (triple.empty()) 1743 { 1744 if (arch_name.empty()) 1745 { 1746 if (cpu != LLDB_INVALID_CPUTYPE) 1747 { 1748 m_host_arch.SetArchitecture (eArchTypeMachO, cpu, sub); 1749 if (pointer_byte_size) 1750 { 1751 assert (pointer_byte_size == m_host_arch.GetAddressByteSize()); 1752 } 1753 if (byte_order != eByteOrderInvalid) 1754 { 1755 assert (byte_order == m_host_arch.GetByteOrder()); 1756 } 1757 1758 if (!os_name.empty() && vendor_name.compare("apple") == 0 && os_name.find("darwin") == 0) 1759 { 1760 switch (m_host_arch.GetMachine()) 1761 { 1762 case llvm::Triple::aarch64: 1763 case llvm::Triple::arm: 1764 case llvm::Triple::thumb: 1765 os_name = "ios"; 1766 break; 1767 default: 1768 os_name = "macosx"; 1769 break; 1770 } 1771 } 1772 if (!vendor_name.empty()) 1773 m_host_arch.GetTriple().setVendorName (llvm::StringRef (vendor_name)); 1774 if (!os_name.empty()) 1775 m_host_arch.GetTriple().setOSName (llvm::StringRef (os_name)); 1776 1777 } 1778 } 1779 else 1780 { 1781 std::string triple; 1782 triple += arch_name; 1783 if (!vendor_name.empty() || !os_name.empty()) 1784 { 1785 triple += '-'; 1786 if (vendor_name.empty()) 1787 triple += "unknown"; 1788 else 1789 triple += vendor_name; 1790 triple += '-'; 1791 if (os_name.empty()) 1792 triple += "unknown"; 1793 else 1794 triple += os_name; 1795 } 1796 m_host_arch.SetTriple (triple.c_str()); 1797 1798 llvm::Triple &host_triple = m_host_arch.GetTriple(); 1799 if (host_triple.getVendor() == llvm::Triple::Apple && host_triple.getOS() == llvm::Triple::Darwin) 1800 { 1801 switch (m_host_arch.GetMachine()) 1802 { 1803 case llvm::Triple::aarch64: 1804 case llvm::Triple::arm: 1805 case llvm::Triple::thumb: 1806 host_triple.setOS(llvm::Triple::IOS); 1807 break; 1808 default: 1809 host_triple.setOS(llvm::Triple::MacOSX); 1810 break; 1811 } 1812 } 1813 if (pointer_byte_size) 1814 { 1815 assert (pointer_byte_size == m_host_arch.GetAddressByteSize()); 1816 } 1817 if (byte_order != eByteOrderInvalid) 1818 { 1819 assert (byte_order == m_host_arch.GetByteOrder()); 1820 } 1821 1822 } 1823 } 1824 else 1825 { 1826 m_host_arch.SetTriple (triple.c_str()); 1827 if (pointer_byte_size) 1828 { 1829 assert (pointer_byte_size == m_host_arch.GetAddressByteSize()); 1830 } 1831 if (byte_order != eByteOrderInvalid) 1832 { 1833 assert (byte_order == m_host_arch.GetByteOrder()); 1834 } 1835 1836 if (log) 1837 log->Printf ("GDBRemoteCommunicationClient::%s parsed host architecture as %s, triple as %s from triple text %s", __FUNCTION__, m_host_arch.GetArchitectureName () ? m_host_arch.GetArchitectureName () : "<null-arch-name>", m_host_arch.GetTriple ().getTriple ().c_str(), triple.c_str ()); 1838 } 1839 if (!distribution_id.empty ()) 1840 m_host_arch.SetDistributionId (distribution_id.c_str ()); 1841 } 1842 } 1843 } 1844 return m_qHostInfo_is_valid == eLazyBoolYes; 1845 } 1846 1847 int 1848 GDBRemoteCommunicationClient::SendAttach 1849 ( 1850 lldb::pid_t pid, 1851 StringExtractorGDBRemote& response 1852 ) 1853 { 1854 if (pid != LLDB_INVALID_PROCESS_ID) 1855 { 1856 char packet[64]; 1857 const int packet_len = ::snprintf (packet, sizeof(packet), "vAttach;%" PRIx64, pid); 1858 assert (packet_len < (int)sizeof(packet)); 1859 if (SendPacketAndWaitForResponse (packet, packet_len, response, false) == PacketResult::Success) 1860 { 1861 if (response.IsErrorResponse()) 1862 return response.GetError(); 1863 return 0; 1864 } 1865 } 1866 return -1; 1867 } 1868 1869 int 1870 GDBRemoteCommunicationClient::SendStdinNotification (const char* data, size_t data_len) 1871 { 1872 StreamString packet; 1873 packet.PutCString("I"); 1874 packet.PutBytesAsRawHex8(data, data_len); 1875 StringExtractorGDBRemote response; 1876 if (SendPacketAndWaitForResponse (packet.GetData(), packet.GetSize(), response, false) == PacketResult::Success) 1877 { 1878 return 0; 1879 } 1880 return response.GetError(); 1881 1882 } 1883 1884 const lldb_private::ArchSpec & 1885 GDBRemoteCommunicationClient::GetHostArchitecture () 1886 { 1887 if (m_qHostInfo_is_valid == eLazyBoolCalculate) 1888 GetHostInfo (); 1889 return m_host_arch; 1890 } 1891 1892 uint32_t 1893 GDBRemoteCommunicationClient::GetHostDefaultPacketTimeout () 1894 { 1895 if (m_qHostInfo_is_valid == eLazyBoolCalculate) 1896 GetHostInfo (); 1897 return m_default_packet_timeout; 1898 } 1899 1900 addr_t 1901 GDBRemoteCommunicationClient::AllocateMemory (size_t size, uint32_t permissions) 1902 { 1903 if (m_supports_alloc_dealloc_memory != eLazyBoolNo) 1904 { 1905 m_supports_alloc_dealloc_memory = eLazyBoolYes; 1906 char packet[64]; 1907 const int packet_len = ::snprintf (packet, sizeof(packet), "_M%" PRIx64 ",%s%s%s", 1908 (uint64_t)size, 1909 permissions & lldb::ePermissionsReadable ? "r" : "", 1910 permissions & lldb::ePermissionsWritable ? "w" : "", 1911 permissions & lldb::ePermissionsExecutable ? "x" : ""); 1912 assert (packet_len < (int)sizeof(packet)); 1913 StringExtractorGDBRemote response; 1914 if (SendPacketAndWaitForResponse (packet, packet_len, response, false) == PacketResult::Success) 1915 { 1916 if (response.IsUnsupportedResponse()) 1917 m_supports_alloc_dealloc_memory = eLazyBoolNo; 1918 else if (!response.IsErrorResponse()) 1919 return response.GetHexMaxU64(false, LLDB_INVALID_ADDRESS); 1920 } 1921 else 1922 { 1923 m_supports_alloc_dealloc_memory = eLazyBoolNo; 1924 } 1925 } 1926 return LLDB_INVALID_ADDRESS; 1927 } 1928 1929 bool 1930 GDBRemoteCommunicationClient::DeallocateMemory (addr_t addr) 1931 { 1932 if (m_supports_alloc_dealloc_memory != eLazyBoolNo) 1933 { 1934 m_supports_alloc_dealloc_memory = eLazyBoolYes; 1935 char packet[64]; 1936 const int packet_len = ::snprintf(packet, sizeof(packet), "_m%" PRIx64, (uint64_t)addr); 1937 assert (packet_len < (int)sizeof(packet)); 1938 StringExtractorGDBRemote response; 1939 if (SendPacketAndWaitForResponse (packet, packet_len, response, false) == PacketResult::Success) 1940 { 1941 if (response.IsUnsupportedResponse()) 1942 m_supports_alloc_dealloc_memory = eLazyBoolNo; 1943 else if (response.IsOKResponse()) 1944 return true; 1945 } 1946 else 1947 { 1948 m_supports_alloc_dealloc_memory = eLazyBoolNo; 1949 } 1950 } 1951 return false; 1952 } 1953 1954 Error 1955 GDBRemoteCommunicationClient::Detach (bool keep_stopped) 1956 { 1957 Error error; 1958 1959 if (keep_stopped) 1960 { 1961 if (m_supports_detach_stay_stopped == eLazyBoolCalculate) 1962 { 1963 char packet[64]; 1964 const int packet_len = ::snprintf(packet, sizeof(packet), "qSupportsDetachAndStayStopped:"); 1965 assert (packet_len < (int)sizeof(packet)); 1966 StringExtractorGDBRemote response; 1967 if (SendPacketAndWaitForResponse (packet, packet_len, response, false) == PacketResult::Success) 1968 { 1969 m_supports_detach_stay_stopped = eLazyBoolYes; 1970 } 1971 else 1972 { 1973 m_supports_detach_stay_stopped = eLazyBoolNo; 1974 } 1975 } 1976 1977 if (m_supports_detach_stay_stopped == eLazyBoolNo) 1978 { 1979 error.SetErrorString("Stays stopped not supported by this target."); 1980 return error; 1981 } 1982 else 1983 { 1984 StringExtractorGDBRemote response; 1985 PacketResult packet_result = SendPacketAndWaitForResponse ("D1", 1, response, false); 1986 if (packet_result != PacketResult::Success) 1987 error.SetErrorString ("Sending extended disconnect packet failed."); 1988 } 1989 } 1990 else 1991 { 1992 StringExtractorGDBRemote response; 1993 PacketResult packet_result = SendPacketAndWaitForResponse ("D", 1, response, false); 1994 if (packet_result != PacketResult::Success) 1995 error.SetErrorString ("Sending disconnect packet failed."); 1996 } 1997 return error; 1998 } 1999 2000 Error 2001 GDBRemoteCommunicationClient::GetMemoryRegionInfo (lldb::addr_t addr, 2002 lldb_private::MemoryRegionInfo ®ion_info) 2003 { 2004 Error error; 2005 region_info.Clear(); 2006 2007 if (m_supports_memory_region_info != eLazyBoolNo) 2008 { 2009 m_supports_memory_region_info = eLazyBoolYes; 2010 char packet[64]; 2011 const int packet_len = ::snprintf(packet, sizeof(packet), "qMemoryRegionInfo:%" PRIx64, (uint64_t)addr); 2012 assert (packet_len < (int)sizeof(packet)); 2013 StringExtractorGDBRemote response; 2014 if (SendPacketAndWaitForResponse (packet, packet_len, response, false) == PacketResult::Success) 2015 { 2016 std::string name; 2017 std::string value; 2018 addr_t addr_value; 2019 bool success = true; 2020 bool saw_permissions = false; 2021 while (success && response.GetNameColonValue(name, value)) 2022 { 2023 if (name.compare ("start") == 0) 2024 { 2025 addr_value = StringConvert::ToUInt64(value.c_str(), LLDB_INVALID_ADDRESS, 16, &success); 2026 if (success) 2027 region_info.GetRange().SetRangeBase(addr_value); 2028 } 2029 else if (name.compare ("size") == 0) 2030 { 2031 addr_value = StringConvert::ToUInt64(value.c_str(), 0, 16, &success); 2032 if (success) 2033 region_info.GetRange().SetByteSize (addr_value); 2034 } 2035 else if (name.compare ("permissions") == 0 && region_info.GetRange().IsValid()) 2036 { 2037 saw_permissions = true; 2038 if (region_info.GetRange().Contains (addr)) 2039 { 2040 if (value.find('r') != std::string::npos) 2041 region_info.SetReadable (MemoryRegionInfo::eYes); 2042 else 2043 region_info.SetReadable (MemoryRegionInfo::eNo); 2044 2045 if (value.find('w') != std::string::npos) 2046 region_info.SetWritable (MemoryRegionInfo::eYes); 2047 else 2048 region_info.SetWritable (MemoryRegionInfo::eNo); 2049 2050 if (value.find('x') != std::string::npos) 2051 region_info.SetExecutable (MemoryRegionInfo::eYes); 2052 else 2053 region_info.SetExecutable (MemoryRegionInfo::eNo); 2054 } 2055 else 2056 { 2057 // The reported region does not contain this address -- we're looking at an unmapped page 2058 region_info.SetReadable (MemoryRegionInfo::eNo); 2059 region_info.SetWritable (MemoryRegionInfo::eNo); 2060 region_info.SetExecutable (MemoryRegionInfo::eNo); 2061 } 2062 } 2063 else if (name.compare ("error") == 0) 2064 { 2065 StringExtractorGDBRemote name_extractor; 2066 // Swap "value" over into "name_extractor" 2067 name_extractor.GetStringRef().swap(value); 2068 // Now convert the HEX bytes into a string value 2069 name_extractor.GetHexByteString (value); 2070 error.SetErrorString(value.c_str()); 2071 } 2072 } 2073 2074 // We got a valid address range back but no permissions -- which means this is an unmapped page 2075 if (region_info.GetRange().IsValid() && saw_permissions == false) 2076 { 2077 region_info.SetReadable (MemoryRegionInfo::eNo); 2078 region_info.SetWritable (MemoryRegionInfo::eNo); 2079 region_info.SetExecutable (MemoryRegionInfo::eNo); 2080 } 2081 } 2082 else 2083 { 2084 m_supports_memory_region_info = eLazyBoolNo; 2085 } 2086 } 2087 2088 if (m_supports_memory_region_info == eLazyBoolNo) 2089 { 2090 error.SetErrorString("qMemoryRegionInfo is not supported"); 2091 } 2092 if (error.Fail()) 2093 region_info.Clear(); 2094 return error; 2095 2096 } 2097 2098 Error 2099 GDBRemoteCommunicationClient::GetWatchpointSupportInfo (uint32_t &num) 2100 { 2101 Error error; 2102 2103 if (m_supports_watchpoint_support_info == eLazyBoolYes) 2104 { 2105 num = m_num_supported_hardware_watchpoints; 2106 return error; 2107 } 2108 2109 // Set num to 0 first. 2110 num = 0; 2111 if (m_supports_watchpoint_support_info != eLazyBoolNo) 2112 { 2113 char packet[64]; 2114 const int packet_len = ::snprintf(packet, sizeof(packet), "qWatchpointSupportInfo:"); 2115 assert (packet_len < (int)sizeof(packet)); 2116 StringExtractorGDBRemote response; 2117 if (SendPacketAndWaitForResponse (packet, packet_len, response, false) == PacketResult::Success) 2118 { 2119 m_supports_watchpoint_support_info = eLazyBoolYes; 2120 std::string name; 2121 std::string value; 2122 while (response.GetNameColonValue(name, value)) 2123 { 2124 if (name.compare ("num") == 0) 2125 { 2126 num = StringConvert::ToUInt32(value.c_str(), 0, 0); 2127 m_num_supported_hardware_watchpoints = num; 2128 } 2129 } 2130 } 2131 else 2132 { 2133 m_supports_watchpoint_support_info = eLazyBoolNo; 2134 } 2135 } 2136 2137 if (m_supports_watchpoint_support_info == eLazyBoolNo) 2138 { 2139 error.SetErrorString("qWatchpointSupportInfo is not supported"); 2140 } 2141 return error; 2142 2143 } 2144 2145 lldb_private::Error 2146 GDBRemoteCommunicationClient::GetWatchpointSupportInfo (uint32_t &num, bool& after) 2147 { 2148 Error error(GetWatchpointSupportInfo(num)); 2149 if (error.Success()) 2150 error = GetWatchpointsTriggerAfterInstruction(after); 2151 return error; 2152 } 2153 2154 lldb_private::Error 2155 GDBRemoteCommunicationClient::GetWatchpointsTriggerAfterInstruction (bool &after) 2156 { 2157 Error error; 2158 2159 // we assume watchpoints will happen after running the relevant opcode 2160 // and we only want to override this behavior if we have explicitly 2161 // received a qHostInfo telling us otherwise 2162 if (m_qHostInfo_is_valid != eLazyBoolYes) 2163 after = true; 2164 else 2165 after = (m_watchpoints_trigger_after_instruction != eLazyBoolNo); 2166 return error; 2167 } 2168 2169 int 2170 GDBRemoteCommunicationClient::SetSTDIN (char const *path) 2171 { 2172 if (path && path[0]) 2173 { 2174 StreamString packet; 2175 packet.PutCString("QSetSTDIN:"); 2176 packet.PutBytesAsRawHex8(path, strlen(path)); 2177 2178 StringExtractorGDBRemote response; 2179 if (SendPacketAndWaitForResponse (packet.GetData(), packet.GetSize(), response, false) == PacketResult::Success) 2180 { 2181 if (response.IsOKResponse()) 2182 return 0; 2183 uint8_t error = response.GetError(); 2184 if (error) 2185 return error; 2186 } 2187 } 2188 return -1; 2189 } 2190 2191 int 2192 GDBRemoteCommunicationClient::SetSTDOUT (char const *path) 2193 { 2194 if (path && path[0]) 2195 { 2196 StreamString packet; 2197 packet.PutCString("QSetSTDOUT:"); 2198 packet.PutBytesAsRawHex8(path, strlen(path)); 2199 2200 StringExtractorGDBRemote response; 2201 if (SendPacketAndWaitForResponse (packet.GetData(), packet.GetSize(), response, false) == PacketResult::Success) 2202 { 2203 if (response.IsOKResponse()) 2204 return 0; 2205 uint8_t error = response.GetError(); 2206 if (error) 2207 return error; 2208 } 2209 } 2210 return -1; 2211 } 2212 2213 int 2214 GDBRemoteCommunicationClient::SetSTDERR (char const *path) 2215 { 2216 if (path && path[0]) 2217 { 2218 StreamString packet; 2219 packet.PutCString("QSetSTDERR:"); 2220 packet.PutBytesAsRawHex8(path, strlen(path)); 2221 2222 StringExtractorGDBRemote response; 2223 if (SendPacketAndWaitForResponse (packet.GetData(), packet.GetSize(), response, false) == PacketResult::Success) 2224 { 2225 if (response.IsOKResponse()) 2226 return 0; 2227 uint8_t error = response.GetError(); 2228 if (error) 2229 return error; 2230 } 2231 } 2232 return -1; 2233 } 2234 2235 bool 2236 GDBRemoteCommunicationClient::GetWorkingDir (std::string &cwd) 2237 { 2238 StringExtractorGDBRemote response; 2239 if (SendPacketAndWaitForResponse ("qGetWorkingDir", response, false) == PacketResult::Success) 2240 { 2241 if (response.IsUnsupportedResponse()) 2242 return false; 2243 if (response.IsErrorResponse()) 2244 return false; 2245 response.GetHexByteString (cwd); 2246 return !cwd.empty(); 2247 } 2248 return false; 2249 } 2250 2251 int 2252 GDBRemoteCommunicationClient::SetWorkingDir (char const *path) 2253 { 2254 if (path && path[0]) 2255 { 2256 StreamString packet; 2257 packet.PutCString("QSetWorkingDir:"); 2258 packet.PutBytesAsRawHex8(path, strlen(path)); 2259 2260 StringExtractorGDBRemote response; 2261 if (SendPacketAndWaitForResponse (packet.GetData(), packet.GetSize(), response, false) == PacketResult::Success) 2262 { 2263 if (response.IsOKResponse()) 2264 return 0; 2265 uint8_t error = response.GetError(); 2266 if (error) 2267 return error; 2268 } 2269 } 2270 return -1; 2271 } 2272 2273 int 2274 GDBRemoteCommunicationClient::SetDisableASLR (bool enable) 2275 { 2276 char packet[32]; 2277 const int packet_len = ::snprintf (packet, sizeof (packet), "QSetDisableASLR:%i", enable ? 1 : 0); 2278 assert (packet_len < (int)sizeof(packet)); 2279 StringExtractorGDBRemote response; 2280 if (SendPacketAndWaitForResponse (packet, packet_len, response, false) == PacketResult::Success) 2281 { 2282 if (response.IsOKResponse()) 2283 return 0; 2284 uint8_t error = response.GetError(); 2285 if (error) 2286 return error; 2287 } 2288 return -1; 2289 } 2290 2291 int 2292 GDBRemoteCommunicationClient::SetDetachOnError (bool enable) 2293 { 2294 char packet[32]; 2295 const int packet_len = ::snprintf (packet, sizeof (packet), "QSetDetachOnError:%i", enable ? 1 : 0); 2296 assert (packet_len < (int)sizeof(packet)); 2297 StringExtractorGDBRemote response; 2298 if (SendPacketAndWaitForResponse (packet, packet_len, response, false) == PacketResult::Success) 2299 { 2300 if (response.IsOKResponse()) 2301 return 0; 2302 uint8_t error = response.GetError(); 2303 if (error) 2304 return error; 2305 } 2306 return -1; 2307 } 2308 2309 2310 bool 2311 GDBRemoteCommunicationClient::DecodeProcessInfoResponse (StringExtractorGDBRemote &response, ProcessInstanceInfo &process_info) 2312 { 2313 if (response.IsNormalResponse()) 2314 { 2315 std::string name; 2316 std::string value; 2317 StringExtractor extractor; 2318 2319 uint32_t cpu = LLDB_INVALID_CPUTYPE; 2320 uint32_t sub = 0; 2321 std::string vendor; 2322 std::string os_type; 2323 2324 while (response.GetNameColonValue(name, value)) 2325 { 2326 if (name.compare("pid") == 0) 2327 { 2328 process_info.SetProcessID (StringConvert::ToUInt32 (value.c_str(), LLDB_INVALID_PROCESS_ID, 0)); 2329 } 2330 else if (name.compare("ppid") == 0) 2331 { 2332 process_info.SetParentProcessID (StringConvert::ToUInt32 (value.c_str(), LLDB_INVALID_PROCESS_ID, 0)); 2333 } 2334 else if (name.compare("uid") == 0) 2335 { 2336 process_info.SetUserID (StringConvert::ToUInt32 (value.c_str(), UINT32_MAX, 0)); 2337 } 2338 else if (name.compare("euid") == 0) 2339 { 2340 process_info.SetEffectiveUserID (StringConvert::ToUInt32 (value.c_str(), UINT32_MAX, 0)); 2341 } 2342 else if (name.compare("gid") == 0) 2343 { 2344 process_info.SetGroupID (StringConvert::ToUInt32 (value.c_str(), UINT32_MAX, 0)); 2345 } 2346 else if (name.compare("egid") == 0) 2347 { 2348 process_info.SetEffectiveGroupID (StringConvert::ToUInt32 (value.c_str(), UINT32_MAX, 0)); 2349 } 2350 else if (name.compare("triple") == 0) 2351 { 2352 StringExtractor extractor; 2353 extractor.GetStringRef().swap(value); 2354 extractor.SetFilePos(0); 2355 extractor.GetHexByteString (value); 2356 process_info.GetArchitecture ().SetTriple (value.c_str()); 2357 } 2358 else if (name.compare("name") == 0) 2359 { 2360 StringExtractor extractor; 2361 // The process name from ASCII hex bytes since we can't 2362 // control the characters in a process name 2363 extractor.GetStringRef().swap(value); 2364 extractor.SetFilePos(0); 2365 extractor.GetHexByteString (value); 2366 process_info.GetExecutableFile().SetFile (value.c_str(), false); 2367 } 2368 else if (name.compare("cputype") == 0) 2369 { 2370 cpu = StringConvert::ToUInt32 (value.c_str(), LLDB_INVALID_CPUTYPE, 16); 2371 } 2372 else if (name.compare("cpusubtype") == 0) 2373 { 2374 sub = StringConvert::ToUInt32 (value.c_str(), 0, 16); 2375 } 2376 else if (name.compare("vendor") == 0) 2377 { 2378 vendor = value; 2379 } 2380 else if (name.compare("ostype") == 0) 2381 { 2382 os_type = value; 2383 } 2384 } 2385 2386 if (cpu != LLDB_INVALID_CPUTYPE && !vendor.empty() && !os_type.empty()) 2387 { 2388 if (vendor == "apple") 2389 { 2390 process_info.GetArchitecture().SetArchitecture (eArchTypeMachO, cpu, sub); 2391 process_info.GetArchitecture().GetTriple().setVendorName (llvm::StringRef (vendor)); 2392 process_info.GetArchitecture().GetTriple().setOSName (llvm::StringRef (os_type)); 2393 } 2394 } 2395 2396 if (process_info.GetProcessID() != LLDB_INVALID_PROCESS_ID) 2397 return true; 2398 } 2399 return false; 2400 } 2401 2402 bool 2403 GDBRemoteCommunicationClient::GetProcessInfo (lldb::pid_t pid, ProcessInstanceInfo &process_info) 2404 { 2405 process_info.Clear(); 2406 2407 if (m_supports_qProcessInfoPID) 2408 { 2409 char packet[32]; 2410 const int packet_len = ::snprintf (packet, sizeof (packet), "qProcessInfoPID:%" PRIu64, pid); 2411 assert (packet_len < (int)sizeof(packet)); 2412 StringExtractorGDBRemote response; 2413 if (SendPacketAndWaitForResponse (packet, packet_len, response, false) == PacketResult::Success) 2414 { 2415 return DecodeProcessInfoResponse (response, process_info); 2416 } 2417 else 2418 { 2419 m_supports_qProcessInfoPID = false; 2420 return false; 2421 } 2422 } 2423 return false; 2424 } 2425 2426 bool 2427 GDBRemoteCommunicationClient::GetCurrentProcessInfo (bool allow_lazy) 2428 { 2429 Log *log (ProcessGDBRemoteLog::GetLogIfAnyCategoryIsSet (GDBR_LOG_PROCESS | GDBR_LOG_PACKETS)); 2430 2431 if (allow_lazy) 2432 { 2433 if (m_qProcessInfo_is_valid == eLazyBoolYes) 2434 return true; 2435 if (m_qProcessInfo_is_valid == eLazyBoolNo) 2436 return false; 2437 } 2438 2439 GetHostInfo (); 2440 2441 StringExtractorGDBRemote response; 2442 if (SendPacketAndWaitForResponse ("qProcessInfo", response, false) == PacketResult::Success) 2443 { 2444 if (response.IsNormalResponse()) 2445 { 2446 std::string name; 2447 std::string value; 2448 uint32_t cpu = LLDB_INVALID_CPUTYPE; 2449 uint32_t sub = 0; 2450 std::string arch_name; 2451 std::string os_name; 2452 std::string vendor_name; 2453 std::string triple; 2454 uint32_t pointer_byte_size = 0; 2455 StringExtractor extractor; 2456 ByteOrder byte_order = eByteOrderInvalid; 2457 uint32_t num_keys_decoded = 0; 2458 lldb::pid_t pid = LLDB_INVALID_PROCESS_ID; 2459 while (response.GetNameColonValue(name, value)) 2460 { 2461 if (name.compare("cputype") == 0) 2462 { 2463 cpu = StringConvert::ToUInt32 (value.c_str(), LLDB_INVALID_CPUTYPE, 16); 2464 if (cpu != LLDB_INVALID_CPUTYPE) 2465 ++num_keys_decoded; 2466 } 2467 else if (name.compare("cpusubtype") == 0) 2468 { 2469 sub = StringConvert::ToUInt32 (value.c_str(), 0, 16); 2470 if (sub != 0) 2471 ++num_keys_decoded; 2472 } 2473 else if (name.compare("triple") == 0) 2474 { 2475 StringExtractor extractor; 2476 extractor.GetStringRef().swap(value); 2477 extractor.SetFilePos(0); 2478 extractor.GetHexByteString (triple); 2479 ++num_keys_decoded; 2480 } 2481 else if (name.compare("ostype") == 0) 2482 { 2483 os_name.swap (value); 2484 ++num_keys_decoded; 2485 } 2486 else if (name.compare("vendor") == 0) 2487 { 2488 vendor_name.swap(value); 2489 ++num_keys_decoded; 2490 } 2491 else if (name.compare("endian") == 0) 2492 { 2493 ++num_keys_decoded; 2494 if (value.compare("little") == 0) 2495 byte_order = eByteOrderLittle; 2496 else if (value.compare("big") == 0) 2497 byte_order = eByteOrderBig; 2498 else if (value.compare("pdp") == 0) 2499 byte_order = eByteOrderPDP; 2500 else 2501 --num_keys_decoded; 2502 } 2503 else if (name.compare("ptrsize") == 0) 2504 { 2505 pointer_byte_size = StringConvert::ToUInt32 (value.c_str(), 0, 16); 2506 if (pointer_byte_size != 0) 2507 ++num_keys_decoded; 2508 } 2509 else if (name.compare("pid") == 0) 2510 { 2511 pid = StringConvert::ToUInt64(value.c_str(), 0, 16); 2512 if (pid != LLDB_INVALID_PROCESS_ID) 2513 ++num_keys_decoded; 2514 } 2515 } 2516 if (num_keys_decoded > 0) 2517 m_qProcessInfo_is_valid = eLazyBoolYes; 2518 if (pid != LLDB_INVALID_PROCESS_ID) 2519 { 2520 m_curr_pid_is_valid = eLazyBoolYes; 2521 m_curr_pid = pid; 2522 } 2523 2524 // Set the ArchSpec from the triple if we have it. 2525 if (!triple.empty ()) 2526 { 2527 m_process_arch.SetTriple (triple.c_str ()); 2528 if (pointer_byte_size) 2529 { 2530 assert (pointer_byte_size == m_process_arch.GetAddressByteSize()); 2531 } 2532 } 2533 else if (cpu != LLDB_INVALID_CPUTYPE && !os_name.empty() && !vendor_name.empty()) 2534 { 2535 llvm::Triple triple(llvm::Twine("-") + vendor_name + "-" + os_name); 2536 2537 assert(triple.getObjectFormat() != llvm::Triple::UnknownObjectFormat); 2538 switch (triple.getObjectFormat()) { 2539 case llvm::Triple::MachO: 2540 m_process_arch.SetArchitecture (eArchTypeMachO, cpu, sub); 2541 break; 2542 case llvm::Triple::ELF: 2543 m_process_arch.SetArchitecture (eArchTypeELF, cpu, sub); 2544 break; 2545 case llvm::Triple::COFF: 2546 m_process_arch.SetArchitecture (eArchTypeCOFF, cpu, sub); 2547 break; 2548 case llvm::Triple::UnknownObjectFormat: 2549 if (log) 2550 log->Printf("error: failed to determine target architecture"); 2551 return false; 2552 } 2553 2554 if (pointer_byte_size) 2555 { 2556 assert (pointer_byte_size == m_process_arch.GetAddressByteSize()); 2557 } 2558 if (byte_order != eByteOrderInvalid) 2559 { 2560 assert (byte_order == m_process_arch.GetByteOrder()); 2561 } 2562 m_process_arch.GetTriple().setVendorName (llvm::StringRef (vendor_name)); 2563 m_process_arch.GetTriple().setOSName(llvm::StringRef (os_name)); 2564 m_host_arch.GetTriple().setVendorName (llvm::StringRef (vendor_name)); 2565 m_host_arch.GetTriple().setOSName (llvm::StringRef (os_name)); 2566 } 2567 return true; 2568 } 2569 } 2570 else 2571 { 2572 m_qProcessInfo_is_valid = eLazyBoolNo; 2573 } 2574 2575 return false; 2576 } 2577 2578 2579 uint32_t 2580 GDBRemoteCommunicationClient::FindProcesses (const ProcessInstanceInfoMatch &match_info, 2581 ProcessInstanceInfoList &process_infos) 2582 { 2583 process_infos.Clear(); 2584 2585 if (m_supports_qfProcessInfo) 2586 { 2587 StreamString packet; 2588 packet.PutCString ("qfProcessInfo"); 2589 if (!match_info.MatchAllProcesses()) 2590 { 2591 packet.PutChar (':'); 2592 const char *name = match_info.GetProcessInfo().GetName(); 2593 bool has_name_match = false; 2594 if (name && name[0]) 2595 { 2596 has_name_match = true; 2597 NameMatchType name_match_type = match_info.GetNameMatchType(); 2598 switch (name_match_type) 2599 { 2600 case eNameMatchIgnore: 2601 has_name_match = false; 2602 break; 2603 2604 case eNameMatchEquals: 2605 packet.PutCString ("name_match:equals;"); 2606 break; 2607 2608 case eNameMatchContains: 2609 packet.PutCString ("name_match:contains;"); 2610 break; 2611 2612 case eNameMatchStartsWith: 2613 packet.PutCString ("name_match:starts_with;"); 2614 break; 2615 2616 case eNameMatchEndsWith: 2617 packet.PutCString ("name_match:ends_with;"); 2618 break; 2619 2620 case eNameMatchRegularExpression: 2621 packet.PutCString ("name_match:regex;"); 2622 break; 2623 } 2624 if (has_name_match) 2625 { 2626 packet.PutCString ("name:"); 2627 packet.PutBytesAsRawHex8(name, ::strlen(name)); 2628 packet.PutChar (';'); 2629 } 2630 } 2631 2632 if (match_info.GetProcessInfo().ProcessIDIsValid()) 2633 packet.Printf("pid:%" PRIu64 ";",match_info.GetProcessInfo().GetProcessID()); 2634 if (match_info.GetProcessInfo().ParentProcessIDIsValid()) 2635 packet.Printf("parent_pid:%" PRIu64 ";",match_info.GetProcessInfo().GetParentProcessID()); 2636 if (match_info.GetProcessInfo().UserIDIsValid()) 2637 packet.Printf("uid:%u;",match_info.GetProcessInfo().GetUserID()); 2638 if (match_info.GetProcessInfo().GroupIDIsValid()) 2639 packet.Printf("gid:%u;",match_info.GetProcessInfo().GetGroupID()); 2640 if (match_info.GetProcessInfo().EffectiveUserIDIsValid()) 2641 packet.Printf("euid:%u;",match_info.GetProcessInfo().GetEffectiveUserID()); 2642 if (match_info.GetProcessInfo().EffectiveGroupIDIsValid()) 2643 packet.Printf("egid:%u;",match_info.GetProcessInfo().GetEffectiveGroupID()); 2644 if (match_info.GetProcessInfo().EffectiveGroupIDIsValid()) 2645 packet.Printf("all_users:%u;",match_info.GetMatchAllUsers() ? 1 : 0); 2646 if (match_info.GetProcessInfo().GetArchitecture().IsValid()) 2647 { 2648 const ArchSpec &match_arch = match_info.GetProcessInfo().GetArchitecture(); 2649 const llvm::Triple &triple = match_arch.GetTriple(); 2650 packet.PutCString("triple:"); 2651 packet.PutCString(triple.getTriple().c_str()); 2652 packet.PutChar (';'); 2653 } 2654 } 2655 StringExtractorGDBRemote response; 2656 if (SendPacketAndWaitForResponse (packet.GetData(), packet.GetSize(), response, false) == PacketResult::Success) 2657 { 2658 do 2659 { 2660 ProcessInstanceInfo process_info; 2661 if (!DecodeProcessInfoResponse (response, process_info)) 2662 break; 2663 process_infos.Append(process_info); 2664 response.GetStringRef().clear(); 2665 response.SetFilePos(0); 2666 } while (SendPacketAndWaitForResponse ("qsProcessInfo", strlen ("qsProcessInfo"), response, false) == PacketResult::Success); 2667 } 2668 else 2669 { 2670 m_supports_qfProcessInfo = false; 2671 return 0; 2672 } 2673 } 2674 return process_infos.GetSize(); 2675 2676 } 2677 2678 bool 2679 GDBRemoteCommunicationClient::GetUserName (uint32_t uid, std::string &name) 2680 { 2681 if (m_supports_qUserName) 2682 { 2683 char packet[32]; 2684 const int packet_len = ::snprintf (packet, sizeof (packet), "qUserName:%i", uid); 2685 assert (packet_len < (int)sizeof(packet)); 2686 StringExtractorGDBRemote response; 2687 if (SendPacketAndWaitForResponse (packet, packet_len, response, false) == PacketResult::Success) 2688 { 2689 if (response.IsNormalResponse()) 2690 { 2691 // Make sure we parsed the right number of characters. The response is 2692 // the hex encoded user name and should make up the entire packet. 2693 // If there are any non-hex ASCII bytes, the length won't match below.. 2694 if (response.GetHexByteString (name) * 2 == response.GetStringRef().size()) 2695 return true; 2696 } 2697 } 2698 else 2699 { 2700 m_supports_qUserName = false; 2701 return false; 2702 } 2703 } 2704 return false; 2705 2706 } 2707 2708 bool 2709 GDBRemoteCommunicationClient::GetGroupName (uint32_t gid, std::string &name) 2710 { 2711 if (m_supports_qGroupName) 2712 { 2713 char packet[32]; 2714 const int packet_len = ::snprintf (packet, sizeof (packet), "qGroupName:%i", gid); 2715 assert (packet_len < (int)sizeof(packet)); 2716 StringExtractorGDBRemote response; 2717 if (SendPacketAndWaitForResponse (packet, packet_len, response, false) == PacketResult::Success) 2718 { 2719 if (response.IsNormalResponse()) 2720 { 2721 // Make sure we parsed the right number of characters. The response is 2722 // the hex encoded group name and should make up the entire packet. 2723 // If there are any non-hex ASCII bytes, the length won't match below.. 2724 if (response.GetHexByteString (name) * 2 == response.GetStringRef().size()) 2725 return true; 2726 } 2727 } 2728 else 2729 { 2730 m_supports_qGroupName = false; 2731 return false; 2732 } 2733 } 2734 return false; 2735 } 2736 2737 void 2738 GDBRemoteCommunicationClient::TestPacketSpeed (const uint32_t num_packets) 2739 { 2740 uint32_t i; 2741 TimeValue start_time, end_time; 2742 uint64_t total_time_nsec; 2743 if (SendSpeedTestPacket (0, 0)) 2744 { 2745 static uint32_t g_send_sizes[] = { 0, 64, 128, 512, 1024 }; 2746 static uint32_t g_recv_sizes[] = { 0, 64, 128, 512, 1024 }; //, 4*1024, 8*1024, 16*1024, 32*1024, 48*1024, 64*1024, 96*1024, 128*1024 }; 2747 const size_t k_num_send_sizes = llvm::array_lengthof(g_send_sizes); 2748 const size_t k_num_recv_sizes = llvm::array_lengthof(g_recv_sizes); 2749 const uint64_t k_recv_amount = 4*1024*1024; // Receive 4MB 2750 for (uint32_t send_idx = 0; send_idx < k_num_send_sizes; ++send_idx) 2751 { 2752 const uint32_t send_size = g_send_sizes[send_idx]; 2753 for (uint32_t recv_idx = 0; recv_idx < k_num_recv_sizes; ++recv_idx) 2754 { 2755 const uint32_t recv_size = g_recv_sizes[recv_idx]; 2756 StreamString packet; 2757 packet.Printf ("qSpeedTest:response_size:%i;data:", recv_size); 2758 uint32_t bytes_left = send_size; 2759 while (bytes_left > 0) 2760 { 2761 if (bytes_left >= 26) 2762 { 2763 packet.PutCString("abcdefghijklmnopqrstuvwxyz"); 2764 bytes_left -= 26; 2765 } 2766 else 2767 { 2768 packet.Printf ("%*.*s;", bytes_left, bytes_left, "abcdefghijklmnopqrstuvwxyz"); 2769 bytes_left = 0; 2770 } 2771 } 2772 2773 start_time = TimeValue::Now(); 2774 if (recv_size == 0) 2775 { 2776 for (i=0; i<num_packets; ++i) 2777 { 2778 StringExtractorGDBRemote response; 2779 SendPacketAndWaitForResponse (packet.GetData(), packet.GetSize(), response, false); 2780 } 2781 } 2782 else 2783 { 2784 uint32_t bytes_read = 0; 2785 while (bytes_read < k_recv_amount) 2786 { 2787 StringExtractorGDBRemote response; 2788 SendPacketAndWaitForResponse (packet.GetData(), packet.GetSize(), response, false); 2789 bytes_read += recv_size; 2790 } 2791 } 2792 end_time = TimeValue::Now(); 2793 total_time_nsec = end_time.GetAsNanoSecondsSinceJan1_1970() - start_time.GetAsNanoSecondsSinceJan1_1970(); 2794 if (recv_size == 0) 2795 { 2796 float packets_per_second = (((float)num_packets)/(float)total_time_nsec) * (float)TimeValue::NanoSecPerSec; 2797 printf ("%u qSpeedTest(send=%-7u, recv=%-7u) in %" PRIu64 ".%9.9" PRIu64 " sec for %f packets/sec.\n", 2798 num_packets, 2799 send_size, 2800 recv_size, 2801 total_time_nsec / TimeValue::NanoSecPerSec, 2802 total_time_nsec % TimeValue::NanoSecPerSec, 2803 packets_per_second); 2804 } 2805 else 2806 { 2807 float mb_second = ((((float)k_recv_amount)/(float)total_time_nsec) * (float)TimeValue::NanoSecPerSec) / (1024.0*1024.0); 2808 printf ("%u qSpeedTest(send=%-7u, recv=%-7u) sent 4MB in %" PRIu64 ".%9.9" PRIu64 " sec for %f MB/sec.\n", 2809 num_packets, 2810 send_size, 2811 recv_size, 2812 total_time_nsec / TimeValue::NanoSecPerSec, 2813 total_time_nsec % TimeValue::NanoSecPerSec, 2814 mb_second); 2815 } 2816 } 2817 } 2818 } 2819 } 2820 2821 bool 2822 GDBRemoteCommunicationClient::SendSpeedTestPacket (uint32_t send_size, uint32_t recv_size) 2823 { 2824 StreamString packet; 2825 packet.Printf ("qSpeedTest:response_size:%i;data:", recv_size); 2826 uint32_t bytes_left = send_size; 2827 while (bytes_left > 0) 2828 { 2829 if (bytes_left >= 26) 2830 { 2831 packet.PutCString("abcdefghijklmnopqrstuvwxyz"); 2832 bytes_left -= 26; 2833 } 2834 else 2835 { 2836 packet.Printf ("%*.*s;", bytes_left, bytes_left, "abcdefghijklmnopqrstuvwxyz"); 2837 bytes_left = 0; 2838 } 2839 } 2840 2841 StringExtractorGDBRemote response; 2842 return SendPacketAndWaitForResponse (packet.GetData(), packet.GetSize(), response, false) == PacketResult::Success; 2843 } 2844 2845 uint16_t 2846 GDBRemoteCommunicationClient::LaunchGDBserverAndGetPort (lldb::pid_t &pid, const char *remote_accept_hostname) 2847 { 2848 pid = LLDB_INVALID_PROCESS_ID; 2849 StringExtractorGDBRemote response; 2850 StreamString stream; 2851 stream.PutCString("qLaunchGDBServer;"); 2852 std::string hostname; 2853 if (remote_accept_hostname && remote_accept_hostname[0]) 2854 hostname = remote_accept_hostname; 2855 else 2856 { 2857 if (HostInfo::GetHostname(hostname)) 2858 { 2859 // Make the GDB server we launch only accept connections from this host 2860 stream.Printf("host:%s;", hostname.c_str()); 2861 } 2862 else 2863 { 2864 // Make the GDB server we launch accept connections from any host since we can't figure out the hostname 2865 stream.Printf("host:*;"); 2866 } 2867 } 2868 const char *packet = stream.GetData(); 2869 int packet_len = stream.GetSize(); 2870 2871 // give the process a few seconds to startup 2872 GDBRemoteCommunication::ScopedTimeout timeout (*this, 10); 2873 2874 if (SendPacketAndWaitForResponse(packet, packet_len, response, false) == PacketResult::Success) 2875 { 2876 std::string name; 2877 std::string value; 2878 uint16_t port = 0; 2879 while (response.GetNameColonValue(name, value)) 2880 { 2881 if (name.compare("port") == 0) 2882 port = StringConvert::ToUInt32(value.c_str(), 0, 0); 2883 else if (name.compare("pid") == 0) 2884 pid = StringConvert::ToUInt64(value.c_str(), LLDB_INVALID_PROCESS_ID, 0); 2885 } 2886 return port; 2887 } 2888 return 0; 2889 } 2890 2891 bool 2892 GDBRemoteCommunicationClient::KillSpawnedProcess (lldb::pid_t pid) 2893 { 2894 StreamString stream; 2895 stream.Printf ("qKillSpawnedProcess:%" PRId64 , pid); 2896 const char *packet = stream.GetData(); 2897 int packet_len = stream.GetSize(); 2898 2899 StringExtractorGDBRemote response; 2900 if (SendPacketAndWaitForResponse(packet, packet_len, response, false) == PacketResult::Success) 2901 { 2902 if (response.IsOKResponse()) 2903 return true; 2904 } 2905 return false; 2906 } 2907 2908 bool 2909 GDBRemoteCommunicationClient::SetCurrentThread (uint64_t tid) 2910 { 2911 if (m_curr_tid == tid) 2912 return true; 2913 2914 char packet[32]; 2915 int packet_len; 2916 if (tid == UINT64_MAX) 2917 packet_len = ::snprintf (packet, sizeof(packet), "Hg-1"); 2918 else 2919 packet_len = ::snprintf (packet, sizeof(packet), "Hg%" PRIx64, tid); 2920 assert (packet_len + 1 < (int)sizeof(packet)); 2921 StringExtractorGDBRemote response; 2922 if (SendPacketAndWaitForResponse(packet, packet_len, response, false) == PacketResult::Success) 2923 { 2924 if (response.IsOKResponse()) 2925 { 2926 m_curr_tid = tid; 2927 return true; 2928 } 2929 } 2930 return false; 2931 } 2932 2933 bool 2934 GDBRemoteCommunicationClient::SetCurrentThreadForRun (uint64_t tid) 2935 { 2936 if (m_curr_tid_run == tid) 2937 return true; 2938 2939 char packet[32]; 2940 int packet_len; 2941 if (tid == UINT64_MAX) 2942 packet_len = ::snprintf (packet, sizeof(packet), "Hc-1"); 2943 else 2944 packet_len = ::snprintf (packet, sizeof(packet), "Hc%" PRIx64, tid); 2945 2946 assert (packet_len + 1 < (int)sizeof(packet)); 2947 StringExtractorGDBRemote response; 2948 if (SendPacketAndWaitForResponse(packet, packet_len, response, false) == PacketResult::Success) 2949 { 2950 if (response.IsOKResponse()) 2951 { 2952 m_curr_tid_run = tid; 2953 return true; 2954 } 2955 } 2956 return false; 2957 } 2958 2959 bool 2960 GDBRemoteCommunicationClient::GetStopReply (StringExtractorGDBRemote &response) 2961 { 2962 if (SendPacketAndWaitForResponse("?", 1, response, false) == PacketResult::Success) 2963 return response.IsNormalResponse(); 2964 return false; 2965 } 2966 2967 bool 2968 GDBRemoteCommunicationClient::GetThreadStopInfo (lldb::tid_t tid, StringExtractorGDBRemote &response) 2969 { 2970 if (m_supports_qThreadStopInfo) 2971 { 2972 char packet[256]; 2973 int packet_len = ::snprintf(packet, sizeof(packet), "qThreadStopInfo%" PRIx64, tid); 2974 assert (packet_len < (int)sizeof(packet)); 2975 if (SendPacketAndWaitForResponse(packet, packet_len, response, false) == PacketResult::Success) 2976 { 2977 if (response.IsUnsupportedResponse()) 2978 m_supports_qThreadStopInfo = false; 2979 else if (response.IsNormalResponse()) 2980 return true; 2981 else 2982 return false; 2983 } 2984 else 2985 { 2986 m_supports_qThreadStopInfo = false; 2987 } 2988 } 2989 return false; 2990 } 2991 2992 2993 uint8_t 2994 GDBRemoteCommunicationClient::SendGDBStoppointTypePacket (GDBStoppointType type, bool insert, addr_t addr, uint32_t length) 2995 { 2996 Log *log (GetLogIfAnyCategoriesSet (LIBLLDB_LOG_BREAKPOINTS)); 2997 if (log) 2998 log->Printf ("GDBRemoteCommunicationClient::%s() %s at addr = 0x%" PRIx64, 2999 __FUNCTION__, insert ? "add" : "remove", addr); 3000 3001 // Check if the stub is known not to support this breakpoint type 3002 if (!SupportsGDBStoppointPacket(type)) 3003 return UINT8_MAX; 3004 // Construct the breakpoint packet 3005 char packet[64]; 3006 const int packet_len = ::snprintf (packet, 3007 sizeof(packet), 3008 "%c%i,%" PRIx64 ",%x", 3009 insert ? 'Z' : 'z', 3010 type, 3011 addr, 3012 length); 3013 // Check we haven't overwritten the end of the packet buffer 3014 assert (packet_len + 1 < (int)sizeof(packet)); 3015 StringExtractorGDBRemote response; 3016 // Try to send the breakpoint packet, and check that it was correctly sent 3017 if (SendPacketAndWaitForResponse(packet, packet_len, response, true) == PacketResult::Success) 3018 { 3019 // Receive and OK packet when the breakpoint successfully placed 3020 if (response.IsOKResponse()) 3021 return 0; 3022 3023 // Error while setting breakpoint, send back specific error 3024 if (response.IsErrorResponse()) 3025 return response.GetError(); 3026 3027 // Empty packet informs us that breakpoint is not supported 3028 if (response.IsUnsupportedResponse()) 3029 { 3030 // Disable this breakpoint type since it is unsupported 3031 switch (type) 3032 { 3033 case eBreakpointSoftware: m_supports_z0 = false; break; 3034 case eBreakpointHardware: m_supports_z1 = false; break; 3035 case eWatchpointWrite: m_supports_z2 = false; break; 3036 case eWatchpointRead: m_supports_z3 = false; break; 3037 case eWatchpointReadWrite: m_supports_z4 = false; break; 3038 case eStoppointInvalid: return UINT8_MAX; 3039 } 3040 } 3041 } 3042 // Signal generic failure 3043 return UINT8_MAX; 3044 } 3045 3046 size_t 3047 GDBRemoteCommunicationClient::GetCurrentThreadIDs (std::vector<lldb::tid_t> &thread_ids, 3048 bool &sequence_mutex_unavailable) 3049 { 3050 Mutex::Locker locker; 3051 thread_ids.clear(); 3052 3053 if (GetSequenceMutex (locker, "ProcessGDBRemote::UpdateThreadList() failed due to not getting the sequence mutex")) 3054 { 3055 sequence_mutex_unavailable = false; 3056 StringExtractorGDBRemote response; 3057 3058 PacketResult packet_result; 3059 for (packet_result = SendPacketAndWaitForResponseNoLock ("qfThreadInfo", strlen("qfThreadInfo"), response); 3060 packet_result == PacketResult::Success && response.IsNormalResponse(); 3061 packet_result = SendPacketAndWaitForResponseNoLock ("qsThreadInfo", strlen("qsThreadInfo"), response)) 3062 { 3063 char ch = response.GetChar(); 3064 if (ch == 'l') 3065 break; 3066 if (ch == 'm') 3067 { 3068 do 3069 { 3070 tid_t tid = response.GetHexMaxU64(false, LLDB_INVALID_THREAD_ID); 3071 3072 if (tid != LLDB_INVALID_THREAD_ID) 3073 { 3074 thread_ids.push_back (tid); 3075 } 3076 ch = response.GetChar(); // Skip the command separator 3077 } while (ch == ','); // Make sure we got a comma separator 3078 } 3079 } 3080 } 3081 else 3082 { 3083 #if defined (LLDB_CONFIGURATION_DEBUG) 3084 // assert(!"ProcessGDBRemote::UpdateThreadList() failed due to not getting the sequence mutex"); 3085 #else 3086 Log *log (ProcessGDBRemoteLog::GetLogIfAnyCategoryIsSet (GDBR_LOG_PROCESS | GDBR_LOG_PACKETS)); 3087 if (log) 3088 log->Printf("error: failed to get packet sequence mutex, not sending packet 'qfThreadInfo'"); 3089 #endif 3090 sequence_mutex_unavailable = true; 3091 } 3092 return thread_ids.size(); 3093 } 3094 3095 lldb::addr_t 3096 GDBRemoteCommunicationClient::GetShlibInfoAddr() 3097 { 3098 if (!IsRunning()) 3099 { 3100 StringExtractorGDBRemote response; 3101 if (SendPacketAndWaitForResponse("qShlibInfoAddr", ::strlen ("qShlibInfoAddr"), response, false) == PacketResult::Success) 3102 { 3103 if (response.IsNormalResponse()) 3104 return response.GetHexMaxU64(false, LLDB_INVALID_ADDRESS); 3105 } 3106 } 3107 return LLDB_INVALID_ADDRESS; 3108 } 3109 3110 lldb_private::Error 3111 GDBRemoteCommunicationClient::RunShellCommand (const char *command, // Shouldn't be NULL 3112 const char *working_dir, // Pass NULL to use the current working directory 3113 int *status_ptr, // Pass NULL if you don't want the process exit status 3114 int *signo_ptr, // Pass NULL if you don't want the signal that caused the process to exit 3115 std::string *command_output, // Pass NULL if you don't want the command output 3116 uint32_t timeout_sec) // Timeout in seconds to wait for shell program to finish 3117 { 3118 lldb_private::StreamString stream; 3119 stream.PutCString("qPlatform_shell:"); 3120 stream.PutBytesAsRawHex8(command, strlen(command)); 3121 stream.PutChar(','); 3122 stream.PutHex32(timeout_sec); 3123 if (working_dir && *working_dir) 3124 { 3125 stream.PutChar(','); 3126 stream.PutBytesAsRawHex8(working_dir, strlen(working_dir)); 3127 } 3128 const char *packet = stream.GetData(); 3129 int packet_len = stream.GetSize(); 3130 StringExtractorGDBRemote response; 3131 if (SendPacketAndWaitForResponse(packet, packet_len, response, false) == PacketResult::Success) 3132 { 3133 if (response.GetChar() != 'F') 3134 return Error("malformed reply"); 3135 if (response.GetChar() != ',') 3136 return Error("malformed reply"); 3137 uint32_t exitcode = response.GetHexMaxU32(false, UINT32_MAX); 3138 if (exitcode == UINT32_MAX) 3139 return Error("unable to run remote process"); 3140 else if (status_ptr) 3141 *status_ptr = exitcode; 3142 if (response.GetChar() != ',') 3143 return Error("malformed reply"); 3144 uint32_t signo = response.GetHexMaxU32(false, UINT32_MAX); 3145 if (signo_ptr) 3146 *signo_ptr = signo; 3147 if (response.GetChar() != ',') 3148 return Error("malformed reply"); 3149 std::string output; 3150 response.GetEscapedBinaryData(output); 3151 if (command_output) 3152 command_output->assign(output); 3153 return Error(); 3154 } 3155 return Error("unable to send packet"); 3156 } 3157 3158 Error 3159 GDBRemoteCommunicationClient::MakeDirectory (const char *path, 3160 uint32_t file_permissions) 3161 { 3162 lldb_private::StreamString stream; 3163 stream.PutCString("qPlatform_mkdir:"); 3164 stream.PutHex32(file_permissions); 3165 stream.PutChar(','); 3166 stream.PutBytesAsRawHex8(path, strlen(path)); 3167 const char *packet = stream.GetData(); 3168 int packet_len = stream.GetSize(); 3169 StringExtractorGDBRemote response; 3170 3171 if (SendPacketAndWaitForResponse(packet, packet_len, response, false) != PacketResult::Success) 3172 return Error("failed to send '%s' packet", packet); 3173 3174 if (response.GetChar() != 'F') 3175 return Error("invalid response to '%s' packet", packet); 3176 3177 return Error(response.GetU32(UINT32_MAX), eErrorTypePOSIX); 3178 } 3179 3180 Error 3181 GDBRemoteCommunicationClient::SetFilePermissions (const char *path, 3182 uint32_t file_permissions) 3183 { 3184 lldb_private::StreamString stream; 3185 stream.PutCString("qPlatform_chmod:"); 3186 stream.PutHex32(file_permissions); 3187 stream.PutChar(','); 3188 stream.PutBytesAsRawHex8(path, strlen(path)); 3189 const char *packet = stream.GetData(); 3190 int packet_len = stream.GetSize(); 3191 StringExtractorGDBRemote response; 3192 3193 if (SendPacketAndWaitForResponse(packet, packet_len, response, false) != PacketResult::Success) 3194 return Error("failed to send '%s' packet", packet); 3195 3196 if (response.GetChar() != 'F') 3197 return Error("invalid response to '%s' packet", packet); 3198 3199 return Error(response.GetU32(false, UINT32_MAX), eErrorTypePOSIX); 3200 } 3201 3202 static uint64_t 3203 ParseHostIOPacketResponse (StringExtractorGDBRemote &response, 3204 uint64_t fail_result, 3205 Error &error) 3206 { 3207 response.SetFilePos(0); 3208 if (response.GetChar() != 'F') 3209 return fail_result; 3210 int32_t result = response.GetS32 (-2); 3211 if (result == -2) 3212 return fail_result; 3213 if (response.GetChar() == ',') 3214 { 3215 int result_errno = response.GetS32 (-2); 3216 if (result_errno != -2) 3217 error.SetError(result_errno, eErrorTypePOSIX); 3218 else 3219 error.SetError(-1, eErrorTypeGeneric); 3220 } 3221 else 3222 error.Clear(); 3223 return result; 3224 } 3225 lldb::user_id_t 3226 GDBRemoteCommunicationClient::OpenFile (const lldb_private::FileSpec& file_spec, 3227 uint32_t flags, 3228 mode_t mode, 3229 Error &error) 3230 { 3231 lldb_private::StreamString stream; 3232 stream.PutCString("vFile:open:"); 3233 std::string path (file_spec.GetPath()); 3234 if (path.empty()) 3235 return UINT64_MAX; 3236 stream.PutCStringAsRawHex8(path.c_str()); 3237 stream.PutChar(','); 3238 stream.PutHex32(flags); 3239 stream.PutChar(','); 3240 stream.PutHex32(mode); 3241 const char* packet = stream.GetData(); 3242 int packet_len = stream.GetSize(); 3243 StringExtractorGDBRemote response; 3244 if (SendPacketAndWaitForResponse(packet, packet_len, response, false) == PacketResult::Success) 3245 { 3246 return ParseHostIOPacketResponse (response, UINT64_MAX, error); 3247 } 3248 return UINT64_MAX; 3249 } 3250 3251 bool 3252 GDBRemoteCommunicationClient::CloseFile (lldb::user_id_t fd, 3253 Error &error) 3254 { 3255 lldb_private::StreamString stream; 3256 stream.Printf("vFile:close:%i", (int)fd); 3257 const char* packet = stream.GetData(); 3258 int packet_len = stream.GetSize(); 3259 StringExtractorGDBRemote response; 3260 if (SendPacketAndWaitForResponse(packet, packet_len, response, false) == PacketResult::Success) 3261 { 3262 return ParseHostIOPacketResponse (response, -1, error) == 0; 3263 } 3264 return false; 3265 } 3266 3267 // Extension of host I/O packets to get the file size. 3268 lldb::user_id_t 3269 GDBRemoteCommunicationClient::GetFileSize (const lldb_private::FileSpec& file_spec) 3270 { 3271 lldb_private::StreamString stream; 3272 stream.PutCString("vFile:size:"); 3273 std::string path (file_spec.GetPath()); 3274 stream.PutCStringAsRawHex8(path.c_str()); 3275 const char* packet = stream.GetData(); 3276 int packet_len = stream.GetSize(); 3277 StringExtractorGDBRemote response; 3278 if (SendPacketAndWaitForResponse(packet, packet_len, response, false) == PacketResult::Success) 3279 { 3280 if (response.GetChar() != 'F') 3281 return UINT64_MAX; 3282 uint32_t retcode = response.GetHexMaxU64(false, UINT64_MAX); 3283 return retcode; 3284 } 3285 return UINT64_MAX; 3286 } 3287 3288 Error 3289 GDBRemoteCommunicationClient::GetFilePermissions(const char *path, uint32_t &file_permissions) 3290 { 3291 Error error; 3292 lldb_private::StreamString stream; 3293 stream.PutCString("vFile:mode:"); 3294 stream.PutCStringAsRawHex8(path); 3295 const char* packet = stream.GetData(); 3296 int packet_len = stream.GetSize(); 3297 StringExtractorGDBRemote response; 3298 if (SendPacketAndWaitForResponse(packet, packet_len, response, false) == PacketResult::Success) 3299 { 3300 if (response.GetChar() != 'F') 3301 { 3302 error.SetErrorStringWithFormat ("invalid response to '%s' packet", packet); 3303 } 3304 else 3305 { 3306 const uint32_t mode = response.GetS32(-1); 3307 if (static_cast<int32_t>(mode) == -1) 3308 { 3309 if (response.GetChar() == ',') 3310 { 3311 int response_errno = response.GetS32(-1); 3312 if (response_errno > 0) 3313 error.SetError(response_errno, lldb::eErrorTypePOSIX); 3314 else 3315 error.SetErrorToGenericError(); 3316 } 3317 else 3318 error.SetErrorToGenericError(); 3319 } 3320 else 3321 { 3322 file_permissions = mode & (S_IRWXU|S_IRWXG|S_IRWXO); 3323 } 3324 } 3325 } 3326 else 3327 { 3328 error.SetErrorStringWithFormat ("failed to send '%s' packet", packet); 3329 } 3330 return error; 3331 } 3332 3333 uint64_t 3334 GDBRemoteCommunicationClient::ReadFile (lldb::user_id_t fd, 3335 uint64_t offset, 3336 void *dst, 3337 uint64_t dst_len, 3338 Error &error) 3339 { 3340 lldb_private::StreamString stream; 3341 stream.Printf("vFile:pread:%i,%" PRId64 ",%" PRId64, (int)fd, dst_len, offset); 3342 const char* packet = stream.GetData(); 3343 int packet_len = stream.GetSize(); 3344 StringExtractorGDBRemote response; 3345 if (SendPacketAndWaitForResponse(packet, packet_len, response, false) == PacketResult::Success) 3346 { 3347 if (response.GetChar() != 'F') 3348 return 0; 3349 uint32_t retcode = response.GetHexMaxU32(false, UINT32_MAX); 3350 if (retcode == UINT32_MAX) 3351 return retcode; 3352 const char next = (response.Peek() ? *response.Peek() : 0); 3353 if (next == ',') 3354 return 0; 3355 if (next == ';') 3356 { 3357 response.GetChar(); // skip the semicolon 3358 std::string buffer; 3359 if (response.GetEscapedBinaryData(buffer)) 3360 { 3361 const uint64_t data_to_write = std::min<uint64_t>(dst_len, buffer.size()); 3362 if (data_to_write > 0) 3363 memcpy(dst, &buffer[0], data_to_write); 3364 return data_to_write; 3365 } 3366 } 3367 } 3368 return 0; 3369 } 3370 3371 uint64_t 3372 GDBRemoteCommunicationClient::WriteFile (lldb::user_id_t fd, 3373 uint64_t offset, 3374 const void* src, 3375 uint64_t src_len, 3376 Error &error) 3377 { 3378 lldb_private::StreamGDBRemote stream; 3379 stream.Printf("vFile:pwrite:%i,%" PRId64 ",", (int)fd, offset); 3380 stream.PutEscapedBytes(src, src_len); 3381 const char* packet = stream.GetData(); 3382 int packet_len = stream.GetSize(); 3383 StringExtractorGDBRemote response; 3384 if (SendPacketAndWaitForResponse(packet, packet_len, response, false) == PacketResult::Success) 3385 { 3386 if (response.GetChar() != 'F') 3387 { 3388 error.SetErrorStringWithFormat("write file failed"); 3389 return 0; 3390 } 3391 uint64_t bytes_written = response.GetU64(UINT64_MAX); 3392 if (bytes_written == UINT64_MAX) 3393 { 3394 error.SetErrorToGenericError(); 3395 if (response.GetChar() == ',') 3396 { 3397 int response_errno = response.GetS32(-1); 3398 if (response_errno > 0) 3399 error.SetError(response_errno, lldb::eErrorTypePOSIX); 3400 } 3401 return 0; 3402 } 3403 return bytes_written; 3404 } 3405 else 3406 { 3407 error.SetErrorString ("failed to send vFile:pwrite packet"); 3408 } 3409 return 0; 3410 } 3411 3412 Error 3413 GDBRemoteCommunicationClient::CreateSymlink (const char *src, const char *dst) 3414 { 3415 Error error; 3416 lldb_private::StreamGDBRemote stream; 3417 stream.PutCString("vFile:symlink:"); 3418 // the unix symlink() command reverses its parameters where the dst if first, 3419 // so we follow suit here 3420 stream.PutCStringAsRawHex8(dst); 3421 stream.PutChar(','); 3422 stream.PutCStringAsRawHex8(src); 3423 const char* packet = stream.GetData(); 3424 int packet_len = stream.GetSize(); 3425 StringExtractorGDBRemote response; 3426 if (SendPacketAndWaitForResponse(packet, packet_len, response, false) == PacketResult::Success) 3427 { 3428 if (response.GetChar() == 'F') 3429 { 3430 uint32_t result = response.GetU32(UINT32_MAX); 3431 if (result != 0) 3432 { 3433 error.SetErrorToGenericError(); 3434 if (response.GetChar() == ',') 3435 { 3436 int response_errno = response.GetS32(-1); 3437 if (response_errno > 0) 3438 error.SetError(response_errno, lldb::eErrorTypePOSIX); 3439 } 3440 } 3441 } 3442 else 3443 { 3444 // Should have returned with 'F<result>[,<errno>]' 3445 error.SetErrorStringWithFormat("symlink failed"); 3446 } 3447 } 3448 else 3449 { 3450 error.SetErrorString ("failed to send vFile:symlink packet"); 3451 } 3452 return error; 3453 } 3454 3455 Error 3456 GDBRemoteCommunicationClient::Unlink (const char *path) 3457 { 3458 Error error; 3459 lldb_private::StreamGDBRemote stream; 3460 stream.PutCString("vFile:unlink:"); 3461 // the unix symlink() command reverses its parameters where the dst if first, 3462 // so we follow suit here 3463 stream.PutCStringAsRawHex8(path); 3464 const char* packet = stream.GetData(); 3465 int packet_len = stream.GetSize(); 3466 StringExtractorGDBRemote response; 3467 if (SendPacketAndWaitForResponse(packet, packet_len, response, false) == PacketResult::Success) 3468 { 3469 if (response.GetChar() == 'F') 3470 { 3471 uint32_t result = response.GetU32(UINT32_MAX); 3472 if (result != 0) 3473 { 3474 error.SetErrorToGenericError(); 3475 if (response.GetChar() == ',') 3476 { 3477 int response_errno = response.GetS32(-1); 3478 if (response_errno > 0) 3479 error.SetError(response_errno, lldb::eErrorTypePOSIX); 3480 } 3481 } 3482 } 3483 else 3484 { 3485 // Should have returned with 'F<result>[,<errno>]' 3486 error.SetErrorStringWithFormat("unlink failed"); 3487 } 3488 } 3489 else 3490 { 3491 error.SetErrorString ("failed to send vFile:unlink packet"); 3492 } 3493 return error; 3494 } 3495 3496 // Extension of host I/O packets to get whether a file exists. 3497 bool 3498 GDBRemoteCommunicationClient::GetFileExists (const lldb_private::FileSpec& file_spec) 3499 { 3500 lldb_private::StreamString stream; 3501 stream.PutCString("vFile:exists:"); 3502 std::string path (file_spec.GetPath()); 3503 stream.PutCStringAsRawHex8(path.c_str()); 3504 const char* packet = stream.GetData(); 3505 int packet_len = stream.GetSize(); 3506 StringExtractorGDBRemote response; 3507 if (SendPacketAndWaitForResponse(packet, packet_len, response, false) == PacketResult::Success) 3508 { 3509 if (response.GetChar() != 'F') 3510 return false; 3511 if (response.GetChar() != ',') 3512 return false; 3513 bool retcode = (response.GetChar() != '0'); 3514 return retcode; 3515 } 3516 return false; 3517 } 3518 3519 bool 3520 GDBRemoteCommunicationClient::CalculateMD5 (const lldb_private::FileSpec& file_spec, 3521 uint64_t &high, 3522 uint64_t &low) 3523 { 3524 lldb_private::StreamString stream; 3525 stream.PutCString("vFile:MD5:"); 3526 std::string path (file_spec.GetPath()); 3527 stream.PutCStringAsRawHex8(path.c_str()); 3528 const char* packet = stream.GetData(); 3529 int packet_len = stream.GetSize(); 3530 StringExtractorGDBRemote response; 3531 if (SendPacketAndWaitForResponse(packet, packet_len, response, false) == PacketResult::Success) 3532 { 3533 if (response.GetChar() != 'F') 3534 return false; 3535 if (response.GetChar() != ',') 3536 return false; 3537 if (response.Peek() && *response.Peek() == 'x') 3538 return false; 3539 low = response.GetHexMaxU64(false, UINT64_MAX); 3540 high = response.GetHexMaxU64(false, UINT64_MAX); 3541 return true; 3542 } 3543 return false; 3544 } 3545 3546 bool 3547 GDBRemoteCommunicationClient::AvoidGPackets (ProcessGDBRemote *process) 3548 { 3549 // Some targets have issues with g/G packets and we need to avoid using them 3550 if (m_avoid_g_packets == eLazyBoolCalculate) 3551 { 3552 if (process) 3553 { 3554 m_avoid_g_packets = eLazyBoolNo; 3555 const ArchSpec &arch = process->GetTarget().GetArchitecture(); 3556 if (arch.IsValid() 3557 && arch.GetTriple().getVendor() == llvm::Triple::Apple 3558 && arch.GetTriple().getOS() == llvm::Triple::IOS 3559 && arch.GetTriple().getArch() == llvm::Triple::aarch64) 3560 { 3561 m_avoid_g_packets = eLazyBoolYes; 3562 uint32_t gdb_server_version = GetGDBServerProgramVersion(); 3563 if (gdb_server_version != 0) 3564 { 3565 const char *gdb_server_name = GetGDBServerProgramName(); 3566 if (gdb_server_name && strcmp(gdb_server_name, "debugserver") == 0) 3567 { 3568 if (gdb_server_version >= 310) 3569 m_avoid_g_packets = eLazyBoolNo; 3570 } 3571 } 3572 } 3573 } 3574 } 3575 return m_avoid_g_packets == eLazyBoolYes; 3576 } 3577 3578 bool 3579 GDBRemoteCommunicationClient::ReadRegister(lldb::tid_t tid, uint32_t reg, StringExtractorGDBRemote &response) 3580 { 3581 Mutex::Locker locker; 3582 if (GetSequenceMutex (locker, "Didn't get sequence mutex for p packet.")) 3583 { 3584 const bool thread_suffix_supported = GetThreadSuffixSupported(); 3585 3586 if (thread_suffix_supported || SetCurrentThread(tid)) 3587 { 3588 char packet[64]; 3589 int packet_len = 0; 3590 if (thread_suffix_supported) 3591 packet_len = ::snprintf (packet, sizeof(packet), "p%x;thread:%4.4" PRIx64 ";", reg, tid); 3592 else 3593 packet_len = ::snprintf (packet, sizeof(packet), "p%x", reg); 3594 assert (packet_len < ((int)sizeof(packet) - 1)); 3595 return SendPacketAndWaitForResponse(packet, response, false) == PacketResult::Success; 3596 } 3597 } 3598 return false; 3599 3600 } 3601 3602 3603 bool 3604 GDBRemoteCommunicationClient::ReadAllRegisters (lldb::tid_t tid, StringExtractorGDBRemote &response) 3605 { 3606 Mutex::Locker locker; 3607 if (GetSequenceMutex (locker, "Didn't get sequence mutex for g packet.")) 3608 { 3609 const bool thread_suffix_supported = GetThreadSuffixSupported(); 3610 3611 if (thread_suffix_supported || SetCurrentThread(tid)) 3612 { 3613 char packet[64]; 3614 int packet_len = 0; 3615 // Get all registers in one packet 3616 if (thread_suffix_supported) 3617 packet_len = ::snprintf (packet, sizeof(packet), "g;thread:%4.4" PRIx64 ";", tid); 3618 else 3619 packet_len = ::snprintf (packet, sizeof(packet), "g"); 3620 assert (packet_len < ((int)sizeof(packet) - 1)); 3621 return SendPacketAndWaitForResponse(packet, response, false) == PacketResult::Success; 3622 } 3623 } 3624 return false; 3625 } 3626 bool 3627 GDBRemoteCommunicationClient::SaveRegisterState (lldb::tid_t tid, uint32_t &save_id) 3628 { 3629 save_id = 0; // Set to invalid save ID 3630 if (m_supports_QSaveRegisterState == eLazyBoolNo) 3631 return false; 3632 3633 m_supports_QSaveRegisterState = eLazyBoolYes; 3634 Mutex::Locker locker; 3635 if (GetSequenceMutex (locker, "Didn't get sequence mutex for QSaveRegisterState.")) 3636 { 3637 const bool thread_suffix_supported = GetThreadSuffixSupported(); 3638 if (thread_suffix_supported || SetCurrentThread(tid)) 3639 { 3640 char packet[256]; 3641 if (thread_suffix_supported) 3642 ::snprintf (packet, sizeof(packet), "QSaveRegisterState;thread:%4.4" PRIx64 ";", tid); 3643 else 3644 ::snprintf(packet, sizeof(packet), "QSaveRegisterState"); 3645 3646 StringExtractorGDBRemote response; 3647 3648 if (SendPacketAndWaitForResponse(packet, response, false) == PacketResult::Success) 3649 { 3650 if (response.IsUnsupportedResponse()) 3651 { 3652 // This packet isn't supported, don't try calling it again 3653 m_supports_QSaveRegisterState = eLazyBoolNo; 3654 } 3655 3656 const uint32_t response_save_id = response.GetU32(0); 3657 if (response_save_id != 0) 3658 { 3659 save_id = response_save_id; 3660 return true; 3661 } 3662 } 3663 } 3664 } 3665 return false; 3666 } 3667 3668 bool 3669 GDBRemoteCommunicationClient::RestoreRegisterState (lldb::tid_t tid, uint32_t save_id) 3670 { 3671 // We use the "m_supports_QSaveRegisterState" variable here because the 3672 // QSaveRegisterState and QRestoreRegisterState packets must both be supported in 3673 // order to be useful 3674 if (m_supports_QSaveRegisterState == eLazyBoolNo) 3675 return false; 3676 3677 Mutex::Locker locker; 3678 if (GetSequenceMutex (locker, "Didn't get sequence mutex for QRestoreRegisterState.")) 3679 { 3680 const bool thread_suffix_supported = GetThreadSuffixSupported(); 3681 if (thread_suffix_supported || SetCurrentThread(tid)) 3682 { 3683 char packet[256]; 3684 if (thread_suffix_supported) 3685 ::snprintf (packet, sizeof(packet), "QRestoreRegisterState:%u;thread:%4.4" PRIx64 ";", save_id, tid); 3686 else 3687 ::snprintf (packet, sizeof(packet), "QRestoreRegisterState:%u" PRIx64 ";", save_id); 3688 3689 StringExtractorGDBRemote response; 3690 3691 if (SendPacketAndWaitForResponse(packet, response, false) == PacketResult::Success) 3692 { 3693 if (response.IsOKResponse()) 3694 { 3695 return true; 3696 } 3697 else if (response.IsUnsupportedResponse()) 3698 { 3699 // This packet isn't supported, don't try calling this packet or 3700 // QSaveRegisterState again... 3701 m_supports_QSaveRegisterState = eLazyBoolNo; 3702 } 3703 } 3704 } 3705 } 3706 return false; 3707 } 3708 3709 bool 3710 GDBRemoteCommunicationClient::GetModuleInfo (const FileSpec& module_file_spec, 3711 const lldb_private::ArchSpec& arch_spec, 3712 ModuleSpec &module_spec) 3713 { 3714 std::string module_path = module_file_spec.GetPath (); 3715 if (module_path.empty ()) 3716 return false; 3717 3718 StreamString packet; 3719 packet.PutCString("qModuleInfo:"); 3720 packet.PutCStringAsRawHex8(module_path.c_str()); 3721 packet.PutCString(";"); 3722 const auto& tripple = arch_spec.GetTriple().getTriple(); 3723 packet.PutBytesAsRawHex8(tripple.c_str(), tripple.size()); 3724 3725 StringExtractorGDBRemote response; 3726 if (SendPacketAndWaitForResponse (packet.GetData(), packet.GetSize(), response, false) != PacketResult::Success) 3727 return false; 3728 3729 if (response.IsErrorResponse ()) 3730 return false; 3731 3732 std::string name; 3733 std::string value; 3734 bool success; 3735 StringExtractor extractor; 3736 3737 module_spec.Clear (); 3738 module_spec.GetFileSpec () = module_file_spec; 3739 3740 while (response.GetNameColonValue (name, value)) 3741 { 3742 if (name == "uuid" || name == "md5") 3743 { 3744 extractor.GetStringRef ().swap (value); 3745 extractor.SetFilePos (0); 3746 extractor.GetHexByteString (value); 3747 module_spec.GetUUID().SetFromCString (value.c_str(), value.size() / 2); 3748 } 3749 else if (name == "triple") 3750 { 3751 extractor.GetStringRef ().swap (value); 3752 extractor.SetFilePos (0); 3753 extractor.GetHexByteString (value); 3754 module_spec.GetArchitecture().SetTriple (value.c_str ()); 3755 } 3756 else if (name == "file_offset") 3757 { 3758 const auto ival = StringConvert::ToUInt64 (value.c_str (), 0, 16, &success); 3759 if (success) 3760 module_spec.SetObjectOffset (ival); 3761 } 3762 else if (name == "file_size") 3763 { 3764 const auto ival = StringConvert::ToUInt64 (value.c_str (), 0, 16, &success); 3765 if (success) 3766 module_spec.SetObjectSize (ival); 3767 } 3768 else if (name == "file_path") 3769 { 3770 extractor.GetStringRef ().swap (value); 3771 extractor.SetFilePos (0); 3772 extractor.GetHexByteString (value); 3773 module_spec.GetFileSpec () = FileSpec (value.c_str(), false); 3774 } 3775 } 3776 3777 return true; 3778 } 3779