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