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