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