ProcessGDBRemote.cpp revision 49ce8969d3154e1560106cfe530444c09410f217
1//===-- ProcessGDBRemote.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// C Includes 11#include <errno.h> 12#include <spawn.h> 13#include <stdlib.h> 14#include <netinet/in.h> 15#include <sys/mman.h> // for mmap 16#include <sys/stat.h> 17#include <sys/types.h> 18#include <time.h> 19 20// C++ Includes 21#include <algorithm> 22#include <map> 23 24// Other libraries and framework includes 25 26#include "lldb/Breakpoint/Watchpoint.h" 27#include "lldb/Interpreter/Args.h" 28#include "lldb/Core/ArchSpec.h" 29#include "lldb/Core/Debugger.h" 30#include "lldb/Core/ConnectionFileDescriptor.h" 31#include "lldb/Host/FileSpec.h" 32#include "lldb/Core/InputReader.h" 33#include "lldb/Core/Module.h" 34#include "lldb/Core/ModuleSpec.h" 35#include "lldb/Core/PluginManager.h" 36#include "lldb/Core/State.h" 37#include "lldb/Core/StreamFile.h" 38#include "lldb/Core/StreamString.h" 39#include "lldb/Core/Timer.h" 40#include "lldb/Core/Value.h" 41#include "lldb/Host/TimeValue.h" 42#include "lldb/Symbol/ObjectFile.h" 43#include "lldb/Target/DynamicLoader.h" 44#include "lldb/Target/Target.h" 45#include "lldb/Target/TargetList.h" 46#include "lldb/Target/ThreadPlanCallFunction.h" 47#include "lldb/Utility/PseudoTerminal.h" 48 49// Project includes 50#include "lldb/Host/Host.h" 51#include "Plugins/Process/Utility/InferiorCallPOSIX.h" 52#include "Plugins/Process/Utility/StopInfoMachException.h" 53#include "Plugins/Platform/MacOSX/PlatformRemoteiOS.h" 54#include "Utility/StringExtractorGDBRemote.h" 55#include "GDBRemoteRegisterContext.h" 56#include "ProcessGDBRemote.h" 57#include "ProcessGDBRemoteLog.h" 58#include "ThreadGDBRemote.h" 59 60namespace lldb 61{ 62 // Provide a function that can easily dump the packet history if we know a 63 // ProcessGDBRemote * value (which we can get from logs or from debugging). 64 // We need the function in the lldb namespace so it makes it into the final 65 // executable since the LLDB shared library only exports stuff in the lldb 66 // namespace. This allows you to attach with a debugger and call this 67 // function and get the packet history dumped to a file. 68 void 69 DumpProcessGDBRemotePacketHistory (void *p, const char *path) 70 { 71 lldb_private::StreamFile strm; 72 lldb_private::Error error (strm.GetFile().Open(path, lldb_private::File::eOpenOptionWrite | lldb_private::File::eOpenOptionCanCreate)); 73 if (error.Success()) 74 ((ProcessGDBRemote *)p)->GetGDBRemote().DumpHistory (strm); 75 } 76} 77 78 79#define DEBUGSERVER_BASENAME "debugserver" 80using namespace lldb; 81using namespace lldb_private; 82 83static bool rand_initialized = false; 84 85// TODO Randomly assigning a port is unsafe. We should get an unused 86// ephemeral port from the kernel and make sure we reserve it before passing 87// it to debugserver. 88 89#if defined (__APPLE__) 90#define LOW_PORT (IPPORT_RESERVED) 91#define HIGH_PORT (IPPORT_HIFIRSTAUTO) 92#else 93#define LOW_PORT (1024u) 94#define HIGH_PORT (49151u) 95#endif 96 97static inline uint16_t 98get_random_port () 99{ 100 if (!rand_initialized) 101 { 102 time_t seed = time(NULL); 103 104 rand_initialized = true; 105 srand(seed); 106 } 107 return (rand() % (HIGH_PORT - LOW_PORT)) + LOW_PORT; 108} 109 110 111const char * 112ProcessGDBRemote::GetPluginNameStatic() 113{ 114 return "gdb-remote"; 115} 116 117const char * 118ProcessGDBRemote::GetPluginDescriptionStatic() 119{ 120 return "GDB Remote protocol based debugging plug-in."; 121} 122 123void 124ProcessGDBRemote::Terminate() 125{ 126 PluginManager::UnregisterPlugin (ProcessGDBRemote::CreateInstance); 127} 128 129 130lldb::ProcessSP 131ProcessGDBRemote::CreateInstance (Target &target, Listener &listener, const FileSpec *crash_file_path) 132{ 133 lldb::ProcessSP process_sp; 134 if (crash_file_path == NULL) 135 process_sp.reset (new ProcessGDBRemote (target, listener)); 136 return process_sp; 137} 138 139bool 140ProcessGDBRemote::CanDebug (Target &target, bool plugin_specified_by_name) 141{ 142 if (plugin_specified_by_name) 143 return true; 144 145 // For now we are just making sure the file exists for a given module 146 Module *exe_module = target.GetExecutableModulePointer(); 147 if (exe_module) 148 { 149 ObjectFile *exe_objfile = exe_module->GetObjectFile(); 150 // We can't debug core files... 151 switch (exe_objfile->GetType()) 152 { 153 case ObjectFile::eTypeInvalid: 154 case ObjectFile::eTypeCoreFile: 155 case ObjectFile::eTypeDebugInfo: 156 case ObjectFile::eTypeObjectFile: 157 case ObjectFile::eTypeSharedLibrary: 158 case ObjectFile::eTypeStubLibrary: 159 return false; 160 case ObjectFile::eTypeExecutable: 161 case ObjectFile::eTypeDynamicLinker: 162 case ObjectFile::eTypeUnknown: 163 break; 164 } 165 return exe_module->GetFileSpec().Exists(); 166 } 167 // However, if there is no executable module, we return true since we might be preparing to attach. 168 return true; 169} 170 171//---------------------------------------------------------------------- 172// ProcessGDBRemote constructor 173//---------------------------------------------------------------------- 174ProcessGDBRemote::ProcessGDBRemote(Target& target, Listener &listener) : 175 Process (target, listener), 176 m_flags (0), 177 m_gdb_comm(false), 178 m_debugserver_pid (LLDB_INVALID_PROCESS_ID), 179 m_last_stop_packet (), 180 m_last_stop_packet_mutex (Mutex::eMutexTypeNormal), 181 m_register_info (), 182 m_async_broadcaster (NULL, "lldb.process.gdb-remote.async-broadcaster"), 183 m_async_thread (LLDB_INVALID_HOST_THREAD), 184 m_thread_ids (), 185 m_continue_c_tids (), 186 m_continue_C_tids (), 187 m_continue_s_tids (), 188 m_continue_S_tids (), 189 m_dispatch_queue_offsets_addr (LLDB_INVALID_ADDRESS), 190 m_max_memory_size (512), 191 m_addr_to_mmap_size (), 192 m_thread_create_bp_sp (), 193 m_waiting_for_attach (false), 194 m_destroy_tried_resuming (false) 195{ 196 m_async_broadcaster.SetEventName (eBroadcastBitAsyncThreadShouldExit, "async thread should exit"); 197 m_async_broadcaster.SetEventName (eBroadcastBitAsyncContinue, "async thread continue"); 198 m_async_broadcaster.SetEventName (eBroadcastBitAsyncThreadDidExit, "async thread did exit"); 199} 200 201//---------------------------------------------------------------------- 202// Destructor 203//---------------------------------------------------------------------- 204ProcessGDBRemote::~ProcessGDBRemote() 205{ 206 // m_mach_process.UnregisterNotificationCallbacks (this); 207 Clear(); 208 // We need to call finalize on the process before destroying ourselves 209 // to make sure all of the broadcaster cleanup goes as planned. If we 210 // destruct this class, then Process::~Process() might have problems 211 // trying to fully destroy the broadcaster. 212 Finalize(); 213} 214 215//---------------------------------------------------------------------- 216// PluginInterface 217//---------------------------------------------------------------------- 218const char * 219ProcessGDBRemote::GetPluginName() 220{ 221 return "Process debugging plug-in that uses the GDB remote protocol"; 222} 223 224const char * 225ProcessGDBRemote::GetShortPluginName() 226{ 227 return GetPluginNameStatic(); 228} 229 230uint32_t 231ProcessGDBRemote::GetPluginVersion() 232{ 233 return 1; 234} 235 236void 237ProcessGDBRemote::BuildDynamicRegisterInfo (bool force) 238{ 239 if (!force && m_register_info.GetNumRegisters() > 0) 240 return; 241 242 char packet[128]; 243 m_register_info.Clear(); 244 uint32_t reg_offset = 0; 245 uint32_t reg_num = 0; 246 for (StringExtractorGDBRemote::ResponseType response_type = StringExtractorGDBRemote::eResponse; 247 response_type == StringExtractorGDBRemote::eResponse; 248 ++reg_num) 249 { 250 const int packet_len = ::snprintf (packet, sizeof(packet), "qRegisterInfo%x", reg_num); 251 assert (packet_len < sizeof(packet)); 252 StringExtractorGDBRemote response; 253 if (m_gdb_comm.SendPacketAndWaitForResponse(packet, packet_len, response, false)) 254 { 255 response_type = response.GetResponseType(); 256 if (response_type == StringExtractorGDBRemote::eResponse) 257 { 258 std::string name; 259 std::string value; 260 ConstString reg_name; 261 ConstString alt_name; 262 ConstString set_name; 263 RegisterInfo reg_info = { NULL, // Name 264 NULL, // Alt name 265 0, // byte size 266 reg_offset, // offset 267 eEncodingUint, // encoding 268 eFormatHex, // formate 269 { 270 LLDB_INVALID_REGNUM, // GCC reg num 271 LLDB_INVALID_REGNUM, // DWARF reg num 272 LLDB_INVALID_REGNUM, // generic reg num 273 reg_num, // GDB reg num 274 reg_num // native register number 275 }, 276 NULL, 277 NULL 278 }; 279 280 while (response.GetNameColonValue(name, value)) 281 { 282 if (name.compare("name") == 0) 283 { 284 reg_name.SetCString(value.c_str()); 285 } 286 else if (name.compare("alt-name") == 0) 287 { 288 alt_name.SetCString(value.c_str()); 289 } 290 else if (name.compare("bitsize") == 0) 291 { 292 reg_info.byte_size = Args::StringToUInt32(value.c_str(), 0, 0) / CHAR_BIT; 293 } 294 else if (name.compare("offset") == 0) 295 { 296 uint32_t offset = Args::StringToUInt32(value.c_str(), UINT32_MAX, 0); 297 if (reg_offset != offset) 298 { 299 reg_offset = offset; 300 } 301 } 302 else if (name.compare("encoding") == 0) 303 { 304 const Encoding encoding = Args::StringToEncoding (value.c_str()); 305 if (encoding != eEncodingInvalid) 306 reg_info.encoding = encoding; 307 } 308 else if (name.compare("format") == 0) 309 { 310 Format format = eFormatInvalid; 311 if (Args::StringToFormat (value.c_str(), format, NULL).Success()) 312 reg_info.format = format; 313 else if (value.compare("binary") == 0) 314 reg_info.format = eFormatBinary; 315 else if (value.compare("decimal") == 0) 316 reg_info.format = eFormatDecimal; 317 else if (value.compare("hex") == 0) 318 reg_info.format = eFormatHex; 319 else if (value.compare("float") == 0) 320 reg_info.format = eFormatFloat; 321 else if (value.compare("vector-sint8") == 0) 322 reg_info.format = eFormatVectorOfSInt8; 323 else if (value.compare("vector-uint8") == 0) 324 reg_info.format = eFormatVectorOfUInt8; 325 else if (value.compare("vector-sint16") == 0) 326 reg_info.format = eFormatVectorOfSInt16; 327 else if (value.compare("vector-uint16") == 0) 328 reg_info.format = eFormatVectorOfUInt16; 329 else if (value.compare("vector-sint32") == 0) 330 reg_info.format = eFormatVectorOfSInt32; 331 else if (value.compare("vector-uint32") == 0) 332 reg_info.format = eFormatVectorOfUInt32; 333 else if (value.compare("vector-float32") == 0) 334 reg_info.format = eFormatVectorOfFloat32; 335 else if (value.compare("vector-uint128") == 0) 336 reg_info.format = eFormatVectorOfUInt128; 337 } 338 else if (name.compare("set") == 0) 339 { 340 set_name.SetCString(value.c_str()); 341 } 342 else if (name.compare("gcc") == 0) 343 { 344 reg_info.kinds[eRegisterKindGCC] = Args::StringToUInt32(value.c_str(), LLDB_INVALID_REGNUM, 0); 345 } 346 else if (name.compare("dwarf") == 0) 347 { 348 reg_info.kinds[eRegisterKindDWARF] = Args::StringToUInt32(value.c_str(), LLDB_INVALID_REGNUM, 0); 349 } 350 else if (name.compare("generic") == 0) 351 { 352 reg_info.kinds[eRegisterKindGeneric] = Args::StringToGenericRegister (value.c_str()); 353 } 354 } 355 356 reg_info.byte_offset = reg_offset; 357 assert (reg_info.byte_size != 0); 358 reg_offset += reg_info.byte_size; 359 m_register_info.AddRegister(reg_info, reg_name, alt_name, set_name); 360 } 361 } 362 else 363 { 364 break; 365 } 366 } 367 368 // We didn't get anything if the accumulated reg_num is zero. See if we are 369 // debugging ARM and fill with a hard coded register set until we can get an 370 // updated debugserver down on the devices. 371 // On the other hand, if the accumulated reg_num is positive, see if we can 372 // add composite registers to the existing primordial ones. 373 bool from_scratch = (reg_num == 0); 374 375 const ArchSpec &target_arch = GetTarget().GetArchitecture(); 376 const ArchSpec &remote_arch = m_gdb_comm.GetHostArchitecture(); 377 if (!target_arch.IsValid()) 378 { 379 if (remote_arch.IsValid() 380 && remote_arch.GetMachine() == llvm::Triple::arm 381 && remote_arch.GetTriple().getVendor() == llvm::Triple::Apple) 382 m_register_info.HardcodeARMRegisters(from_scratch); 383 } 384 else if (target_arch.GetMachine() == llvm::Triple::arm) 385 { 386 m_register_info.HardcodeARMRegisters(from_scratch); 387 } 388 389 // Add some convenience registers (eax, ebx, ecx, edx, esi, edi, ebp, esp) to x86_64. 390 if ((target_arch.IsValid() && target_arch.GetMachine() == llvm::Triple::x86_64) 391 || (remote_arch.IsValid() && remote_arch.GetMachine() == llvm::Triple::x86_64)) 392 m_register_info.Addx86_64ConvenienceRegisters(); 393 394 // At this point, we can finalize our register info. 395 m_register_info.Finalize (); 396} 397 398Error 399ProcessGDBRemote::WillLaunch (Module* module) 400{ 401 return WillLaunchOrAttach (); 402} 403 404Error 405ProcessGDBRemote::WillAttachToProcessWithID (lldb::pid_t pid) 406{ 407 return WillLaunchOrAttach (); 408} 409 410Error 411ProcessGDBRemote::WillAttachToProcessWithName (const char *process_name, bool wait_for_launch) 412{ 413 return WillLaunchOrAttach (); 414} 415 416Error 417ProcessGDBRemote::DoConnectRemote (const char *remote_url) 418{ 419 Error error (WillLaunchOrAttach ()); 420 421 if (error.Fail()) 422 return error; 423 424 error = ConnectToDebugserver (remote_url); 425 426 if (error.Fail()) 427 return error; 428 StartAsyncThread (); 429 430 lldb::pid_t pid = m_gdb_comm.GetCurrentProcessID (); 431 if (pid == LLDB_INVALID_PROCESS_ID) 432 { 433 // We don't have a valid process ID, so note that we are connected 434 // and could now request to launch or attach, or get remote process 435 // listings... 436 SetPrivateState (eStateConnected); 437 } 438 else 439 { 440 // We have a valid process 441 SetID (pid); 442 GetThreadList(); 443 if (m_gdb_comm.SendPacketAndWaitForResponse("?", 1, m_last_stop_packet, false)) 444 { 445 const StateType state = SetThreadStopInfo (m_last_stop_packet); 446 if (state == eStateStopped) 447 { 448 SetPrivateState (state); 449 } 450 else 451 error.SetErrorStringWithFormat ("Process %llu was reported after connecting to '%s', but state was not stopped: %s", pid, remote_url, StateAsCString (state)); 452 } 453 else 454 error.SetErrorStringWithFormat ("Process %llu was reported after connecting to '%s', but no stop reply packet was received", pid, remote_url); 455 } 456 457 if (error.Success() 458 && !GetTarget().GetArchitecture().IsValid() 459 && m_gdb_comm.GetHostArchitecture().IsValid()) 460 { 461 GetTarget().SetArchitecture(m_gdb_comm.GetHostArchitecture()); 462 } 463 464 return error; 465} 466 467Error 468ProcessGDBRemote::WillLaunchOrAttach () 469{ 470 Error error; 471 m_stdio_communication.Clear (); 472 return error; 473} 474 475//---------------------------------------------------------------------- 476// Process Control 477//---------------------------------------------------------------------- 478Error 479ProcessGDBRemote::DoLaunch (Module *exe_module, const ProcessLaunchInfo &launch_info) 480{ 481 Error error; 482 483 uint32_t launch_flags = launch_info.GetFlags().Get(); 484 const char *stdin_path = NULL; 485 const char *stdout_path = NULL; 486 const char *stderr_path = NULL; 487 const char *working_dir = launch_info.GetWorkingDirectory(); 488 489 const ProcessLaunchInfo::FileAction *file_action; 490 file_action = launch_info.GetFileActionForFD (STDIN_FILENO); 491 if (file_action) 492 { 493 if (file_action->GetAction () == ProcessLaunchInfo::FileAction::eFileActionOpen) 494 stdin_path = file_action->GetPath(); 495 } 496 file_action = launch_info.GetFileActionForFD (STDOUT_FILENO); 497 if (file_action) 498 { 499 if (file_action->GetAction () == ProcessLaunchInfo::FileAction::eFileActionOpen) 500 stdout_path = file_action->GetPath(); 501 } 502 file_action = launch_info.GetFileActionForFD (STDERR_FILENO); 503 if (file_action) 504 { 505 if (file_action->GetAction () == ProcessLaunchInfo::FileAction::eFileActionOpen) 506 stderr_path = file_action->GetPath(); 507 } 508 509 // ::LogSetBitMask (GDBR_LOG_DEFAULT); 510 // ::LogSetOptions (LLDB_LOG_OPTION_THREADSAFE | LLDB_LOG_OPTION_PREPEND_TIMESTAMP | LLDB_LOG_OPTION_PREPEND_PROC_AND_THREAD); 511 // ::LogSetLogFile ("/dev/stdout"); 512 LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PROCESS)); 513 514 ObjectFile * object_file = exe_module->GetObjectFile(); 515 if (object_file) 516 { 517 char host_port[128]; 518 snprintf (host_port, sizeof(host_port), "localhost:%u", get_random_port ()); 519 char connect_url[128]; 520 snprintf (connect_url, sizeof(connect_url), "connect://%s", host_port); 521 522 // Make sure we aren't already connected? 523 if (!m_gdb_comm.IsConnected()) 524 { 525 error = StartDebugserverProcess (host_port, launch_info); 526 if (error.Fail()) 527 { 528 if (log) 529 log->Printf("failed to start debugserver process: %s", error.AsCString()); 530 return error; 531 } 532 533 error = ConnectToDebugserver (connect_url); 534 } 535 536 if (error.Success()) 537 { 538 lldb_utility::PseudoTerminal pty; 539 const bool disable_stdio = (launch_flags & eLaunchFlagDisableSTDIO) != 0; 540 541 // If the debugserver is local and we aren't disabling STDIO, lets use 542 // a pseudo terminal to instead of relying on the 'O' packets for stdio 543 // since 'O' packets can really slow down debugging if the inferior 544 // does a lot of output. 545 PlatformSP platform_sp (m_target.GetPlatform()); 546 if (platform_sp && platform_sp->IsHost() && !disable_stdio) 547 { 548 const char *slave_name = NULL; 549 if (stdin_path == NULL || stdout_path == NULL || stderr_path == NULL) 550 { 551 if (pty.OpenFirstAvailableMaster(O_RDWR|O_NOCTTY, NULL, 0)) 552 slave_name = pty.GetSlaveName (NULL, 0); 553 } 554 if (stdin_path == NULL) 555 stdin_path = slave_name; 556 557 if (stdout_path == NULL) 558 stdout_path = slave_name; 559 560 if (stderr_path == NULL) 561 stderr_path = slave_name; 562 } 563 564 // Set STDIN to /dev/null if we want STDIO disabled or if either 565 // STDOUT or STDERR have been set to something and STDIN hasn't 566 if (disable_stdio || (stdin_path == NULL && (stdout_path || stderr_path))) 567 stdin_path = "/dev/null"; 568 569 // Set STDOUT to /dev/null if we want STDIO disabled or if either 570 // STDIN or STDERR have been set to something and STDOUT hasn't 571 if (disable_stdio || (stdout_path == NULL && (stdin_path || stderr_path))) 572 stdout_path = "/dev/null"; 573 574 // Set STDERR to /dev/null if we want STDIO disabled or if either 575 // STDIN or STDOUT have been set to something and STDERR hasn't 576 if (disable_stdio || (stderr_path == NULL && (stdin_path || stdout_path))) 577 stderr_path = "/dev/null"; 578 579 if (stdin_path) 580 m_gdb_comm.SetSTDIN (stdin_path); 581 if (stdout_path) 582 m_gdb_comm.SetSTDOUT (stdout_path); 583 if (stderr_path) 584 m_gdb_comm.SetSTDERR (stderr_path); 585 586 m_gdb_comm.SetDisableASLR (launch_flags & eLaunchFlagDisableASLR); 587 588 m_gdb_comm.SendLaunchArchPacket (m_target.GetArchitecture().GetArchitectureName()); 589 590 if (working_dir && working_dir[0]) 591 { 592 m_gdb_comm.SetWorkingDir (working_dir); 593 } 594 595 // Send the environment and the program + arguments after we connect 596 const Args &environment = launch_info.GetEnvironmentEntries(); 597 if (environment.GetArgumentCount()) 598 { 599 size_t num_environment_entries = environment.GetArgumentCount(); 600 for (size_t i=0; i<num_environment_entries; ++i) 601 { 602 const char *env_entry = environment.GetArgumentAtIndex(i); 603 if (env_entry == NULL || m_gdb_comm.SendEnvironmentPacket(env_entry) != 0) 604 break; 605 } 606 } 607 608 const uint32_t old_packet_timeout = m_gdb_comm.SetPacketTimeout (10); 609 int arg_packet_err = m_gdb_comm.SendArgumentsPacket (launch_info.GetArguments().GetConstArgumentVector()); 610 if (arg_packet_err == 0) 611 { 612 std::string error_str; 613 if (m_gdb_comm.GetLaunchSuccess (error_str)) 614 { 615 SetID (m_gdb_comm.GetCurrentProcessID ()); 616 } 617 else 618 { 619 error.SetErrorString (error_str.c_str()); 620 } 621 } 622 else 623 { 624 error.SetErrorStringWithFormat("'A' packet returned an error: %i", arg_packet_err); 625 } 626 627 m_gdb_comm.SetPacketTimeout (old_packet_timeout); 628 629 if (GetID() == LLDB_INVALID_PROCESS_ID) 630 { 631 if (log) 632 log->Printf("failed to connect to debugserver: %s", error.AsCString()); 633 KillDebugserverProcess (); 634 return error; 635 } 636 637 if (m_gdb_comm.SendPacketAndWaitForResponse("?", 1, m_last_stop_packet, false)) 638 { 639 SetPrivateState (SetThreadStopInfo (m_last_stop_packet)); 640 641 if (!disable_stdio) 642 { 643 if (pty.GetMasterFileDescriptor() != lldb_utility::PseudoTerminal::invalid_fd) 644 SetSTDIOFileDescriptor (pty.ReleaseMasterFileDescriptor()); 645 } 646 } 647 } 648 else 649 { 650 if (log) 651 log->Printf("failed to connect to debugserver: %s", error.AsCString()); 652 } 653 } 654 else 655 { 656 // Set our user ID to an invalid process ID. 657 SetID(LLDB_INVALID_PROCESS_ID); 658 error.SetErrorStringWithFormat ("failed to get object file from '%s' for arch %s", 659 exe_module->GetFileSpec().GetFilename().AsCString(), 660 exe_module->GetArchitecture().GetArchitectureName()); 661 } 662 return error; 663 664} 665 666 667Error 668ProcessGDBRemote::ConnectToDebugserver (const char *connect_url) 669{ 670 Error error; 671 // Sleep and wait a bit for debugserver to start to listen... 672 std::auto_ptr<ConnectionFileDescriptor> conn_ap(new ConnectionFileDescriptor()); 673 if (conn_ap.get()) 674 { 675 const uint32_t max_retry_count = 50; 676 uint32_t retry_count = 0; 677 while (!m_gdb_comm.IsConnected()) 678 { 679 if (conn_ap->Connect(connect_url, &error) == eConnectionStatusSuccess) 680 { 681 m_gdb_comm.SetConnection (conn_ap.release()); 682 break; 683 } 684 retry_count++; 685 686 if (retry_count >= max_retry_count) 687 break; 688 689 usleep (100000); 690 } 691 } 692 693 if (!m_gdb_comm.IsConnected()) 694 { 695 if (error.Success()) 696 error.SetErrorString("not connected to remote gdb server"); 697 return error; 698 } 699 700 // We always seem to be able to open a connection to a local port 701 // so we need to make sure we can then send data to it. If we can't 702 // then we aren't actually connected to anything, so try and do the 703 // handshake with the remote GDB server and make sure that goes 704 // alright. 705 if (!m_gdb_comm.HandshakeWithServer (NULL)) 706 { 707 m_gdb_comm.Disconnect(); 708 if (error.Success()) 709 error.SetErrorString("not connected to remote gdb server"); 710 return error; 711 } 712 m_gdb_comm.ResetDiscoverableSettings(); 713 m_gdb_comm.QueryNoAckModeSupported (); 714 m_gdb_comm.GetThreadSuffixSupported (); 715 m_gdb_comm.GetListThreadsInStopReplySupported (); 716 m_gdb_comm.GetHostInfo (); 717 m_gdb_comm.GetVContSupported ('c'); 718 m_gdb_comm.GetVAttachOrWaitSupported(); 719 720 size_t num_cmds = GetExtraStartupCommands().GetArgumentCount(); 721 for (size_t idx = 0; idx < num_cmds; idx++) 722 { 723 StringExtractorGDBRemote response; 724 printf ("Sending command: \%s.\n", GetExtraStartupCommands().GetArgumentAtIndex(idx)); 725 m_gdb_comm.SendPacketAndWaitForResponse (GetExtraStartupCommands().GetArgumentAtIndex(idx), response, false); 726 } 727 return error; 728} 729 730void 731ProcessGDBRemote::DidLaunchOrAttach () 732{ 733 LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PROCESS)); 734 if (log) 735 log->Printf ("ProcessGDBRemote::DidLaunch()"); 736 if (GetID() != LLDB_INVALID_PROCESS_ID) 737 { 738 m_dispatch_queue_offsets_addr = LLDB_INVALID_ADDRESS; 739 740 BuildDynamicRegisterInfo (false); 741 742 // See if the GDB server supports the qHostInfo information 743 744 const ArchSpec &gdb_remote_arch = m_gdb_comm.GetHostArchitecture(); 745 if (gdb_remote_arch.IsValid()) 746 { 747 ArchSpec &target_arch = GetTarget().GetArchitecture(); 748 749 if (target_arch.IsValid()) 750 { 751 // If the remote host is ARM and we have apple as the vendor, then 752 // ARM executables and shared libraries can have mixed ARM architectures. 753 // You can have an armv6 executable, and if the host is armv7, then the 754 // system will load the best possible architecture for all shared libraries 755 // it has, so we really need to take the remote host architecture as our 756 // defacto architecture in this case. 757 758 if (gdb_remote_arch.GetMachine() == llvm::Triple::arm && 759 gdb_remote_arch.GetTriple().getVendor() == llvm::Triple::Apple) 760 { 761 target_arch = gdb_remote_arch; 762 } 763 else 764 { 765 // Fill in what is missing in the triple 766 const llvm::Triple &remote_triple = gdb_remote_arch.GetTriple(); 767 llvm::Triple &target_triple = target_arch.GetTriple(); 768 if (target_triple.getVendorName().size() == 0) 769 { 770 target_triple.setVendor (remote_triple.getVendor()); 771 772 if (target_triple.getOSName().size() == 0) 773 { 774 target_triple.setOS (remote_triple.getOS()); 775 776 if (target_triple.getEnvironmentName().size() == 0) 777 target_triple.setEnvironment (remote_triple.getEnvironment()); 778 } 779 } 780 } 781 } 782 else 783 { 784 // The target doesn't have a valid architecture yet, set it from 785 // the architecture we got from the remote GDB server 786 target_arch = gdb_remote_arch; 787 } 788 } 789 } 790} 791 792void 793ProcessGDBRemote::DidLaunch () 794{ 795 DidLaunchOrAttach (); 796} 797 798Error 799ProcessGDBRemote::DoAttachToProcessWithID (lldb::pid_t attach_pid) 800{ 801 ProcessAttachInfo attach_info; 802 return DoAttachToProcessWithID(attach_pid, attach_info); 803} 804 805Error 806ProcessGDBRemote::DoAttachToProcessWithID (lldb::pid_t attach_pid, const ProcessAttachInfo &attach_info) 807{ 808 Error error; 809 // Clear out and clean up from any current state 810 Clear(); 811 if (attach_pid != LLDB_INVALID_PROCESS_ID) 812 { 813 // Make sure we aren't already connected? 814 if (!m_gdb_comm.IsConnected()) 815 { 816 char host_port[128]; 817 snprintf (host_port, sizeof(host_port), "localhost:%u", get_random_port ()); 818 char connect_url[128]; 819 snprintf (connect_url, sizeof(connect_url), "connect://%s", host_port); 820 821 error = StartDebugserverProcess (host_port, attach_info); 822 823 if (error.Fail()) 824 { 825 const char *error_string = error.AsCString(); 826 if (error_string == NULL) 827 error_string = "unable to launch " DEBUGSERVER_BASENAME; 828 829 SetExitStatus (-1, error_string); 830 } 831 else 832 { 833 error = ConnectToDebugserver (connect_url); 834 } 835 } 836 837 if (error.Success()) 838 { 839 char packet[64]; 840 const int packet_len = ::snprintf (packet, sizeof(packet), "vAttach;%llx", attach_pid); 841 SetID (attach_pid); 842 m_async_broadcaster.BroadcastEvent (eBroadcastBitAsyncContinue, new EventDataBytes (packet, packet_len)); 843 } 844 } 845 return error; 846} 847 848size_t 849ProcessGDBRemote::AttachInputReaderCallback 850( 851 void *baton, 852 InputReader *reader, 853 lldb::InputReaderAction notification, 854 const char *bytes, 855 size_t bytes_len 856) 857{ 858 if (notification == eInputReaderGotToken) 859 { 860 ProcessGDBRemote *gdb_process = (ProcessGDBRemote *)baton; 861 if (gdb_process->m_waiting_for_attach) 862 gdb_process->m_waiting_for_attach = false; 863 reader->SetIsDone(true); 864 return 1; 865 } 866 return 0; 867} 868 869Error 870ProcessGDBRemote::DoAttachToProcessWithName (const char *process_name, bool wait_for_launch, const ProcessAttachInfo &attach_info) 871{ 872 Error error; 873 // Clear out and clean up from any current state 874 Clear(); 875 876 if (process_name && process_name[0]) 877 { 878 // Make sure we aren't already connected? 879 if (!m_gdb_comm.IsConnected()) 880 { 881 char host_port[128]; 882 snprintf (host_port, sizeof(host_port), "localhost:%u", get_random_port ()); 883 char connect_url[128]; 884 snprintf (connect_url, sizeof(connect_url), "connect://%s", host_port); 885 886 error = StartDebugserverProcess (host_port, attach_info); 887 if (error.Fail()) 888 { 889 const char *error_string = error.AsCString(); 890 if (error_string == NULL) 891 error_string = "unable to launch " DEBUGSERVER_BASENAME; 892 893 SetExitStatus (-1, error_string); 894 } 895 else 896 { 897 error = ConnectToDebugserver (connect_url); 898 } 899 } 900 901 if (error.Success()) 902 { 903 StreamString packet; 904 905 if (wait_for_launch) 906 { 907 if (!m_gdb_comm.GetVAttachOrWaitSupported()) 908 { 909 packet.PutCString ("vAttachWait"); 910 } 911 else 912 { 913 if (attach_info.GetIgnoreExisting()) 914 packet.PutCString("vAttachWait"); 915 else 916 packet.PutCString ("vAttachOrWait"); 917 } 918 } 919 else 920 packet.PutCString("vAttachName"); 921 packet.PutChar(';'); 922 packet.PutBytesAsRawHex8(process_name, strlen(process_name), lldb::endian::InlHostByteOrder(), lldb::endian::InlHostByteOrder()); 923 924 m_async_broadcaster.BroadcastEvent (eBroadcastBitAsyncContinue, new EventDataBytes (packet.GetData(), packet.GetSize())); 925 926 } 927 } 928 return error; 929} 930 931 932void 933ProcessGDBRemote::DidAttach () 934{ 935 DidLaunchOrAttach (); 936} 937 938Error 939ProcessGDBRemote::WillResume () 940{ 941 m_continue_c_tids.clear(); 942 m_continue_C_tids.clear(); 943 m_continue_s_tids.clear(); 944 m_continue_S_tids.clear(); 945 return Error(); 946} 947 948Error 949ProcessGDBRemote::DoResume () 950{ 951 Error error; 952 LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PROCESS)); 953 if (log) 954 log->Printf ("ProcessGDBRemote::Resume()"); 955 956 Listener listener ("gdb-remote.resume-packet-sent"); 957 if (listener.StartListeningForEvents (&m_gdb_comm, GDBRemoteCommunication::eBroadcastBitRunPacketSent)) 958 { 959 listener.StartListeningForEvents (&m_async_broadcaster, ProcessGDBRemote::eBroadcastBitAsyncThreadDidExit); 960 961 StreamString continue_packet; 962 bool continue_packet_error = false; 963 if (m_gdb_comm.HasAnyVContSupport ()) 964 { 965 continue_packet.PutCString ("vCont"); 966 967 if (!m_continue_c_tids.empty()) 968 { 969 if (m_gdb_comm.GetVContSupported ('c')) 970 { 971 for (tid_collection::const_iterator t_pos = m_continue_c_tids.begin(), t_end = m_continue_c_tids.end(); t_pos != t_end; ++t_pos) 972 continue_packet.Printf(";c:%4.4llx", *t_pos); 973 } 974 else 975 continue_packet_error = true; 976 } 977 978 if (!continue_packet_error && !m_continue_C_tids.empty()) 979 { 980 if (m_gdb_comm.GetVContSupported ('C')) 981 { 982 for (tid_sig_collection::const_iterator s_pos = m_continue_C_tids.begin(), s_end = m_continue_C_tids.end(); s_pos != s_end; ++s_pos) 983 continue_packet.Printf(";C%2.2x:%4.4llx", s_pos->second, s_pos->first); 984 } 985 else 986 continue_packet_error = true; 987 } 988 989 if (!continue_packet_error && !m_continue_s_tids.empty()) 990 { 991 if (m_gdb_comm.GetVContSupported ('s')) 992 { 993 for (tid_collection::const_iterator t_pos = m_continue_s_tids.begin(), t_end = m_continue_s_tids.end(); t_pos != t_end; ++t_pos) 994 continue_packet.Printf(";s:%4.4llx", *t_pos); 995 } 996 else 997 continue_packet_error = true; 998 } 999 1000 if (!continue_packet_error && !m_continue_S_tids.empty()) 1001 { 1002 if (m_gdb_comm.GetVContSupported ('S')) 1003 { 1004 for (tid_sig_collection::const_iterator s_pos = m_continue_S_tids.begin(), s_end = m_continue_S_tids.end(); s_pos != s_end; ++s_pos) 1005 continue_packet.Printf(";S%2.2x:%4.4llx", s_pos->second, s_pos->first); 1006 } 1007 else 1008 continue_packet_error = true; 1009 } 1010 1011 if (continue_packet_error) 1012 continue_packet.GetString().clear(); 1013 } 1014 else 1015 continue_packet_error = true; 1016 1017 if (continue_packet_error) 1018 { 1019 // Either no vCont support, or we tried to use part of the vCont 1020 // packet that wasn't supported by the remote GDB server. 1021 // We need to try and make a simple packet that can do our continue 1022 const size_t num_threads = GetThreadList().GetSize(); 1023 const size_t num_continue_c_tids = m_continue_c_tids.size(); 1024 const size_t num_continue_C_tids = m_continue_C_tids.size(); 1025 const size_t num_continue_s_tids = m_continue_s_tids.size(); 1026 const size_t num_continue_S_tids = m_continue_S_tids.size(); 1027 if (num_continue_c_tids > 0) 1028 { 1029 if (num_continue_c_tids == num_threads) 1030 { 1031 // All threads are resuming... 1032 m_gdb_comm.SetCurrentThreadForRun (-1); 1033 continue_packet.PutChar ('c'); 1034 continue_packet_error = false; 1035 } 1036 else if (num_continue_c_tids == 1 && 1037 num_continue_C_tids == 0 && 1038 num_continue_s_tids == 0 && 1039 num_continue_S_tids == 0 ) 1040 { 1041 // Only one thread is continuing 1042 m_gdb_comm.SetCurrentThreadForRun (m_continue_c_tids.front()); 1043 continue_packet.PutChar ('c'); 1044 continue_packet_error = false; 1045 } 1046 } 1047 1048 if (continue_packet_error && num_continue_C_tids > 0) 1049 { 1050 if ((num_continue_C_tids + num_continue_c_tids) == num_threads && 1051 num_continue_C_tids > 0 && 1052 num_continue_s_tids == 0 && 1053 num_continue_S_tids == 0 ) 1054 { 1055 const int continue_signo = m_continue_C_tids.front().second; 1056 // Only one thread is continuing 1057 if (num_continue_C_tids > 1) 1058 { 1059 // More that one thread with a signal, yet we don't have 1060 // vCont support and we are being asked to resume each 1061 // thread with a signal, we need to make sure they are 1062 // all the same signal, or we can't issue the continue 1063 // accurately with the current support... 1064 if (num_continue_C_tids > 1) 1065 { 1066 continue_packet_error = false; 1067 for (size_t i=1; i<m_continue_C_tids.size(); ++i) 1068 { 1069 if (m_continue_C_tids[i].second != continue_signo) 1070 continue_packet_error = true; 1071 } 1072 } 1073 if (!continue_packet_error) 1074 m_gdb_comm.SetCurrentThreadForRun (-1); 1075 } 1076 else 1077 { 1078 // Set the continue thread ID 1079 continue_packet_error = false; 1080 m_gdb_comm.SetCurrentThreadForRun (m_continue_C_tids.front().first); 1081 } 1082 if (!continue_packet_error) 1083 { 1084 // Add threads continuing with the same signo... 1085 continue_packet.Printf("C%2.2x", continue_signo); 1086 } 1087 } 1088 } 1089 1090 if (continue_packet_error && num_continue_s_tids > 0) 1091 { 1092 if (num_continue_s_tids == num_threads) 1093 { 1094 // All threads are resuming... 1095 m_gdb_comm.SetCurrentThreadForRun (-1); 1096 continue_packet.PutChar ('s'); 1097 continue_packet_error = false; 1098 } 1099 else if (num_continue_c_tids == 0 && 1100 num_continue_C_tids == 0 && 1101 num_continue_s_tids == 1 && 1102 num_continue_S_tids == 0 ) 1103 { 1104 // Only one thread is stepping 1105 m_gdb_comm.SetCurrentThreadForRun (m_continue_s_tids.front()); 1106 continue_packet.PutChar ('s'); 1107 continue_packet_error = false; 1108 } 1109 } 1110 1111 if (!continue_packet_error && num_continue_S_tids > 0) 1112 { 1113 if (num_continue_S_tids == num_threads) 1114 { 1115 const int step_signo = m_continue_S_tids.front().second; 1116 // Are all threads trying to step with the same signal? 1117 continue_packet_error = false; 1118 if (num_continue_S_tids > 1) 1119 { 1120 for (size_t i=1; i<num_threads; ++i) 1121 { 1122 if (m_continue_S_tids[i].second != step_signo) 1123 continue_packet_error = true; 1124 } 1125 } 1126 if (!continue_packet_error) 1127 { 1128 // Add threads stepping with the same signo... 1129 m_gdb_comm.SetCurrentThreadForRun (-1); 1130 continue_packet.Printf("S%2.2x", step_signo); 1131 } 1132 } 1133 else if (num_continue_c_tids == 0 && 1134 num_continue_C_tids == 0 && 1135 num_continue_s_tids == 0 && 1136 num_continue_S_tids == 1 ) 1137 { 1138 // Only one thread is stepping with signal 1139 m_gdb_comm.SetCurrentThreadForRun (m_continue_S_tids.front().first); 1140 continue_packet.Printf("S%2.2x", m_continue_S_tids.front().second); 1141 continue_packet_error = false; 1142 } 1143 } 1144 } 1145 1146 if (continue_packet_error) 1147 { 1148 error.SetErrorString ("can't make continue packet for this resume"); 1149 } 1150 else 1151 { 1152 EventSP event_sp; 1153 TimeValue timeout; 1154 timeout = TimeValue::Now(); 1155 timeout.OffsetWithSeconds (5); 1156 if (!IS_VALID_LLDB_HOST_THREAD(m_async_thread)) 1157 { 1158 error.SetErrorString ("Trying to resume but the async thread is dead."); 1159 if (log) 1160 log->Printf ("ProcessGDBRemote::DoResume: Trying to resume but the async thread is dead."); 1161 return error; 1162 } 1163 1164 m_async_broadcaster.BroadcastEvent (eBroadcastBitAsyncContinue, new EventDataBytes (continue_packet.GetData(), continue_packet.GetSize())); 1165 1166 if (listener.WaitForEvent (&timeout, event_sp) == false) 1167 { 1168 error.SetErrorString("Resume timed out."); 1169 if (log) 1170 log->Printf ("ProcessGDBRemote::DoResume: Resume timed out."); 1171 } 1172 else if (event_sp->BroadcasterIs (&m_async_broadcaster)) 1173 { 1174 error.SetErrorString ("Broadcast continue, but the async thread was killed before we got an ack back."); 1175 if (log) 1176 log->Printf ("ProcessGDBRemote::DoResume: Broadcast continue, but the async thread was killed before we got an ack back."); 1177 return error; 1178 } 1179 } 1180 } 1181 1182 return error; 1183} 1184 1185void 1186ProcessGDBRemote::ClearThreadIDList () 1187{ 1188 Mutex::Locker locker(m_thread_list.GetMutex()); 1189 m_thread_ids.clear(); 1190} 1191 1192bool 1193ProcessGDBRemote::UpdateThreadIDList () 1194{ 1195 Mutex::Locker locker(m_thread_list.GetMutex()); 1196 bool sequence_mutex_unavailable = false; 1197 m_gdb_comm.GetCurrentThreadIDs (m_thread_ids, sequence_mutex_unavailable); 1198 if (sequence_mutex_unavailable) 1199 { 1200 return false; // We just didn't get the list 1201 } 1202 return true; 1203} 1204 1205bool 1206ProcessGDBRemote::UpdateThreadList (ThreadList &old_thread_list, ThreadList &new_thread_list) 1207{ 1208 // locker will keep a mutex locked until it goes out of scope 1209 LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_THREAD)); 1210 if (log && log->GetMask().Test(GDBR_LOG_VERBOSE)) 1211 log->Printf ("ProcessGDBRemote::%s (pid = %llu)", __FUNCTION__, GetID()); 1212 1213 size_t num_thread_ids = m_thread_ids.size(); 1214 // The "m_thread_ids" thread ID list should always be updated after each stop 1215 // reply packet, but in case it isn't, update it here. 1216 if (num_thread_ids == 0) 1217 { 1218 if (!UpdateThreadIDList ()) 1219 return false; 1220 num_thread_ids = m_thread_ids.size(); 1221 } 1222 1223 if (num_thread_ids > 0) 1224 { 1225 for (size_t i=0; i<num_thread_ids; ++i) 1226 { 1227 tid_t tid = m_thread_ids[i]; 1228 ThreadSP thread_sp (old_thread_list.FindThreadByID (tid, false)); 1229 if (!thread_sp) 1230 thread_sp.reset (new ThreadGDBRemote (shared_from_this(), tid)); 1231 new_thread_list.AddThread(thread_sp); 1232 } 1233 } 1234 1235 return true; 1236} 1237 1238 1239StateType 1240ProcessGDBRemote::SetThreadStopInfo (StringExtractor& stop_packet) 1241{ 1242 stop_packet.SetFilePos (0); 1243 const char stop_type = stop_packet.GetChar(); 1244 switch (stop_type) 1245 { 1246 case 'T': 1247 case 'S': 1248 { 1249 if (GetStopID() == 0) 1250 { 1251 // Our first stop, make sure we have a process ID, and also make 1252 // sure we know about our registers 1253 if (GetID() == LLDB_INVALID_PROCESS_ID) 1254 { 1255 lldb::pid_t pid = m_gdb_comm.GetCurrentProcessID (); 1256 if (pid != LLDB_INVALID_PROCESS_ID) 1257 SetID (pid); 1258 } 1259 BuildDynamicRegisterInfo (true); 1260 } 1261 // Stop with signal and thread info 1262 const uint8_t signo = stop_packet.GetHexU8(); 1263 std::string name; 1264 std::string value; 1265 std::string thread_name; 1266 std::string reason; 1267 std::string description; 1268 uint32_t exc_type = 0; 1269 std::vector<addr_t> exc_data; 1270 addr_t thread_dispatch_qaddr = LLDB_INVALID_ADDRESS; 1271 ThreadSP thread_sp; 1272 1273 while (stop_packet.GetNameColonValue(name, value)) 1274 { 1275 if (name.compare("metype") == 0) 1276 { 1277 // exception type in big endian hex 1278 exc_type = Args::StringToUInt32 (value.c_str(), 0, 16); 1279 } 1280 else if (name.compare("medata") == 0) 1281 { 1282 // exception data in big endian hex 1283 exc_data.push_back(Args::StringToUInt64 (value.c_str(), 0, 16)); 1284 } 1285 else if (name.compare("thread") == 0) 1286 { 1287 // thread in big endian hex 1288 lldb::tid_t tid = Args::StringToUInt64 (value.c_str(), LLDB_INVALID_THREAD_ID, 16); 1289 // m_thread_list does have its own mutex, but we need to 1290 // hold onto the mutex between the call to m_thread_list.FindThreadByID(...) 1291 // and the m_thread_list.AddThread(...) so it doesn't change on us 1292 Mutex::Locker locker (m_thread_list.GetMutex ()); 1293 thread_sp = m_thread_list.FindThreadByID(tid, false); 1294 if (!thread_sp) 1295 { 1296 // Create the thread if we need to 1297 thread_sp.reset (new ThreadGDBRemote (shared_from_this(), tid)); 1298 m_thread_list.AddThread(thread_sp); 1299 } 1300 } 1301 else if (name.compare("threads") == 0) 1302 { 1303 Mutex::Locker locker(m_thread_list.GetMutex()); 1304 m_thread_ids.clear(); 1305 // A comma separated list of all threads in the current 1306 // process that includes the thread for this stop reply 1307 // packet 1308 size_t comma_pos; 1309 lldb::tid_t tid; 1310 while ((comma_pos = value.find(',')) != std::string::npos) 1311 { 1312 value[comma_pos] = '\0'; 1313 // thread in big endian hex 1314 tid = Args::StringToUInt64 (value.c_str(), LLDB_INVALID_THREAD_ID, 16); 1315 if (tid != LLDB_INVALID_THREAD_ID) 1316 m_thread_ids.push_back (tid); 1317 value.erase(0, comma_pos + 1); 1318 1319 } 1320 tid = Args::StringToUInt64 (value.c_str(), LLDB_INVALID_THREAD_ID, 16); 1321 if (tid != LLDB_INVALID_THREAD_ID) 1322 m_thread_ids.push_back (tid); 1323 } 1324 else if (name.compare("hexname") == 0) 1325 { 1326 StringExtractor name_extractor; 1327 // Swap "value" over into "name_extractor" 1328 name_extractor.GetStringRef().swap(value); 1329 // Now convert the HEX bytes into a string value 1330 name_extractor.GetHexByteString (value); 1331 thread_name.swap (value); 1332 } 1333 else if (name.compare("name") == 0) 1334 { 1335 thread_name.swap (value); 1336 } 1337 else if (name.compare("qaddr") == 0) 1338 { 1339 thread_dispatch_qaddr = Args::StringToUInt64 (value.c_str(), 0, 16); 1340 } 1341 else if (name.compare("reason") == 0) 1342 { 1343 reason.swap(value); 1344 } 1345 else if (name.compare("description") == 0) 1346 { 1347 StringExtractor desc_extractor; 1348 // Swap "value" over into "name_extractor" 1349 desc_extractor.GetStringRef().swap(value); 1350 // Now convert the HEX bytes into a string value 1351 desc_extractor.GetHexByteString (thread_name); 1352 } 1353 else if (name.size() == 2 && ::isxdigit(name[0]) && ::isxdigit(name[1])) 1354 { 1355 // We have a register number that contains an expedited 1356 // register value. Lets supply this register to our thread 1357 // so it won't have to go and read it. 1358 if (thread_sp) 1359 { 1360 uint32_t reg = Args::StringToUInt32 (name.c_str(), UINT32_MAX, 16); 1361 1362 if (reg != UINT32_MAX) 1363 { 1364 StringExtractor reg_value_extractor; 1365 // Swap "value" over into "reg_value_extractor" 1366 reg_value_extractor.GetStringRef().swap(value); 1367 if (!static_cast<ThreadGDBRemote *> (thread_sp.get())->PrivateSetRegisterValue (reg, reg_value_extractor)) 1368 { 1369 Host::SetCrashDescriptionWithFormat("Setting thread register '%s' (decoded to %u (0x%x)) with value '%s' for stop packet: '%s'", 1370 name.c_str(), 1371 reg, 1372 reg, 1373 reg_value_extractor.GetStringRef().c_str(), 1374 stop_packet.GetStringRef().c_str()); 1375 } 1376 } 1377 } 1378 } 1379 } 1380 1381 if (thread_sp) 1382 { 1383 ThreadGDBRemote *gdb_thread = static_cast<ThreadGDBRemote *> (thread_sp.get()); 1384 1385 gdb_thread->SetThreadDispatchQAddr (thread_dispatch_qaddr); 1386 gdb_thread->SetName (thread_name.empty() ? NULL : thread_name.c_str()); 1387 if (exc_type != 0) 1388 { 1389 const size_t exc_data_size = exc_data.size(); 1390 1391 gdb_thread->SetStopInfo (StopInfoMachException::CreateStopReasonWithMachException (*thread_sp, 1392 exc_type, 1393 exc_data_size, 1394 exc_data_size >= 1 ? exc_data[0] : 0, 1395 exc_data_size >= 2 ? exc_data[1] : 0, 1396 exc_data_size >= 3 ? exc_data[2] : 0)); 1397 } 1398 else 1399 { 1400 bool handled = false; 1401 if (!reason.empty()) 1402 { 1403 if (reason.compare("trace") == 0) 1404 { 1405 gdb_thread->SetStopInfo (StopInfo::CreateStopReasonToTrace (*thread_sp)); 1406 handled = true; 1407 } 1408 else if (reason.compare("breakpoint") == 0) 1409 { 1410 addr_t pc = gdb_thread->GetRegisterContext()->GetPC(); 1411 lldb::BreakpointSiteSP bp_site_sp = gdb_thread->GetProcess()->GetBreakpointSiteList().FindByAddress(pc); 1412 if (bp_site_sp) 1413 { 1414 // If the breakpoint is for this thread, then we'll report the hit, but if it is for another thread, 1415 // we can just report no reason. We don't need to worry about stepping over the breakpoint here, that 1416 // will be taken care of when the thread resumes and notices that there's a breakpoint under the pc. 1417 handled = true; 1418 if (bp_site_sp->ValidForThisThread (gdb_thread)) 1419 { 1420 gdb_thread->SetStopInfo (StopInfo::CreateStopReasonWithBreakpointSiteID (*thread_sp, bp_site_sp->GetID())); 1421 } 1422 else 1423 { 1424 StopInfoSP invalid_stop_info_sp; 1425 gdb_thread->SetStopInfo (invalid_stop_info_sp); 1426 } 1427 } 1428 1429 } 1430 else if (reason.compare("trap") == 0) 1431 { 1432 // Let the trap just use the standard signal stop reason below... 1433 } 1434 else if (reason.compare("watchpoint") == 0) 1435 { 1436 break_id_t watch_id = LLDB_INVALID_WATCH_ID; 1437 // TODO: locate the watchpoint somehow... 1438 gdb_thread->SetStopInfo (StopInfo::CreateStopReasonWithWatchpointID (*thread_sp, watch_id)); 1439 handled = true; 1440 } 1441 else if (reason.compare("exception") == 0) 1442 { 1443 gdb_thread->SetStopInfo (StopInfo::CreateStopReasonWithException(*thread_sp, description.c_str())); 1444 handled = true; 1445 } 1446 } 1447 1448 if (signo) 1449 { 1450 if (signo == SIGTRAP) 1451 { 1452 // Currently we are going to assume SIGTRAP means we are either 1453 // hitting a breakpoint or hardware single stepping. 1454 handled = true; 1455 addr_t pc = gdb_thread->GetRegisterContext()->GetPC(); 1456 lldb::BreakpointSiteSP bp_site_sp = gdb_thread->GetProcess()->GetBreakpointSiteList().FindByAddress(pc); 1457 1458 if (bp_site_sp) 1459 { 1460 // If the breakpoint is for this thread, then we'll report the hit, but if it is for another thread, 1461 // we can just report no reason. We don't need to worry about stepping over the breakpoint here, that 1462 // will be taken care of when the thread resumes and notices that there's a breakpoint under the pc. 1463 if (bp_site_sp->ValidForThisThread (gdb_thread)) 1464 { 1465 gdb_thread->SetStopInfo (StopInfo::CreateStopReasonWithBreakpointSiteID (*thread_sp, bp_site_sp->GetID())); 1466 } 1467 else 1468 { 1469 StopInfoSP invalid_stop_info_sp; 1470 gdb_thread->SetStopInfo (invalid_stop_info_sp); 1471 } 1472 } 1473 else 1474 { 1475 // TODO: check for breakpoint or trap opcode in case there is a hard 1476 // coded software trap 1477 gdb_thread->SetStopInfo (StopInfo::CreateStopReasonToTrace (*thread_sp)); 1478 } 1479 } 1480 if (!handled) 1481 gdb_thread->SetStopInfo (StopInfo::CreateStopReasonWithSignal (*thread_sp, signo)); 1482 } 1483 else 1484 { 1485 StopInfoSP invalid_stop_info_sp; 1486 gdb_thread->SetStopInfo (invalid_stop_info_sp); 1487 } 1488 1489 if (!description.empty()) 1490 { 1491 lldb::StopInfoSP stop_info_sp (gdb_thread->GetStopInfo ()); 1492 if (stop_info_sp) 1493 { 1494 stop_info_sp->SetDescription (description.c_str()); 1495 } 1496 else 1497 { 1498 gdb_thread->SetStopInfo (StopInfo::CreateStopReasonWithException (*thread_sp, description.c_str())); 1499 } 1500 } 1501 } 1502 } 1503 return eStateStopped; 1504 } 1505 break; 1506 1507 case 'W': 1508 // process exited 1509 return eStateExited; 1510 1511 default: 1512 break; 1513 } 1514 return eStateInvalid; 1515} 1516 1517void 1518ProcessGDBRemote::RefreshStateAfterStop () 1519{ 1520 Mutex::Locker locker(m_thread_list.GetMutex()); 1521 m_thread_ids.clear(); 1522 // Set the thread stop info. It might have a "threads" key whose value is 1523 // a list of all thread IDs in the current process, so m_thread_ids might 1524 // get set. 1525 SetThreadStopInfo (m_last_stop_packet); 1526 // Check to see if SetThreadStopInfo() filled in m_thread_ids? 1527 if (m_thread_ids.empty()) 1528 { 1529 // No, we need to fetch the thread list manually 1530 UpdateThreadIDList(); 1531 } 1532 1533 // Let all threads recover from stopping and do any clean up based 1534 // on the previous thread state (if any). 1535 m_thread_list.RefreshStateAfterStop(); 1536 1537} 1538 1539Error 1540ProcessGDBRemote::DoHalt (bool &caused_stop) 1541{ 1542 Error error; 1543 1544 bool timed_out = false; 1545 Mutex::Locker locker; 1546 1547 if (m_public_state.GetValue() == eStateAttaching) 1548 { 1549 // We are being asked to halt during an attach. We need to just close 1550 // our file handle and debugserver will go away, and we can be done... 1551 m_gdb_comm.Disconnect(); 1552 } 1553 else 1554 { 1555 if (!m_gdb_comm.SendInterrupt (locker, 2, timed_out)) 1556 { 1557 if (timed_out) 1558 error.SetErrorString("timed out sending interrupt packet"); 1559 else 1560 error.SetErrorString("unknown error sending interrupt packet"); 1561 } 1562 1563 caused_stop = m_gdb_comm.GetInterruptWasSent (); 1564 } 1565 return error; 1566} 1567 1568Error 1569ProcessGDBRemote::InterruptIfRunning 1570( 1571 bool discard_thread_plans, 1572 bool catch_stop_event, 1573 EventSP &stop_event_sp 1574) 1575{ 1576 Error error; 1577 1578 LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_PROCESS)); 1579 1580 bool paused_private_state_thread = false; 1581 const bool is_running = m_gdb_comm.IsRunning(); 1582 if (log) 1583 log->Printf ("ProcessGDBRemote::InterruptIfRunning(discard_thread_plans=%i, catch_stop_event=%i) is_running=%i", 1584 discard_thread_plans, 1585 catch_stop_event, 1586 is_running); 1587 1588 if (discard_thread_plans) 1589 { 1590 if (log) 1591 log->Printf ("ProcessGDBRemote::InterruptIfRunning() discarding all thread plans"); 1592 m_thread_list.DiscardThreadPlans(); 1593 } 1594 if (is_running) 1595 { 1596 if (catch_stop_event) 1597 { 1598 if (log) 1599 log->Printf ("ProcessGDBRemote::InterruptIfRunning() pausing private state thread"); 1600 PausePrivateStateThread(); 1601 paused_private_state_thread = true; 1602 } 1603 1604 bool timed_out = false; 1605 Mutex::Locker locker; 1606 1607 if (!m_gdb_comm.SendInterrupt (locker, 1, timed_out)) 1608 { 1609 if (timed_out) 1610 error.SetErrorString("timed out sending interrupt packet"); 1611 else 1612 error.SetErrorString("unknown error sending interrupt packet"); 1613 if (paused_private_state_thread) 1614 ResumePrivateStateThread(); 1615 return error; 1616 } 1617 1618 if (catch_stop_event) 1619 { 1620 // LISTEN HERE 1621 TimeValue timeout_time; 1622 timeout_time = TimeValue::Now(); 1623 timeout_time.OffsetWithSeconds(5); 1624 StateType state = WaitForStateChangedEventsPrivate (&timeout_time, stop_event_sp); 1625 1626 timed_out = state == eStateInvalid; 1627 if (log) 1628 log->Printf ("ProcessGDBRemote::InterruptIfRunning() catch stop event: state = %s, timed-out=%i", StateAsCString(state), timed_out); 1629 1630 if (timed_out) 1631 error.SetErrorString("unable to verify target stopped"); 1632 } 1633 1634 if (paused_private_state_thread) 1635 { 1636 if (log) 1637 log->Printf ("ProcessGDBRemote::InterruptIfRunning() resuming private state thread"); 1638 ResumePrivateStateThread(); 1639 } 1640 } 1641 return error; 1642} 1643 1644Error 1645ProcessGDBRemote::WillDetach () 1646{ 1647 LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_PROCESS)); 1648 if (log) 1649 log->Printf ("ProcessGDBRemote::WillDetach()"); 1650 1651 bool discard_thread_plans = true; 1652 bool catch_stop_event = true; 1653 EventSP event_sp; 1654 1655 // FIXME: InterruptIfRunning should be done in the Process base class, or better still make Halt do what is 1656 // needed. This shouldn't be a feature of a particular plugin. 1657 1658 return InterruptIfRunning (discard_thread_plans, catch_stop_event, event_sp); 1659} 1660 1661Error 1662ProcessGDBRemote::DoDetach() 1663{ 1664 Error error; 1665 LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_PROCESS)); 1666 if (log) 1667 log->Printf ("ProcessGDBRemote::DoDetach()"); 1668 1669 DisableAllBreakpointSites (); 1670 1671 m_thread_list.DiscardThreadPlans(); 1672 1673 bool success = m_gdb_comm.Detach (); 1674 if (log) 1675 { 1676 if (success) 1677 log->PutCString ("ProcessGDBRemote::DoDetach() detach packet sent successfully"); 1678 else 1679 log->PutCString ("ProcessGDBRemote::DoDetach() detach packet send failed"); 1680 } 1681 // Sleep for one second to let the process get all detached... 1682 StopAsyncThread (); 1683 1684 SetPrivateState (eStateDetached); 1685 ResumePrivateStateThread(); 1686 1687 //KillDebugserverProcess (); 1688 return error; 1689} 1690 1691 1692Error 1693ProcessGDBRemote::DoDestroy () 1694{ 1695 Error error; 1696 LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_PROCESS)); 1697 if (log) 1698 log->Printf ("ProcessGDBRemote::DoDestroy()"); 1699 1700 // There is a bug in older iOS debugservers where they don't shut down the process 1701 // they are debugging properly. If the process is sitting at a breakpoint or an exception, 1702 // this can cause problems with restarting. So we check to see if any of our threads are stopped 1703 // at a breakpoint, and if so we remove all the breakpoints, resume the process, and THEN 1704 // destroy it again. 1705 // 1706 // Note, we don't have a good way to test the version of debugserver, but I happen to know that 1707 // the set of all the iOS debugservers which don't support GetThreadSuffixSupported() and that of 1708 // the debugservers with this bug are equal. There really should be a better way to test this! 1709 // 1710 // We also use m_destroy_tried_resuming to make sure we only do this once, if we resume and then halt and 1711 // get called here to destroy again and we're still at a breakpoint or exception, then we should 1712 // just do the straight-forward kill. 1713 // 1714 // And of course, if we weren't able to stop the process by the time we get here, it isn't 1715 // necessary (or helpful) to do any of this. 1716 1717 if (!m_gdb_comm.GetThreadSuffixSupported() && m_public_state.GetValue() != eStateRunning) 1718 { 1719 PlatformSP platform_sp = GetTarget().GetPlatform(); 1720 1721 // FIXME: These should be ConstStrings so we aren't doing strcmp'ing. 1722 if (platform_sp 1723 && platform_sp->GetName() 1724 && strcmp (platform_sp->GetName(), PlatformRemoteiOS::GetShortPluginNameStatic()) == 0) 1725 { 1726 if (m_destroy_tried_resuming) 1727 { 1728 if (log) 1729 log->PutCString ("ProcessGDBRemote::DoDestroy()Tried resuming to destroy once already, not doing it again."); 1730 } 1731 else 1732 { 1733 // At present, the plans are discarded and the breakpoints disabled Process::Destroy, 1734 // but we really need it to happen here and it doesn't matter if we do it twice. 1735 m_thread_list.DiscardThreadPlans(); 1736 DisableAllBreakpointSites(); 1737 1738 bool stop_looks_like_crash = false; 1739 ThreadList &threads = GetThreadList(); 1740 1741 { 1742 Mutex::Locker(threads.GetMutex()); 1743 1744 size_t num_threads = threads.GetSize(); 1745 for (size_t i = 0; i < num_threads; i++) 1746 { 1747 ThreadSP thread_sp = threads.GetThreadAtIndex(i); 1748 StopInfoSP stop_info_sp = thread_sp->GetPrivateStopReason(); 1749 StopReason reason = eStopReasonInvalid; 1750 if (stop_info_sp) 1751 reason = stop_info_sp->GetStopReason(); 1752 if (reason == eStopReasonBreakpoint 1753 || reason == eStopReasonException) 1754 { 1755 if (log) 1756 log->Printf ("ProcessGDBRemote::DoDestroy() - thread: %lld stopped with reason: %s.", 1757 thread_sp->GetID(), 1758 stop_info_sp->GetDescription()); 1759 stop_looks_like_crash = true; 1760 break; 1761 } 1762 } 1763 } 1764 1765 if (stop_looks_like_crash) 1766 { 1767 if (log) 1768 log->PutCString ("ProcessGDBRemote::DoDestroy() - Stopped at a breakpoint, continue and then kill."); 1769 m_destroy_tried_resuming = true; 1770 1771 // If we are going to run again before killing, it would be good to suspend all the threads 1772 // before resuming so they won't get into more trouble. Sadly, for the threads stopped with 1773 // the breakpoint or exception, the exception doesn't get cleared if it is suspended, so we do 1774 // have to run the risk of letting those threads proceed a bit. 1775 1776 { 1777 Mutex::Locker(threads.GetMutex()); 1778 1779 size_t num_threads = threads.GetSize(); 1780 for (size_t i = 0; i < num_threads; i++) 1781 { 1782 ThreadSP thread_sp = threads.GetThreadAtIndex(i); 1783 StopInfoSP stop_info_sp = thread_sp->GetPrivateStopReason(); 1784 StopReason reason = eStopReasonInvalid; 1785 if (stop_info_sp) 1786 reason = stop_info_sp->GetStopReason(); 1787 if (reason != eStopReasonBreakpoint 1788 && reason != eStopReasonException) 1789 { 1790 if (log) 1791 log->Printf ("ProcessGDBRemote::DoDestroy() - Suspending thread: %lld before running.", 1792 thread_sp->GetID()); 1793 thread_sp->SetResumeState(eStateSuspended); 1794 } 1795 } 1796 } 1797 Resume (); 1798 return Destroy(); 1799 } 1800 } 1801 } 1802 } 1803 1804 // Interrupt if our inferior is running... 1805 int exit_status = SIGABRT; 1806 std::string exit_string; 1807 1808 if (m_gdb_comm.IsConnected()) 1809 { 1810 if (m_public_state.GetValue() != eStateAttaching) 1811 { 1812 1813 StringExtractorGDBRemote response; 1814 bool send_async = true; 1815 const uint32_t old_packet_timeout = m_gdb_comm.SetPacketTimeout (3); 1816 1817 if (m_gdb_comm.SendPacketAndWaitForResponse("k", 1, response, send_async)) 1818 { 1819 char packet_cmd = response.GetChar(0); 1820 1821 if (packet_cmd == 'W' || packet_cmd == 'X') 1822 { 1823 SetLastStopPacket (response); 1824 ClearThreadIDList (); 1825 exit_status = response.GetHexU8(); 1826 } 1827 else 1828 { 1829 if (log) 1830 log->Printf ("ProcessGDBRemote::DoDestroy - got unexpected response to k packet: %s", response.GetStringRef().c_str()); 1831 exit_string.assign("got unexpected response to k packet: "); 1832 exit_string.append(response.GetStringRef()); 1833 } 1834 } 1835 else 1836 { 1837 if (log) 1838 log->Printf ("ProcessGDBRemote::DoDestroy - failed to send k packet"); 1839 exit_string.assign("failed to send the k packet"); 1840 } 1841 1842 m_gdb_comm.SetPacketTimeout(old_packet_timeout); 1843 } 1844 else 1845 { 1846 if (log) 1847 log->Printf ("ProcessGDBRemote::DoDestroy - failed to send k packet"); 1848 exit_string.assign ("killed or interrupted while attaching."); 1849 } 1850 } 1851 else 1852 { 1853 // If we missed setting the exit status on the way out, do it here. 1854 // NB set exit status can be called multiple times, the first one sets the status. 1855 exit_string.assign("destroying when not connected to debugserver"); 1856 } 1857 1858 SetExitStatus(exit_status, exit_string.c_str()); 1859 1860 StopAsyncThread (); 1861 KillDebugserverProcess (); 1862 return error; 1863} 1864 1865//------------------------------------------------------------------ 1866// Process Queries 1867//------------------------------------------------------------------ 1868 1869bool 1870ProcessGDBRemote::IsAlive () 1871{ 1872 return m_gdb_comm.IsConnected() && m_private_state.GetValue() != eStateExited; 1873} 1874 1875addr_t 1876ProcessGDBRemote::GetImageInfoAddress() 1877{ 1878 return m_gdb_comm.GetShlibInfoAddr(); 1879} 1880 1881//------------------------------------------------------------------ 1882// Process Memory 1883//------------------------------------------------------------------ 1884size_t 1885ProcessGDBRemote::DoReadMemory (addr_t addr, void *buf, size_t size, Error &error) 1886{ 1887 if (size > m_max_memory_size) 1888 { 1889 // Keep memory read sizes down to a sane limit. This function will be 1890 // called multiple times in order to complete the task by 1891 // lldb_private::Process so it is ok to do this. 1892 size = m_max_memory_size; 1893 } 1894 1895 char packet[64]; 1896 const int packet_len = ::snprintf (packet, sizeof(packet), "m%llx,%zx", (uint64_t)addr, size); 1897 assert (packet_len + 1 < sizeof(packet)); 1898 StringExtractorGDBRemote response; 1899 if (m_gdb_comm.SendPacketAndWaitForResponse(packet, packet_len, response, true)) 1900 { 1901 if (response.IsNormalResponse()) 1902 { 1903 error.Clear(); 1904 return response.GetHexBytes(buf, size, '\xdd'); 1905 } 1906 else if (response.IsErrorResponse()) 1907 error.SetErrorStringWithFormat("gdb remote returned an error: %s", response.GetStringRef().c_str()); 1908 else if (response.IsUnsupportedResponse()) 1909 error.SetErrorStringWithFormat("'%s' packet unsupported", packet); 1910 else 1911 error.SetErrorStringWithFormat("unexpected response to '%s': '%s'", packet, response.GetStringRef().c_str()); 1912 } 1913 else 1914 { 1915 error.SetErrorStringWithFormat("failed to sent packet: '%s'", packet); 1916 } 1917 return 0; 1918} 1919 1920size_t 1921ProcessGDBRemote::DoWriteMemory (addr_t addr, const void *buf, size_t size, Error &error) 1922{ 1923 if (size > m_max_memory_size) 1924 { 1925 // Keep memory read sizes down to a sane limit. This function will be 1926 // called multiple times in order to complete the task by 1927 // lldb_private::Process so it is ok to do this. 1928 size = m_max_memory_size; 1929 } 1930 1931 StreamString packet; 1932 packet.Printf("M%llx,%zx:", addr, size); 1933 packet.PutBytesAsRawHex8(buf, size, lldb::endian::InlHostByteOrder(), lldb::endian::InlHostByteOrder()); 1934 StringExtractorGDBRemote response; 1935 if (m_gdb_comm.SendPacketAndWaitForResponse(packet.GetData(), packet.GetSize(), response, true)) 1936 { 1937 if (response.IsOKResponse()) 1938 { 1939 error.Clear(); 1940 return size; 1941 } 1942 else if (response.IsErrorResponse()) 1943 error.SetErrorStringWithFormat("gdb remote returned an error: %s", response.GetStringRef().c_str()); 1944 else if (response.IsUnsupportedResponse()) 1945 error.SetErrorStringWithFormat("'%s' packet unsupported", packet.GetString().c_str()); 1946 else 1947 error.SetErrorStringWithFormat("unexpected response to '%s': '%s'", packet.GetString().c_str(), response.GetStringRef().c_str()); 1948 } 1949 else 1950 { 1951 error.SetErrorStringWithFormat("failed to sent packet: '%s'", packet.GetString().c_str()); 1952 } 1953 return 0; 1954} 1955 1956lldb::addr_t 1957ProcessGDBRemote::DoAllocateMemory (size_t size, uint32_t permissions, Error &error) 1958{ 1959 addr_t allocated_addr = LLDB_INVALID_ADDRESS; 1960 1961 LazyBool supported = m_gdb_comm.SupportsAllocDeallocMemory(); 1962 switch (supported) 1963 { 1964 case eLazyBoolCalculate: 1965 case eLazyBoolYes: 1966 allocated_addr = m_gdb_comm.AllocateMemory (size, permissions); 1967 if (allocated_addr != LLDB_INVALID_ADDRESS || supported == eLazyBoolYes) 1968 return allocated_addr; 1969 1970 case eLazyBoolNo: 1971 // Call mmap() to create memory in the inferior.. 1972 unsigned prot = 0; 1973 if (permissions & lldb::ePermissionsReadable) 1974 prot |= eMmapProtRead; 1975 if (permissions & lldb::ePermissionsWritable) 1976 prot |= eMmapProtWrite; 1977 if (permissions & lldb::ePermissionsExecutable) 1978 prot |= eMmapProtExec; 1979 1980 if (InferiorCallMmap(this, allocated_addr, 0, size, prot, 1981 eMmapFlagsAnon | eMmapFlagsPrivate, -1, 0)) 1982 m_addr_to_mmap_size[allocated_addr] = size; 1983 else 1984 allocated_addr = LLDB_INVALID_ADDRESS; 1985 break; 1986 } 1987 1988 if (allocated_addr == LLDB_INVALID_ADDRESS) 1989 error.SetErrorStringWithFormat("unable to allocate %zu bytes of memory with permissions %s", size, GetPermissionsAsCString (permissions)); 1990 else 1991 error.Clear(); 1992 return allocated_addr; 1993} 1994 1995Error 1996ProcessGDBRemote::GetMemoryRegionInfo (addr_t load_addr, 1997 MemoryRegionInfo ®ion_info) 1998{ 1999 2000 Error error (m_gdb_comm.GetMemoryRegionInfo (load_addr, region_info)); 2001 return error; 2002} 2003 2004Error 2005ProcessGDBRemote::GetWatchpointSupportInfo (uint32_t &num) 2006{ 2007 2008 Error error (m_gdb_comm.GetWatchpointSupportInfo (num)); 2009 return error; 2010} 2011 2012Error 2013ProcessGDBRemote::GetWatchpointSupportInfo (uint32_t &num, bool& after) 2014{ 2015 Error error (m_gdb_comm.GetWatchpointSupportInfo (num, after)); 2016 return error; 2017} 2018 2019Error 2020ProcessGDBRemote::DoDeallocateMemory (lldb::addr_t addr) 2021{ 2022 Error error; 2023 LazyBool supported = m_gdb_comm.SupportsAllocDeallocMemory(); 2024 2025 switch (supported) 2026 { 2027 case eLazyBoolCalculate: 2028 // We should never be deallocating memory without allocating memory 2029 // first so we should never get eLazyBoolCalculate 2030 error.SetErrorString ("tried to deallocate memory without ever allocating memory"); 2031 break; 2032 2033 case eLazyBoolYes: 2034 if (!m_gdb_comm.DeallocateMemory (addr)) 2035 error.SetErrorStringWithFormat("unable to deallocate memory at 0x%llx", addr); 2036 break; 2037 2038 case eLazyBoolNo: 2039 // Call munmap() to deallocate memory in the inferior.. 2040 { 2041 MMapMap::iterator pos = m_addr_to_mmap_size.find(addr); 2042 if (pos != m_addr_to_mmap_size.end() && 2043 InferiorCallMunmap(this, addr, pos->second)) 2044 m_addr_to_mmap_size.erase (pos); 2045 else 2046 error.SetErrorStringWithFormat("unable to deallocate memory at 0x%llx", addr); 2047 } 2048 break; 2049 } 2050 2051 return error; 2052} 2053 2054 2055//------------------------------------------------------------------ 2056// Process STDIO 2057//------------------------------------------------------------------ 2058size_t 2059ProcessGDBRemote::PutSTDIN (const char *src, size_t src_len, Error &error) 2060{ 2061 if (m_stdio_communication.IsConnected()) 2062 { 2063 ConnectionStatus status; 2064 m_stdio_communication.Write(src, src_len, status, NULL); 2065 } 2066 return 0; 2067} 2068 2069Error 2070ProcessGDBRemote::EnableBreakpoint (BreakpointSite *bp_site) 2071{ 2072 Error error; 2073 assert (bp_site != NULL); 2074 2075 LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_BREAKPOINTS)); 2076 user_id_t site_id = bp_site->GetID(); 2077 const addr_t addr = bp_site->GetLoadAddress(); 2078 if (log) 2079 log->Printf ("ProcessGDBRemote::EnableBreakpoint (size_id = %llu) address = 0x%llx", site_id, (uint64_t)addr); 2080 2081 if (bp_site->IsEnabled()) 2082 { 2083 if (log) 2084 log->Printf ("ProcessGDBRemote::EnableBreakpoint (size_id = %llu) address = 0x%llx -- SUCCESS (already enabled)", site_id, (uint64_t)addr); 2085 return error; 2086 } 2087 else 2088 { 2089 const size_t bp_op_size = GetSoftwareBreakpointTrapOpcode (bp_site); 2090 2091 if (bp_site->HardwarePreferred()) 2092 { 2093 // Try and set hardware breakpoint, and if that fails, fall through 2094 // and set a software breakpoint? 2095 if (m_gdb_comm.SupportsGDBStoppointPacket (eBreakpointHardware)) 2096 { 2097 if (m_gdb_comm.SendGDBStoppointTypePacket(eBreakpointHardware, true, addr, bp_op_size) == 0) 2098 { 2099 bp_site->SetEnabled(true); 2100 bp_site->SetType (BreakpointSite::eHardware); 2101 return error; 2102 } 2103 } 2104 } 2105 2106 if (m_gdb_comm.SupportsGDBStoppointPacket (eBreakpointSoftware)) 2107 { 2108 if (m_gdb_comm.SendGDBStoppointTypePacket(eBreakpointSoftware, true, addr, bp_op_size) == 0) 2109 { 2110 bp_site->SetEnabled(true); 2111 bp_site->SetType (BreakpointSite::eExternal); 2112 return error; 2113 } 2114 } 2115 2116 return EnableSoftwareBreakpoint (bp_site); 2117 } 2118 2119 if (log) 2120 { 2121 const char *err_string = error.AsCString(); 2122 log->Printf ("ProcessGDBRemote::EnableBreakpoint() error for breakpoint at 0x%8.8llx: %s", 2123 bp_site->GetLoadAddress(), 2124 err_string ? err_string : "NULL"); 2125 } 2126 // We shouldn't reach here on a successful breakpoint enable... 2127 if (error.Success()) 2128 error.SetErrorToGenericError(); 2129 return error; 2130} 2131 2132Error 2133ProcessGDBRemote::DisableBreakpoint (BreakpointSite *bp_site) 2134{ 2135 Error error; 2136 assert (bp_site != NULL); 2137 addr_t addr = bp_site->GetLoadAddress(); 2138 user_id_t site_id = bp_site->GetID(); 2139 LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_BREAKPOINTS)); 2140 if (log) 2141 log->Printf ("ProcessGDBRemote::DisableBreakpoint (site_id = %llu) addr = 0x%8.8llx", site_id, (uint64_t)addr); 2142 2143 if (bp_site->IsEnabled()) 2144 { 2145 const size_t bp_op_size = GetSoftwareBreakpointTrapOpcode (bp_site); 2146 2147 BreakpointSite::Type bp_type = bp_site->GetType(); 2148 switch (bp_type) 2149 { 2150 case BreakpointSite::eSoftware: 2151 error = DisableSoftwareBreakpoint (bp_site); 2152 break; 2153 2154 case BreakpointSite::eHardware: 2155 if (m_gdb_comm.SendGDBStoppointTypePacket(eBreakpointSoftware, false, addr, bp_op_size)) 2156 error.SetErrorToGenericError(); 2157 break; 2158 2159 case BreakpointSite::eExternal: 2160 if (m_gdb_comm.SendGDBStoppointTypePacket(eBreakpointSoftware, false, addr, bp_op_size)) 2161 error.SetErrorToGenericError(); 2162 break; 2163 } 2164 if (error.Success()) 2165 bp_site->SetEnabled(false); 2166 } 2167 else 2168 { 2169 if (log) 2170 log->Printf ("ProcessGDBRemote::DisableBreakpoint (site_id = %llu) addr = 0x%8.8llx -- SUCCESS (already disabled)", site_id, (uint64_t)addr); 2171 return error; 2172 } 2173 2174 if (error.Success()) 2175 error.SetErrorToGenericError(); 2176 return error; 2177} 2178 2179// Pre-requisite: wp != NULL. 2180static GDBStoppointType 2181GetGDBStoppointType (Watchpoint *wp) 2182{ 2183 assert(wp); 2184 bool watch_read = wp->WatchpointRead(); 2185 bool watch_write = wp->WatchpointWrite(); 2186 2187 // watch_read and watch_write cannot both be false. 2188 assert(watch_read || watch_write); 2189 if (watch_read && watch_write) 2190 return eWatchpointReadWrite; 2191 else if (watch_read) 2192 return eWatchpointRead; 2193 else // Must be watch_write, then. 2194 return eWatchpointWrite; 2195} 2196 2197Error 2198ProcessGDBRemote::EnableWatchpoint (Watchpoint *wp) 2199{ 2200 Error error; 2201 if (wp) 2202 { 2203 user_id_t watchID = wp->GetID(); 2204 addr_t addr = wp->GetLoadAddress(); 2205 LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_WATCHPOINTS)); 2206 if (log) 2207 log->Printf ("ProcessGDBRemote::EnableWatchpoint(watchID = %llu)", watchID); 2208 if (wp->IsEnabled()) 2209 { 2210 if (log) 2211 log->Printf("ProcessGDBRemote::EnableWatchpoint(watchID = %llu) addr = 0x%8.8llx: watchpoint already enabled.", watchID, (uint64_t)addr); 2212 return error; 2213 } 2214 2215 GDBStoppointType type = GetGDBStoppointType(wp); 2216 // Pass down an appropriate z/Z packet... 2217 if (m_gdb_comm.SupportsGDBStoppointPacket (type)) 2218 { 2219 if (m_gdb_comm.SendGDBStoppointTypePacket(type, true, addr, wp->GetByteSize()) == 0) 2220 { 2221 wp->SetEnabled(true); 2222 return error; 2223 } 2224 else 2225 error.SetErrorString("sending gdb watchpoint packet failed"); 2226 } 2227 else 2228 error.SetErrorString("watchpoints not supported"); 2229 } 2230 else 2231 { 2232 error.SetErrorString("Watchpoint argument was NULL."); 2233 } 2234 if (error.Success()) 2235 error.SetErrorToGenericError(); 2236 return error; 2237} 2238 2239Error 2240ProcessGDBRemote::DisableWatchpoint (Watchpoint *wp) 2241{ 2242 Error error; 2243 if (wp) 2244 { 2245 user_id_t watchID = wp->GetID(); 2246 2247 LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_WATCHPOINTS)); 2248 2249 addr_t addr = wp->GetLoadAddress(); 2250 if (log) 2251 log->Printf ("ProcessGDBRemote::DisableWatchpoint (watchID = %llu) addr = 0x%8.8llx", watchID, (uint64_t)addr); 2252 2253 if (!wp->IsEnabled()) 2254 { 2255 if (log) 2256 log->Printf ("ProcessGDBRemote::DisableWatchpoint (watchID = %llu) addr = 0x%8.8llx -- SUCCESS (already disabled)", watchID, (uint64_t)addr); 2257 // See also 'class WatchpointSentry' within StopInfo.cpp. 2258 // This disabling attempt might come from the user-supplied actions, we'll route it in order for 2259 // the watchpoint object to intelligently process this action. 2260 wp->SetEnabled(false); 2261 return error; 2262 } 2263 2264 if (wp->IsHardware()) 2265 { 2266 GDBStoppointType type = GetGDBStoppointType(wp); 2267 // Pass down an appropriate z/Z packet... 2268 if (m_gdb_comm.SendGDBStoppointTypePacket(type, false, addr, wp->GetByteSize()) == 0) 2269 { 2270 wp->SetEnabled(false); 2271 return error; 2272 } 2273 else 2274 error.SetErrorString("sending gdb watchpoint packet failed"); 2275 } 2276 // TODO: clear software watchpoints if we implement them 2277 } 2278 else 2279 { 2280 error.SetErrorString("Watchpoint argument was NULL."); 2281 } 2282 if (error.Success()) 2283 error.SetErrorToGenericError(); 2284 return error; 2285} 2286 2287void 2288ProcessGDBRemote::Clear() 2289{ 2290 m_flags = 0; 2291 m_thread_list.Clear(); 2292} 2293 2294Error 2295ProcessGDBRemote::DoSignal (int signo) 2296{ 2297 Error error; 2298 LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_PROCESS)); 2299 if (log) 2300 log->Printf ("ProcessGDBRemote::DoSignal (signal = %d)", signo); 2301 2302 if (!m_gdb_comm.SendAsyncSignal (signo)) 2303 error.SetErrorStringWithFormat("failed to send signal %i", signo); 2304 return error; 2305} 2306 2307Error 2308ProcessGDBRemote::StartDebugserverProcess (const char *debugserver_url) 2309{ 2310 ProcessLaunchInfo launch_info; 2311 return StartDebugserverProcess(debugserver_url, launch_info); 2312} 2313 2314Error 2315ProcessGDBRemote::StartDebugserverProcess (const char *debugserver_url, const ProcessInfo &process_info) // The connection string to use in the spawned debugserver ("localhost:1234" or "/dev/tty...") 2316{ 2317 Error error; 2318 if (m_debugserver_pid == LLDB_INVALID_PROCESS_ID) 2319 { 2320 // If we locate debugserver, keep that located version around 2321 static FileSpec g_debugserver_file_spec; 2322 2323 ProcessLaunchInfo debugserver_launch_info; 2324 char debugserver_path[PATH_MAX]; 2325 FileSpec &debugserver_file_spec = debugserver_launch_info.GetExecutableFile(); 2326 2327 // Always check to see if we have an environment override for the path 2328 // to the debugserver to use and use it if we do. 2329 const char *env_debugserver_path = getenv("LLDB_DEBUGSERVER_PATH"); 2330 if (env_debugserver_path) 2331 debugserver_file_spec.SetFile (env_debugserver_path, false); 2332 else 2333 debugserver_file_spec = g_debugserver_file_spec; 2334 bool debugserver_exists = debugserver_file_spec.Exists(); 2335 if (!debugserver_exists) 2336 { 2337 // The debugserver binary is in the LLDB.framework/Resources 2338 // directory. 2339 if (Host::GetLLDBPath (ePathTypeSupportExecutableDir, debugserver_file_spec)) 2340 { 2341 debugserver_file_spec.GetFilename().SetCString(DEBUGSERVER_BASENAME); 2342 debugserver_exists = debugserver_file_spec.Exists(); 2343 if (debugserver_exists) 2344 { 2345 g_debugserver_file_spec = debugserver_file_spec; 2346 } 2347 else 2348 { 2349 g_debugserver_file_spec.Clear(); 2350 debugserver_file_spec.Clear(); 2351 } 2352 } 2353 } 2354 2355 if (debugserver_exists) 2356 { 2357 debugserver_file_spec.GetPath (debugserver_path, sizeof(debugserver_path)); 2358 2359 m_stdio_communication.Clear(); 2360 2361 LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PROCESS)); 2362 2363 Args &debugserver_args = debugserver_launch_info.GetArguments(); 2364 char arg_cstr[PATH_MAX]; 2365 2366 // Start args with "debugserver /file/path -r --" 2367 debugserver_args.AppendArgument(debugserver_path); 2368 debugserver_args.AppendArgument(debugserver_url); 2369 // use native registers, not the GDB registers 2370 debugserver_args.AppendArgument("--native-regs"); 2371 // make debugserver run in its own session so signals generated by 2372 // special terminal key sequences (^C) don't affect debugserver 2373 debugserver_args.AppendArgument("--setsid"); 2374 2375 const char *env_debugserver_log_file = getenv("LLDB_DEBUGSERVER_LOG_FILE"); 2376 if (env_debugserver_log_file) 2377 { 2378 ::snprintf (arg_cstr, sizeof(arg_cstr), "--log-file=%s", env_debugserver_log_file); 2379 debugserver_args.AppendArgument(arg_cstr); 2380 } 2381 2382 const char *env_debugserver_log_flags = getenv("LLDB_DEBUGSERVER_LOG_FLAGS"); 2383 if (env_debugserver_log_flags) 2384 { 2385 ::snprintf (arg_cstr, sizeof(arg_cstr), "--log-flags=%s", env_debugserver_log_flags); 2386 debugserver_args.AppendArgument(arg_cstr); 2387 } 2388 debugserver_args.AppendArgument("--log-file=/tmp/debugserver.txt"); 2389 debugserver_args.AppendArgument("--log-flags=0x802e0e"); 2390 2391 // We currently send down all arguments, attach pids, or attach 2392 // process names in dedicated GDB server packets, so we don't need 2393 // to pass them as arguments. This is currently because of all the 2394 // things we need to setup prior to launching: the environment, 2395 // current working dir, file actions, etc. 2396#if 0 2397 // Now append the program arguments 2398 if (inferior_argv) 2399 { 2400 // Terminate the debugserver args so we can now append the inferior args 2401 debugserver_args.AppendArgument("--"); 2402 2403 for (int i = 0; inferior_argv[i] != NULL; ++i) 2404 debugserver_args.AppendArgument (inferior_argv[i]); 2405 } 2406 else if (attach_pid != LLDB_INVALID_PROCESS_ID) 2407 { 2408 ::snprintf (arg_cstr, sizeof(arg_cstr), "--attach=%u", attach_pid); 2409 debugserver_args.AppendArgument (arg_cstr); 2410 } 2411 else if (attach_name && attach_name[0]) 2412 { 2413 if (wait_for_launch) 2414 debugserver_args.AppendArgument ("--waitfor"); 2415 else 2416 debugserver_args.AppendArgument ("--attach"); 2417 debugserver_args.AppendArgument (attach_name); 2418 } 2419#endif 2420 2421 ProcessLaunchInfo::FileAction file_action; 2422 2423 // Close STDIN, STDOUT and STDERR. We might need to redirect them 2424 // to "/dev/null" if we run into any problems. 2425 file_action.Close (STDIN_FILENO); 2426 debugserver_launch_info.AppendFileAction (file_action); 2427 file_action.Close (STDOUT_FILENO); 2428 debugserver_launch_info.AppendFileAction (file_action); 2429 file_action.Close (STDERR_FILENO); 2430 debugserver_launch_info.AppendFileAction (file_action); 2431 2432 if (log) 2433 { 2434 StreamString strm; 2435 debugserver_args.Dump (&strm); 2436 log->Printf("%s arguments:\n%s", debugserver_args.GetArgumentAtIndex(0), strm.GetData()); 2437 } 2438 2439 debugserver_launch_info.SetMonitorProcessCallback (MonitorDebugserverProcess, this, false); 2440 debugserver_launch_info.SetUserID(process_info.GetUserID()); 2441 2442 error = Host::LaunchProcess(debugserver_launch_info); 2443 2444 if (error.Success ()) 2445 m_debugserver_pid = debugserver_launch_info.GetProcessID(); 2446 else 2447 m_debugserver_pid = LLDB_INVALID_PROCESS_ID; 2448 2449 if (error.Fail() || log) 2450 error.PutToLog(log.get(), "Host::LaunchProcess (launch_info) => pid=%llu, path='%s'", m_debugserver_pid, debugserver_path); 2451 } 2452 else 2453 { 2454 error.SetErrorStringWithFormat ("unable to locate " DEBUGSERVER_BASENAME); 2455 } 2456 2457 if (m_debugserver_pid != LLDB_INVALID_PROCESS_ID) 2458 StartAsyncThread (); 2459 } 2460 return error; 2461} 2462 2463bool 2464ProcessGDBRemote::MonitorDebugserverProcess 2465( 2466 void *callback_baton, 2467 lldb::pid_t debugserver_pid, 2468 bool exited, // True if the process did exit 2469 int signo, // Zero for no signal 2470 int exit_status // Exit value of process if signal is zero 2471) 2472{ 2473 // The baton is a "ProcessGDBRemote *". Now this class might be gone 2474 // and might not exist anymore, so we need to carefully try to get the 2475 // target for this process first since we have a race condition when 2476 // we are done running between getting the notice that the inferior 2477 // process has died and the debugserver that was debugging this process. 2478 // In our test suite, we are also continually running process after 2479 // process, so we must be very careful to make sure: 2480 // 1 - process object hasn't been deleted already 2481 // 2 - that a new process object hasn't been recreated in its place 2482 2483 // "debugserver_pid" argument passed in is the process ID for 2484 // debugserver that we are tracking... 2485 LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_PROCESS)); 2486 2487 ProcessGDBRemote *process = (ProcessGDBRemote *)callback_baton; 2488 2489 // Get a shared pointer to the target that has a matching process pointer. 2490 // This target could be gone, or the target could already have a new process 2491 // object inside of it 2492 TargetSP target_sp (Debugger::FindTargetWithProcess(process)); 2493 2494 if (log) 2495 log->Printf ("ProcessGDBRemote::MonitorDebugserverProcess (baton=%p, pid=%llu, signo=%i (0x%x), exit_status=%i)", callback_baton, debugserver_pid, signo, signo, exit_status); 2496 2497 if (target_sp) 2498 { 2499 // We found a process in a target that matches, but another thread 2500 // might be in the process of launching a new process that will 2501 // soon replace it, so get a shared pointer to the process so we 2502 // can keep it alive. 2503 ProcessSP process_sp (target_sp->GetProcessSP()); 2504 // Now we have a shared pointer to the process that can't go away on us 2505 // so we now make sure it was the same as the one passed in, and also make 2506 // sure that our previous "process *" didn't get deleted and have a new 2507 // "process *" created in its place with the same pointer. To verify this 2508 // we make sure the process has our debugserver process ID. If we pass all 2509 // of these tests, then we are sure that this process is the one we were 2510 // looking for. 2511 if (process_sp && process == process_sp.get() && process->m_debugserver_pid == debugserver_pid) 2512 { 2513 // Sleep for a half a second to make sure our inferior process has 2514 // time to set its exit status before we set it incorrectly when 2515 // both the debugserver and the inferior process shut down. 2516 usleep (500000); 2517 // If our process hasn't yet exited, debugserver might have died. 2518 // If the process did exit, the we are reaping it. 2519 const StateType state = process->GetState(); 2520 2521 if (process->m_debugserver_pid != LLDB_INVALID_PROCESS_ID && 2522 state != eStateInvalid && 2523 state != eStateUnloaded && 2524 state != eStateExited && 2525 state != eStateDetached) 2526 { 2527 char error_str[1024]; 2528 if (signo) 2529 { 2530 const char *signal_cstr = process->GetUnixSignals().GetSignalAsCString (signo); 2531 if (signal_cstr) 2532 ::snprintf (error_str, sizeof (error_str), DEBUGSERVER_BASENAME " died with signal %s", signal_cstr); 2533 else 2534 ::snprintf (error_str, sizeof (error_str), DEBUGSERVER_BASENAME " died with signal %i", signo); 2535 } 2536 else 2537 { 2538 ::snprintf (error_str, sizeof (error_str), DEBUGSERVER_BASENAME " died with an exit status of 0x%8.8x", exit_status); 2539 } 2540 2541 process->SetExitStatus (-1, error_str); 2542 } 2543 // Debugserver has exited we need to let our ProcessGDBRemote 2544 // know that it no longer has a debugserver instance 2545 process->m_debugserver_pid = LLDB_INVALID_PROCESS_ID; 2546 } 2547 } 2548 return true; 2549} 2550 2551void 2552ProcessGDBRemote::KillDebugserverProcess () 2553{ 2554 if (m_debugserver_pid != LLDB_INVALID_PROCESS_ID) 2555 { 2556 ::kill (m_debugserver_pid, SIGINT); 2557 m_debugserver_pid = LLDB_INVALID_PROCESS_ID; 2558 } 2559} 2560 2561void 2562ProcessGDBRemote::Initialize() 2563{ 2564 static bool g_initialized = false; 2565 2566 if (g_initialized == false) 2567 { 2568 g_initialized = true; 2569 PluginManager::RegisterPlugin (GetPluginNameStatic(), 2570 GetPluginDescriptionStatic(), 2571 CreateInstance); 2572 2573 Log::Callbacks log_callbacks = { 2574 ProcessGDBRemoteLog::DisableLog, 2575 ProcessGDBRemoteLog::EnableLog, 2576 ProcessGDBRemoteLog::ListLogCategories 2577 }; 2578 2579 Log::RegisterLogChannel (ProcessGDBRemote::GetPluginNameStatic(), log_callbacks); 2580 } 2581} 2582 2583bool 2584ProcessGDBRemote::StartAsyncThread () 2585{ 2586 LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_PROCESS)); 2587 2588 if (log) 2589 log->Printf ("ProcessGDBRemote::%s ()", __FUNCTION__); 2590 2591 // Create a thread that watches our internal state and controls which 2592 // events make it to clients (into the DCProcess event queue). 2593 m_async_thread = Host::ThreadCreate ("<lldb.process.gdb-remote.async>", ProcessGDBRemote::AsyncThread, this, NULL); 2594 return IS_VALID_LLDB_HOST_THREAD(m_async_thread); 2595} 2596 2597void 2598ProcessGDBRemote::StopAsyncThread () 2599{ 2600 LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet(GDBR_LOG_PROCESS)); 2601 2602 if (log) 2603 log->Printf ("ProcessGDBRemote::%s ()", __FUNCTION__); 2604 2605 m_async_broadcaster.BroadcastEvent (eBroadcastBitAsyncThreadShouldExit); 2606 2607 // This will shut down the async thread. 2608 m_gdb_comm.Disconnect(); // Disconnect from the debug server. 2609 2610 // Stop the stdio thread 2611 if (IS_VALID_LLDB_HOST_THREAD(m_async_thread)) 2612 { 2613 Host::ThreadJoin (m_async_thread, NULL, NULL); 2614 } 2615} 2616 2617 2618void * 2619ProcessGDBRemote::AsyncThread (void *arg) 2620{ 2621 ProcessGDBRemote *process = (ProcessGDBRemote*) arg; 2622 2623 LogSP log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PROCESS)); 2624 if (log) 2625 log->Printf ("ProcessGDBRemote::%s (arg = %p, pid = %llu) thread starting...", __FUNCTION__, arg, process->GetID()); 2626 2627 Listener listener ("ProcessGDBRemote::AsyncThread"); 2628 EventSP event_sp; 2629 const uint32_t desired_event_mask = eBroadcastBitAsyncContinue | 2630 eBroadcastBitAsyncThreadShouldExit; 2631 2632 if (listener.StartListeningForEvents (&process->m_async_broadcaster, desired_event_mask) == desired_event_mask) 2633 { 2634 listener.StartListeningForEvents (&process->m_gdb_comm, Communication::eBroadcastBitReadThreadDidExit); 2635 2636 bool done = false; 2637 while (!done) 2638 { 2639 if (log) 2640 log->Printf ("ProcessGDBRemote::%s (arg = %p, pid = %llu) listener.WaitForEvent (NULL, event_sp)...", __FUNCTION__, arg, process->GetID()); 2641 if (listener.WaitForEvent (NULL, event_sp)) 2642 { 2643 const uint32_t event_type = event_sp->GetType(); 2644 if (event_sp->BroadcasterIs (&process->m_async_broadcaster)) 2645 { 2646 if (log) 2647 log->Printf ("ProcessGDBRemote::%s (arg = %p, pid = %llu) Got an event of type: %d...", __FUNCTION__, arg, process->GetID(), event_type); 2648 2649 switch (event_type) 2650 { 2651 case eBroadcastBitAsyncContinue: 2652 { 2653 const EventDataBytes *continue_packet = EventDataBytes::GetEventDataFromEvent(event_sp.get()); 2654 2655 if (continue_packet) 2656 { 2657 const char *continue_cstr = (const char *)continue_packet->GetBytes (); 2658 const size_t continue_cstr_len = continue_packet->GetByteSize (); 2659 if (log) 2660 log->Printf ("ProcessGDBRemote::%s (arg = %p, pid = %llu) got eBroadcastBitAsyncContinue: %s", __FUNCTION__, arg, process->GetID(), continue_cstr); 2661 2662 if (::strstr (continue_cstr, "vAttach") == NULL) 2663 process->SetPrivateState(eStateRunning); 2664 StringExtractorGDBRemote response; 2665 StateType stop_state = process->GetGDBRemote().SendContinuePacketAndWaitForResponse (process, continue_cstr, continue_cstr_len, response); 2666 2667 // We need to immediately clear the thread ID list so we are sure to get a valid list of threads. 2668 // The thread ID list might be contained within the "response", or the stop reply packet that 2669 // caused the stop. So clear it now before we give the stop reply packet to the process 2670 // using the process->SetLastStopPacket()... 2671 process->ClearThreadIDList (); 2672 2673 switch (stop_state) 2674 { 2675 case eStateStopped: 2676 case eStateCrashed: 2677 case eStateSuspended: 2678 process->SetLastStopPacket (response); 2679 process->SetPrivateState (stop_state); 2680 break; 2681 2682 case eStateExited: 2683 process->SetLastStopPacket (response); 2684 process->ClearThreadIDList(); 2685 response.SetFilePos(1); 2686 process->SetExitStatus(response.GetHexU8(), NULL); 2687 done = true; 2688 break; 2689 2690 case eStateInvalid: 2691 process->SetExitStatus(-1, "lost connection"); 2692 break; 2693 2694 default: 2695 process->SetPrivateState (stop_state); 2696 break; 2697 } 2698 } 2699 } 2700 break; 2701 2702 case eBroadcastBitAsyncThreadShouldExit: 2703 if (log) 2704 log->Printf ("ProcessGDBRemote::%s (arg = %p, pid = %llu) got eBroadcastBitAsyncThreadShouldExit...", __FUNCTION__, arg, process->GetID()); 2705 done = true; 2706 break; 2707 2708 default: 2709 if (log) 2710 log->Printf ("ProcessGDBRemote::%s (arg = %p, pid = %llu) got unknown event 0x%8.8x", __FUNCTION__, arg, process->GetID(), event_type); 2711 done = true; 2712 break; 2713 } 2714 } 2715 else if (event_sp->BroadcasterIs (&process->m_gdb_comm)) 2716 { 2717 if (event_type & Communication::eBroadcastBitReadThreadDidExit) 2718 { 2719 process->SetExitStatus (-1, "lost connection"); 2720 done = true; 2721 } 2722 } 2723 } 2724 else 2725 { 2726 if (log) 2727 log->Printf ("ProcessGDBRemote::%s (arg = %p, pid = %llu) listener.WaitForEvent (NULL, event_sp) => false", __FUNCTION__, arg, process->GetID()); 2728 done = true; 2729 } 2730 } 2731 } 2732 2733 if (log) 2734 log->Printf ("ProcessGDBRemote::%s (arg = %p, pid = %llu) thread exiting...", __FUNCTION__, arg, process->GetID()); 2735 2736 process->m_async_thread = LLDB_INVALID_HOST_THREAD; 2737 return NULL; 2738} 2739 2740const char * 2741ProcessGDBRemote::GetDispatchQueueNameForThread 2742( 2743 addr_t thread_dispatch_qaddr, 2744 std::string &dispatch_queue_name 2745) 2746{ 2747 dispatch_queue_name.clear(); 2748 if (thread_dispatch_qaddr != 0 && thread_dispatch_qaddr != LLDB_INVALID_ADDRESS) 2749 { 2750 // Cache the dispatch_queue_offsets_addr value so we don't always have 2751 // to look it up 2752 if (m_dispatch_queue_offsets_addr == LLDB_INVALID_ADDRESS) 2753 { 2754 static ConstString g_dispatch_queue_offsets_symbol_name ("dispatch_queue_offsets"); 2755 const Symbol *dispatch_queue_offsets_symbol = NULL; 2756 ModuleSpec libSystem_module_spec (FileSpec("libSystem.B.dylib", false)); 2757 ModuleSP module_sp(GetTarget().GetImages().FindFirstModule (libSystem_module_spec)); 2758 if (module_sp) 2759 dispatch_queue_offsets_symbol = module_sp->FindFirstSymbolWithNameAndType (g_dispatch_queue_offsets_symbol_name, eSymbolTypeData); 2760 2761 if (dispatch_queue_offsets_symbol == NULL) 2762 { 2763 ModuleSpec libdispatch_module_spec (FileSpec("libdispatch.dylib", false)); 2764 module_sp = GetTarget().GetImages().FindFirstModule (libdispatch_module_spec); 2765 if (module_sp) 2766 dispatch_queue_offsets_symbol = module_sp->FindFirstSymbolWithNameAndType (g_dispatch_queue_offsets_symbol_name, eSymbolTypeData); 2767 } 2768 if (dispatch_queue_offsets_symbol) 2769 m_dispatch_queue_offsets_addr = dispatch_queue_offsets_symbol->GetAddress().GetLoadAddress(&m_target); 2770 2771 if (m_dispatch_queue_offsets_addr == LLDB_INVALID_ADDRESS) 2772 return NULL; 2773 } 2774 2775 uint8_t memory_buffer[8]; 2776 DataExtractor data (memory_buffer, 2777 sizeof(memory_buffer), 2778 m_target.GetArchitecture().GetByteOrder(), 2779 m_target.GetArchitecture().GetAddressByteSize()); 2780 2781 // Excerpt from src/queue_private.h 2782 struct dispatch_queue_offsets_s 2783 { 2784 uint16_t dqo_version; 2785 uint16_t dqo_label; 2786 uint16_t dqo_label_size; 2787 } dispatch_queue_offsets; 2788 2789 2790 Error error; 2791 if (ReadMemory (m_dispatch_queue_offsets_addr, memory_buffer, sizeof(dispatch_queue_offsets), error) == sizeof(dispatch_queue_offsets)) 2792 { 2793 uint32_t data_offset = 0; 2794 if (data.GetU16(&data_offset, &dispatch_queue_offsets.dqo_version, sizeof(dispatch_queue_offsets)/sizeof(uint16_t))) 2795 { 2796 if (ReadMemory (thread_dispatch_qaddr, &memory_buffer, data.GetAddressByteSize(), error) == data.GetAddressByteSize()) 2797 { 2798 data_offset = 0; 2799 lldb::addr_t queue_addr = data.GetAddress(&data_offset); 2800 lldb::addr_t label_addr = queue_addr + dispatch_queue_offsets.dqo_label; 2801 dispatch_queue_name.resize(dispatch_queue_offsets.dqo_label_size, '\0'); 2802 size_t bytes_read = ReadMemory (label_addr, &dispatch_queue_name[0], dispatch_queue_offsets.dqo_label_size, error); 2803 if (bytes_read < dispatch_queue_offsets.dqo_label_size) 2804 dispatch_queue_name.erase (bytes_read); 2805 } 2806 } 2807 } 2808 } 2809 if (dispatch_queue_name.empty()) 2810 return NULL; 2811 return dispatch_queue_name.c_str(); 2812} 2813 2814//uint32_t 2815//ProcessGDBRemote::ListProcessesMatchingName (const char *name, StringList &matches, std::vector<lldb::pid_t> &pids) 2816//{ 2817// // If we are planning to launch the debugserver remotely, then we need to fire up a debugserver 2818// // process and ask it for the list of processes. But if we are local, we can let the Host do it. 2819// if (m_local_debugserver) 2820// { 2821// return Host::ListProcessesMatchingName (name, matches, pids); 2822// } 2823// else 2824// { 2825// // FIXME: Implement talking to the remote debugserver. 2826// return 0; 2827// } 2828// 2829//} 2830// 2831bool 2832ProcessGDBRemote::NewThreadNotifyBreakpointHit (void *baton, 2833 lldb_private::StoppointCallbackContext *context, 2834 lldb::user_id_t break_id, 2835 lldb::user_id_t break_loc_id) 2836{ 2837 // I don't think I have to do anything here, just make sure I notice the new thread when it starts to 2838 // run so I can stop it if that's what I want to do. 2839 LogSP log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP)); 2840 if (log) 2841 log->Printf("Hit New Thread Notification breakpoint."); 2842 return false; 2843} 2844 2845 2846bool 2847ProcessGDBRemote::StartNoticingNewThreads() 2848{ 2849 LogSP log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP)); 2850 if (m_thread_create_bp_sp) 2851 { 2852 if (log && log->GetVerbose()) 2853 log->Printf("Enabled noticing new thread breakpoint."); 2854 m_thread_create_bp_sp->SetEnabled(true); 2855 } 2856 else 2857 { 2858 PlatformSP platform_sp (m_target.GetPlatform()); 2859 if (platform_sp) 2860 { 2861 m_thread_create_bp_sp = platform_sp->SetThreadCreationBreakpoint(m_target); 2862 if (m_thread_create_bp_sp) 2863 { 2864 if (log && log->GetVerbose()) 2865 log->Printf("Successfully created new thread notification breakpoint %i", m_thread_create_bp_sp->GetID()); 2866 m_thread_create_bp_sp->SetCallback (ProcessGDBRemote::NewThreadNotifyBreakpointHit, this, true); 2867 } 2868 else 2869 { 2870 if (log) 2871 log->Printf("Failed to create new thread notification breakpoint."); 2872 } 2873 } 2874 } 2875 return m_thread_create_bp_sp.get() != NULL; 2876} 2877 2878bool 2879ProcessGDBRemote::StopNoticingNewThreads() 2880{ 2881 LogSP log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP)); 2882 if (log && log->GetVerbose()) 2883 log->Printf ("Disabling new thread notification breakpoint."); 2884 2885 if (m_thread_create_bp_sp) 2886 m_thread_create_bp_sp->SetEnabled(false); 2887 2888 return true; 2889} 2890 2891 2892