1 //===-- NativeProcessLinux.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 #include "NativeProcessLinux.h" 13 14 // C Includes 15 #include <errno.h> 16 #include <poll.h> 17 #include <string.h> 18 #include <stdint.h> 19 #include <unistd.h> 20 21 // C++ Includes 22 #include <fstream> 23 #include <sstream> 24 #include <string> 25 26 // Other libraries and framework includes 27 #include "lldb/Core/Debugger.h" 28 #include "lldb/Core/EmulateInstruction.h" 29 #include "lldb/Core/Error.h" 30 #include "lldb/Core/Module.h" 31 #include "lldb/Core/ModuleSpec.h" 32 #include "lldb/Core/RegisterValue.h" 33 #include "lldb/Core/Scalar.h" 34 #include "lldb/Core/State.h" 35 #include "lldb/Host/common/NativeBreakpoint.h" 36 #include "lldb/Host/common/NativeRegisterContext.h" 37 #include "lldb/Host/Host.h" 38 #include "lldb/Host/HostInfo.h" 39 #include "lldb/Host/HostNativeThread.h" 40 #include "lldb/Host/ThreadLauncher.h" 41 #include "lldb/Symbol/ObjectFile.h" 42 #include "lldb/Target/Process.h" 43 #include "lldb/Target/ProcessLaunchInfo.h" 44 #include "lldb/Utility/LLDBAssert.h" 45 #include "lldb/Utility/PseudoTerminal.h" 46 47 #include "Plugins/Process/POSIX/ProcessPOSIXLog.h" 48 #include "Plugins/Process/Utility/LinuxSignals.h" 49 #include "Utility/StringExtractor.h" 50 #include "NativeThreadLinux.h" 51 #include "ProcFileReader.h" 52 #include "Procfs.h" 53 54 // System includes - They have to be included after framework includes because they define some 55 // macros which collide with variable names in other modules 56 #include <linux/unistd.h> 57 #include <sys/socket.h> 58 59 #include <sys/types.h> 60 #include <sys/uio.h> 61 #include <sys/user.h> 62 #include <sys/wait.h> 63 64 #if defined (__arm64__) || defined (__aarch64__) 65 // NT_PRSTATUS and NT_FPREGSET definition 66 #include <elf.h> 67 #endif 68 69 #include "lldb/Host/linux/Personality.h" 70 #include "lldb/Host/linux/Ptrace.h" 71 #include "lldb/Host/linux/Signalfd.h" 72 #include "lldb/Host/android/Android.h" 73 74 #define LLDB_PERSONALITY_GET_CURRENT_SETTINGS 0xffffffff 75 76 // Support hardware breakpoints in case it has not been defined 77 #ifndef TRAP_HWBKPT 78 #define TRAP_HWBKPT 4 79 #endif 80 81 // We disable the tracing of ptrace calls for integration builds to 82 // avoid the additional indirection and checks. 83 #ifndef LLDB_CONFIGURATION_BUILDANDINTEGRATION 84 #define PTRACE(req, pid, addr, data, data_size, error) \ 85 PtraceWrapper((req), (pid), (addr), (data), (data_size), (error), #req, __FILE__, __LINE__) 86 #else 87 #define PTRACE(req, pid, addr, data, data_size, error) \ 88 PtraceWrapper((req), (pid), (addr), (data), (data_size), (error)) 89 #endif 90 91 using namespace lldb; 92 using namespace lldb_private; 93 using namespace lldb_private::process_linux; 94 using namespace llvm; 95 96 // Private bits we only need internally. 97 namespace 98 { 99 const UnixSignals& 100 GetUnixSignals () 101 { 102 static process_linux::LinuxSignals signals; 103 return signals; 104 } 105 106 Error 107 ResolveProcessArchitecture (lldb::pid_t pid, Platform &platform, ArchSpec &arch) 108 { 109 // Grab process info for the running process. 110 ProcessInstanceInfo process_info; 111 if (!platform.GetProcessInfo (pid, process_info)) 112 return Error("failed to get process info"); 113 114 // Resolve the executable module. 115 ModuleSP exe_module_sp; 116 ModuleSpec exe_module_spec(process_info.GetExecutableFile(), process_info.GetArchitecture()); 117 FileSpecList executable_search_paths (Target::GetDefaultExecutableSearchPaths ()); 118 Error error = platform.ResolveExecutable( 119 exe_module_spec, 120 exe_module_sp, 121 executable_search_paths.GetSize () ? &executable_search_paths : NULL); 122 123 if (!error.Success ()) 124 return error; 125 126 // Check if we've got our architecture from the exe_module. 127 arch = exe_module_sp->GetArchitecture (); 128 if (arch.IsValid ()) 129 return Error(); 130 else 131 return Error("failed to retrieve a valid architecture from the exe module"); 132 } 133 134 void 135 DisplayBytes (StreamString &s, void *bytes, uint32_t count) 136 { 137 uint8_t *ptr = (uint8_t *)bytes; 138 const uint32_t loop_count = std::min<uint32_t>(DEBUG_PTRACE_MAXBYTES, count); 139 for(uint32_t i=0; i<loop_count; i++) 140 { 141 s.Printf ("[%x]", *ptr); 142 ptr++; 143 } 144 } 145 146 void 147 PtraceDisplayBytes(int &req, void *data, size_t data_size) 148 { 149 StreamString buf; 150 Log *verbose_log (ProcessPOSIXLog::GetLogIfAllCategoriesSet ( 151 POSIX_LOG_PTRACE | POSIX_LOG_VERBOSE)); 152 153 if (verbose_log) 154 { 155 switch(req) 156 { 157 case PTRACE_POKETEXT: 158 { 159 DisplayBytes(buf, &data, 8); 160 verbose_log->Printf("PTRACE_POKETEXT %s", buf.GetData()); 161 break; 162 } 163 case PTRACE_POKEDATA: 164 { 165 DisplayBytes(buf, &data, 8); 166 verbose_log->Printf("PTRACE_POKEDATA %s", buf.GetData()); 167 break; 168 } 169 case PTRACE_POKEUSER: 170 { 171 DisplayBytes(buf, &data, 8); 172 verbose_log->Printf("PTRACE_POKEUSER %s", buf.GetData()); 173 break; 174 } 175 case PTRACE_SETREGS: 176 { 177 DisplayBytes(buf, data, data_size); 178 verbose_log->Printf("PTRACE_SETREGS %s", buf.GetData()); 179 break; 180 } 181 case PTRACE_SETFPREGS: 182 { 183 DisplayBytes(buf, data, data_size); 184 verbose_log->Printf("PTRACE_SETFPREGS %s", buf.GetData()); 185 break; 186 } 187 case PTRACE_SETSIGINFO: 188 { 189 DisplayBytes(buf, data, sizeof(siginfo_t)); 190 verbose_log->Printf("PTRACE_SETSIGINFO %s", buf.GetData()); 191 break; 192 } 193 case PTRACE_SETREGSET: 194 { 195 // Extract iov_base from data, which is a pointer to the struct IOVEC 196 DisplayBytes(buf, *(void **)data, data_size); 197 verbose_log->Printf("PTRACE_SETREGSET %s", buf.GetData()); 198 break; 199 } 200 default: 201 { 202 } 203 } 204 } 205 } 206 207 // Wrapper for ptrace to catch errors and log calls. 208 // Note that ptrace sets errno on error because -1 can be a valid result (i.e. for PTRACE_PEEK*) 209 long 210 PtraceWrapper(int req, lldb::pid_t pid, void *addr, void *data, size_t data_size, Error& error, 211 const char* reqName, const char* file, int line) 212 { 213 long int result; 214 215 Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_PTRACE)); 216 217 PtraceDisplayBytes(req, data, data_size); 218 219 error.Clear(); 220 errno = 0; 221 if (req == PTRACE_GETREGSET || req == PTRACE_SETREGSET) 222 result = ptrace(static_cast<__ptrace_request>(req), static_cast< ::pid_t>(pid), *(unsigned int *)addr, data); 223 else 224 result = ptrace(static_cast<__ptrace_request>(req), static_cast< ::pid_t>(pid), addr, data); 225 226 if (result == -1) 227 error.SetErrorToErrno(); 228 229 if (log) 230 log->Printf("ptrace(%s, %" PRIu64 ", %p, %p, %zu)=%lX called from file %s line %d", 231 reqName, pid, addr, data, data_size, result, file, line); 232 233 PtraceDisplayBytes(req, data, data_size); 234 235 if (log && error.GetError() != 0) 236 { 237 const char* str; 238 switch (error.GetError()) 239 { 240 case ESRCH: str = "ESRCH"; break; 241 case EINVAL: str = "EINVAL"; break; 242 case EBUSY: str = "EBUSY"; break; 243 case EPERM: str = "EPERM"; break; 244 default: str = error.AsCString(); 245 } 246 log->Printf("ptrace() failed; errno=%d (%s)", error.GetError(), str); 247 } 248 249 return result; 250 } 251 252 #ifdef LLDB_CONFIGURATION_BUILDANDINTEGRATION 253 // Wrapper for ptrace when logging is not required. 254 // Sets errno to 0 prior to calling ptrace. 255 long 256 PtraceWrapper(int req, lldb::pid_t pid, void *addr, void *data, size_t data_size, Error& error) 257 { 258 long result = 0; 259 260 error.Clear(); 261 errno = 0; 262 if (req == PTRACE_GETREGSET || req == PTRACE_SETREGSET) 263 result = ptrace(static_cast<__ptrace_request>(req), static_cast< ::pid_t>(pid), *(unsigned int *)addr, data); 264 else 265 result = ptrace(static_cast<__ptrace_request>(req), static_cast< ::pid_t>(pid), addr, data); 266 267 if (result == -1) 268 error.SetErrorToErrno(); 269 return result; 270 } 271 #endif 272 273 //------------------------------------------------------------------------------ 274 // Static implementations of NativeProcessLinux::ReadMemory and 275 // NativeProcessLinux::WriteMemory. This enables mutual recursion between these 276 // functions without needed to go thru the thread funnel. 277 278 size_t 279 DoReadMemory( 280 lldb::pid_t pid, 281 lldb::addr_t vm_addr, 282 void *buf, 283 size_t size, 284 Error &error) 285 { 286 // ptrace word size is determined by the host, not the child 287 static const unsigned word_size = sizeof(void*); 288 unsigned char *dst = static_cast<unsigned char*>(buf); 289 size_t bytes_read; 290 size_t remainder; 291 long data; 292 293 Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_ALL)); 294 if (log) 295 ProcessPOSIXLog::IncNestLevel(); 296 if (log && ProcessPOSIXLog::AtTopNestLevel() && log->GetMask().Test(POSIX_LOG_MEMORY)) 297 log->Printf ("NativeProcessLinux::%s(%" PRIu64 ", %d, %p, %p, %zd, _)", __FUNCTION__, 298 pid, word_size, (void*)vm_addr, buf, size); 299 300 assert(sizeof(data) >= word_size); 301 for (bytes_read = 0; bytes_read < size; bytes_read += remainder) 302 { 303 data = PTRACE(PTRACE_PEEKDATA, pid, (void*)vm_addr, nullptr, 0, error); 304 if (error.Fail()) 305 { 306 if (log) 307 ProcessPOSIXLog::DecNestLevel(); 308 return bytes_read; 309 } 310 311 remainder = size - bytes_read; 312 remainder = remainder > word_size ? word_size : remainder; 313 314 // Copy the data into our buffer 315 for (unsigned i = 0; i < remainder; ++i) 316 dst[i] = ((data >> i*8) & 0xFF); 317 318 if (log && ProcessPOSIXLog::AtTopNestLevel() && 319 (log->GetMask().Test(POSIX_LOG_MEMORY_DATA_LONG) || 320 (log->GetMask().Test(POSIX_LOG_MEMORY_DATA_SHORT) && 321 size <= POSIX_LOG_MEMORY_SHORT_BYTES))) 322 { 323 uintptr_t print_dst = 0; 324 // Format bytes from data by moving into print_dst for log output 325 for (unsigned i = 0; i < remainder; ++i) 326 print_dst |= (((data >> i*8) & 0xFF) << i*8); 327 log->Printf ("NativeProcessLinux::%s() [%p]:0x%lx (0x%lx)", __FUNCTION__, 328 (void*)vm_addr, print_dst, (unsigned long)data); 329 } 330 331 vm_addr += word_size; 332 dst += word_size; 333 } 334 335 if (log) 336 ProcessPOSIXLog::DecNestLevel(); 337 return bytes_read; 338 } 339 340 size_t 341 DoWriteMemory( 342 lldb::pid_t pid, 343 lldb::addr_t vm_addr, 344 const void *buf, 345 size_t size, 346 Error &error) 347 { 348 // ptrace word size is determined by the host, not the child 349 static const unsigned word_size = sizeof(void*); 350 const unsigned char *src = static_cast<const unsigned char*>(buf); 351 size_t bytes_written = 0; 352 size_t remainder; 353 354 Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_ALL)); 355 if (log) 356 ProcessPOSIXLog::IncNestLevel(); 357 if (log && ProcessPOSIXLog::AtTopNestLevel() && log->GetMask().Test(POSIX_LOG_MEMORY)) 358 log->Printf ("NativeProcessLinux::%s(%" PRIu64 ", %u, %p, %p, %" PRIu64 ")", __FUNCTION__, 359 pid, word_size, (void*)vm_addr, buf, size); 360 361 for (bytes_written = 0; bytes_written < size; bytes_written += remainder) 362 { 363 remainder = size - bytes_written; 364 remainder = remainder > word_size ? word_size : remainder; 365 366 if (remainder == word_size) 367 { 368 unsigned long data = 0; 369 assert(sizeof(data) >= word_size); 370 for (unsigned i = 0; i < word_size; ++i) 371 data |= (unsigned long)src[i] << i*8; 372 373 if (log && ProcessPOSIXLog::AtTopNestLevel() && 374 (log->GetMask().Test(POSIX_LOG_MEMORY_DATA_LONG) || 375 (log->GetMask().Test(POSIX_LOG_MEMORY_DATA_SHORT) && 376 size <= POSIX_LOG_MEMORY_SHORT_BYTES))) 377 log->Printf ("NativeProcessLinux::%s() [%p]:0x%lx (0x%lx)", __FUNCTION__, 378 (void*)vm_addr, *(const unsigned long*)src, data); 379 380 if (PTRACE(PTRACE_POKEDATA, pid, (void*)vm_addr, (void*)data, 0, error)) 381 { 382 if (log) 383 ProcessPOSIXLog::DecNestLevel(); 384 return bytes_written; 385 } 386 } 387 else 388 { 389 unsigned char buff[8]; 390 if (DoReadMemory(pid, vm_addr, 391 buff, word_size, error) != word_size) 392 { 393 if (log) 394 ProcessPOSIXLog::DecNestLevel(); 395 return bytes_written; 396 } 397 398 memcpy(buff, src, remainder); 399 400 if (DoWriteMemory(pid, vm_addr, 401 buff, word_size, error) != word_size) 402 { 403 if (log) 404 ProcessPOSIXLog::DecNestLevel(); 405 return bytes_written; 406 } 407 408 if (log && ProcessPOSIXLog::AtTopNestLevel() && 409 (log->GetMask().Test(POSIX_LOG_MEMORY_DATA_LONG) || 410 (log->GetMask().Test(POSIX_LOG_MEMORY_DATA_SHORT) && 411 size <= POSIX_LOG_MEMORY_SHORT_BYTES))) 412 log->Printf ("NativeProcessLinux::%s() [%p]:0x%lx (0x%lx)", __FUNCTION__, 413 (void*)vm_addr, *(const unsigned long*)src, *(unsigned long*)buff); 414 } 415 416 vm_addr += word_size; 417 src += word_size; 418 } 419 if (log) 420 ProcessPOSIXLog::DecNestLevel(); 421 return bytes_written; 422 } 423 424 //------------------------------------------------------------------------------ 425 /// @class Operation 426 /// @brief Represents a NativeProcessLinux operation. 427 /// 428 /// Under Linux, it is not possible to ptrace() from any other thread but the 429 /// one that spawned or attached to the process from the start. Therefore, when 430 /// a NativeProcessLinux is asked to deliver or change the state of an inferior 431 /// process the operation must be "funneled" to a specific thread to perform the 432 /// task. The Operation class provides an abstract base for all services the 433 /// NativeProcessLinux must perform via the single virtual function Execute, thus 434 /// encapsulating the code that needs to run in the privileged context. 435 class Operation 436 { 437 public: 438 Operation () : m_error() { } 439 440 virtual 441 ~Operation() {} 442 443 virtual void 444 Execute (NativeProcessLinux *process) = 0; 445 446 const Error & 447 GetError () const { return m_error; } 448 449 protected: 450 Error m_error; 451 }; 452 453 //------------------------------------------------------------------------------ 454 /// @class ReadOperation 455 /// @brief Implements NativeProcessLinux::ReadMemory. 456 class ReadOperation : public Operation 457 { 458 public: 459 ReadOperation( 460 lldb::addr_t addr, 461 void *buff, 462 size_t size, 463 size_t &result) : 464 Operation (), 465 m_addr (addr), 466 m_buff (buff), 467 m_size (size), 468 m_result (result) 469 { 470 } 471 472 void Execute (NativeProcessLinux *process) override; 473 474 private: 475 lldb::addr_t m_addr; 476 void *m_buff; 477 size_t m_size; 478 size_t &m_result; 479 }; 480 481 void 482 ReadOperation::Execute (NativeProcessLinux *process) 483 { 484 m_result = DoReadMemory (process->GetID (), m_addr, m_buff, m_size, m_error); 485 } 486 487 //------------------------------------------------------------------------------ 488 /// @class WriteOperation 489 /// @brief Implements NativeProcessLinux::WriteMemory. 490 class WriteOperation : public Operation 491 { 492 public: 493 WriteOperation( 494 lldb::addr_t addr, 495 const void *buff, 496 size_t size, 497 size_t &result) : 498 Operation (), 499 m_addr (addr), 500 m_buff (buff), 501 m_size (size), 502 m_result (result) 503 { 504 } 505 506 void Execute (NativeProcessLinux *process) override; 507 508 private: 509 lldb::addr_t m_addr; 510 const void *m_buff; 511 size_t m_size; 512 size_t &m_result; 513 }; 514 515 void 516 WriteOperation::Execute(NativeProcessLinux *process) 517 { 518 m_result = DoWriteMemory (process->GetID (), m_addr, m_buff, m_size, m_error); 519 } 520 521 //------------------------------------------------------------------------------ 522 /// @class ReadRegOperation 523 /// @brief Implements NativeProcessLinux::ReadRegisterValue. 524 class ReadRegOperation : public Operation 525 { 526 public: 527 ReadRegOperation(lldb::tid_t tid, uint32_t offset, const char *reg_name, 528 RegisterValue &value) 529 : m_tid(tid), 530 m_offset(static_cast<uintptr_t> (offset)), 531 m_reg_name(reg_name), 532 m_value(value) 533 { } 534 535 void Execute(NativeProcessLinux *monitor) override; 536 537 private: 538 lldb::tid_t m_tid; 539 uintptr_t m_offset; 540 const char *m_reg_name; 541 RegisterValue &m_value; 542 }; 543 544 void 545 ReadRegOperation::Execute(NativeProcessLinux *monitor) 546 { 547 #if defined (__arm64__) || defined (__aarch64__) 548 if (m_offset > sizeof(struct user_pt_regs)) 549 { 550 uintptr_t offset = m_offset - sizeof(struct user_pt_regs); 551 if (offset > sizeof(struct user_fpsimd_state)) 552 { 553 m_error.SetErrorString("invalid offset value"); 554 return; 555 } 556 elf_fpregset_t regs; 557 int regset = NT_FPREGSET; 558 struct iovec ioVec; 559 560 ioVec.iov_base = ®s; 561 ioVec.iov_len = sizeof regs; 562 PTRACE(PTRACE_GETREGSET, m_tid, ®set, &ioVec, sizeof regs, m_error); 563 if (m_error.Success()) 564 { 565 ArchSpec arch; 566 if (monitor->GetArchitecture(arch)) 567 m_value.SetBytes((void *)(((unsigned char *)(®s)) + offset), 16, arch.GetByteOrder()); 568 else 569 m_error.SetErrorString("failed to get architecture"); 570 } 571 } 572 else 573 { 574 elf_gregset_t regs; 575 int regset = NT_PRSTATUS; 576 struct iovec ioVec; 577 578 ioVec.iov_base = ®s; 579 ioVec.iov_len = sizeof regs; 580 PTRACE(PTRACE_GETREGSET, m_tid, ®set, &ioVec, sizeof regs, m_error); 581 if (m_error.Success()) 582 { 583 ArchSpec arch; 584 if (monitor->GetArchitecture(arch)) 585 m_value.SetBytes((void *)(((unsigned char *)(regs)) + m_offset), 8, arch.GetByteOrder()); 586 else 587 m_error.SetErrorString("failed to get architecture"); 588 } 589 } 590 #elif defined (__mips__) 591 elf_gregset_t regs; 592 PTRACE(PTRACE_GETREGS, m_tid, NULL, ®s, sizeof regs, m_error); 593 if (m_error.Success()) 594 { 595 lldb_private::ArchSpec arch; 596 if (monitor->GetArchitecture(arch)) 597 m_value.SetBytes((void *)(((unsigned char *)(regs)) + m_offset), 8, arch.GetByteOrder()); 598 else 599 m_error.SetErrorString("failed to get architecture"); 600 } 601 #else 602 Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_REGISTERS)); 603 604 lldb::addr_t data = static_cast<unsigned long>(PTRACE(PTRACE_PEEKUSER, m_tid, (void*)m_offset, nullptr, 0, m_error)); 605 if (m_error.Success()) 606 m_value = data; 607 608 if (log) 609 log->Printf ("NativeProcessLinux::%s() reg %s: 0x%" PRIx64, __FUNCTION__, 610 m_reg_name, data); 611 #endif 612 } 613 614 //------------------------------------------------------------------------------ 615 /// @class WriteRegOperation 616 /// @brief Implements NativeProcessLinux::WriteRegisterValue. 617 class WriteRegOperation : public Operation 618 { 619 public: 620 WriteRegOperation(lldb::tid_t tid, unsigned offset, const char *reg_name, 621 const RegisterValue &value) 622 : m_tid(tid), 623 m_offset(offset), 624 m_reg_name(reg_name), 625 m_value(value) 626 { } 627 628 void Execute(NativeProcessLinux *monitor) override; 629 630 private: 631 lldb::tid_t m_tid; 632 uintptr_t m_offset; 633 const char *m_reg_name; 634 const RegisterValue &m_value; 635 }; 636 637 void 638 WriteRegOperation::Execute(NativeProcessLinux *monitor) 639 { 640 #if defined (__arm64__) || defined (__aarch64__) 641 if (m_offset > sizeof(struct user_pt_regs)) 642 { 643 uintptr_t offset = m_offset - sizeof(struct user_pt_regs); 644 if (offset > sizeof(struct user_fpsimd_state)) 645 { 646 m_error.SetErrorString("invalid offset value"); 647 return; 648 } 649 elf_fpregset_t regs; 650 int regset = NT_FPREGSET; 651 struct iovec ioVec; 652 653 ioVec.iov_base = ®s; 654 ioVec.iov_len = sizeof regs; 655 PTRACE(PTRACE_GETREGSET, m_tid, ®set, &ioVec, sizeof regs, m_error); 656 if (m_error.Success()) 657 { 658 ::memcpy((void *)(((unsigned char *)(®s)) + offset), m_value.GetBytes(), 16); 659 PTRACE(PTRACE_SETREGSET, m_tid, ®set, &ioVec, sizeof regs, m_error); 660 } 661 } 662 else 663 { 664 elf_gregset_t regs; 665 int regset = NT_PRSTATUS; 666 struct iovec ioVec; 667 668 ioVec.iov_base = ®s; 669 ioVec.iov_len = sizeof regs; 670 PTRACE(PTRACE_GETREGSET, m_tid, ®set, &ioVec, sizeof regs, m_error); 671 if (m_error.Success()) 672 { 673 ::memcpy((void *)(((unsigned char *)(®s)) + m_offset), m_value.GetBytes(), 8); 674 PTRACE(PTRACE_SETREGSET, m_tid, ®set, &ioVec, sizeof regs, m_error); 675 } 676 } 677 #elif defined (__mips__) 678 elf_gregset_t regs; 679 PTRACE(PTRACE_GETREGS, m_tid, NULL, ®s, sizeof regs, m_error); 680 if (m_error.Success()) 681 { 682 ::memcpy((void *)(((unsigned char *)(®s)) + m_offset), m_value.GetBytes(), 8); 683 PTRACE(PTRACE_SETREGS, m_tid, NULL, ®s, sizeof regs, m_error); 684 } 685 #else 686 void* buf; 687 Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_REGISTERS)); 688 689 buf = (void*) m_value.GetAsUInt64(); 690 691 if (log) 692 log->Printf ("NativeProcessLinux::%s() reg %s: %p", __FUNCTION__, m_reg_name, buf); 693 PTRACE(PTRACE_POKEUSER, m_tid, (void*)m_offset, buf, 0, m_error); 694 #endif 695 } 696 697 //------------------------------------------------------------------------------ 698 /// @class ReadGPROperation 699 /// @brief Implements NativeProcessLinux::ReadGPR. 700 class ReadGPROperation : public Operation 701 { 702 public: 703 ReadGPROperation(lldb::tid_t tid, void *buf, size_t buf_size) 704 : m_tid(tid), m_buf(buf), m_buf_size(buf_size) 705 { } 706 707 void Execute(NativeProcessLinux *monitor) override; 708 709 private: 710 lldb::tid_t m_tid; 711 void *m_buf; 712 size_t m_buf_size; 713 }; 714 715 void 716 ReadGPROperation::Execute(NativeProcessLinux *monitor) 717 { 718 #if defined (__arm64__) || defined (__aarch64__) 719 int regset = NT_PRSTATUS; 720 struct iovec ioVec; 721 722 ioVec.iov_base = m_buf; 723 ioVec.iov_len = m_buf_size; 724 PTRACE(PTRACE_GETREGSET, m_tid, ®set, &ioVec, m_buf_size, m_error); 725 #else 726 PTRACE(PTRACE_GETREGS, m_tid, nullptr, m_buf, m_buf_size, m_error); 727 #endif 728 } 729 730 //------------------------------------------------------------------------------ 731 /// @class ReadFPROperation 732 /// @brief Implements NativeProcessLinux::ReadFPR. 733 class ReadFPROperation : public Operation 734 { 735 public: 736 ReadFPROperation(lldb::tid_t tid, void *buf, size_t buf_size) 737 : m_tid(tid), 738 m_buf(buf), 739 m_buf_size(buf_size) 740 { } 741 742 void Execute(NativeProcessLinux *monitor) override; 743 744 private: 745 lldb::tid_t m_tid; 746 void *m_buf; 747 size_t m_buf_size; 748 }; 749 750 void 751 ReadFPROperation::Execute(NativeProcessLinux *monitor) 752 { 753 #if defined (__arm64__) || defined (__aarch64__) 754 int regset = NT_FPREGSET; 755 struct iovec ioVec; 756 757 ioVec.iov_base = m_buf; 758 ioVec.iov_len = m_buf_size; 759 PTRACE(PTRACE_GETREGSET, m_tid, ®set, &ioVec, m_buf_size, m_error); 760 #else 761 PTRACE(PTRACE_GETFPREGS, m_tid, nullptr, m_buf, m_buf_size, m_error); 762 #endif 763 } 764 765 //------------------------------------------------------------------------------ 766 /// @class ReadDBGROperation 767 /// @brief Implements NativeProcessLinux::ReadHardwareDebugInfo. 768 class ReadDBGROperation : public Operation 769 { 770 public: 771 ReadDBGROperation(lldb::tid_t tid, unsigned int &count_wp, unsigned int &count_bp) 772 : m_tid(tid), 773 m_count_wp(count_wp), 774 m_count_bp(count_bp) 775 { } 776 777 void Execute(NativeProcessLinux *monitor) override; 778 779 private: 780 lldb::tid_t m_tid; 781 unsigned int &m_count_wp; 782 unsigned int &m_count_bp; 783 }; 784 785 void 786 ReadDBGROperation::Execute(NativeProcessLinux *monitor) 787 { 788 #if defined (__arm64__) || defined (__aarch64__) 789 int regset = NT_ARM_HW_WATCH; 790 struct iovec ioVec; 791 struct user_hwdebug_state dreg_state; 792 793 ioVec.iov_base = &dreg_state; 794 ioVec.iov_len = sizeof (dreg_state); 795 796 PTRACE(PTRACE_GETREGSET, m_tid, ®set, &ioVec, ioVec.iov_len, m_error); 797 798 m_count_wp = dreg_state.dbg_info & 0xff; 799 regset = NT_ARM_HW_BREAK; 800 801 PTRACE(PTRACE_GETREGSET, m_tid, ®set, &ioVec, ioVec.iov_len, m_error); 802 m_count_bp = dreg_state.dbg_info & 0xff; 803 #endif 804 } 805 806 807 //------------------------------------------------------------------------------ 808 /// @class ReadRegisterSetOperation 809 /// @brief Implements NativeProcessLinux::ReadRegisterSet. 810 class ReadRegisterSetOperation : public Operation 811 { 812 public: 813 ReadRegisterSetOperation(lldb::tid_t tid, void *buf, size_t buf_size, unsigned int regset) 814 : m_tid(tid), m_buf(buf), m_buf_size(buf_size), m_regset(regset) 815 { } 816 817 void Execute(NativeProcessLinux *monitor) override; 818 819 private: 820 lldb::tid_t m_tid; 821 void *m_buf; 822 size_t m_buf_size; 823 const unsigned int m_regset; 824 }; 825 826 void 827 ReadRegisterSetOperation::Execute(NativeProcessLinux *monitor) 828 { 829 PTRACE(PTRACE_GETREGSET, m_tid, (void *)&m_regset, m_buf, m_buf_size, m_error); 830 } 831 832 //------------------------------------------------------------------------------ 833 /// @class WriteGPROperation 834 /// @brief Implements NativeProcessLinux::WriteGPR. 835 class WriteGPROperation : public Operation 836 { 837 public: 838 WriteGPROperation(lldb::tid_t tid, void *buf, size_t buf_size) 839 : m_tid(tid), m_buf(buf), m_buf_size(buf_size) 840 { } 841 842 void Execute(NativeProcessLinux *monitor) override; 843 844 private: 845 lldb::tid_t m_tid; 846 void *m_buf; 847 size_t m_buf_size; 848 }; 849 850 void 851 WriteGPROperation::Execute(NativeProcessLinux *monitor) 852 { 853 #if defined (__arm64__) || defined (__aarch64__) 854 int regset = NT_PRSTATUS; 855 struct iovec ioVec; 856 857 ioVec.iov_base = m_buf; 858 ioVec.iov_len = m_buf_size; 859 PTRACE(PTRACE_SETREGSET, m_tid, ®set, &ioVec, m_buf_size, m_error); 860 #else 861 PTRACE(PTRACE_SETREGS, m_tid, NULL, m_buf, m_buf_size, m_error); 862 #endif 863 } 864 865 //------------------------------------------------------------------------------ 866 /// @class WriteFPROperation 867 /// @brief Implements NativeProcessLinux::WriteFPR. 868 class WriteFPROperation : public Operation 869 { 870 public: 871 WriteFPROperation(lldb::tid_t tid, void *buf, size_t buf_size) 872 : m_tid(tid), m_buf(buf), m_buf_size(buf_size) 873 { } 874 875 void Execute(NativeProcessLinux *monitor) override; 876 877 private: 878 lldb::tid_t m_tid; 879 void *m_buf; 880 size_t m_buf_size; 881 }; 882 883 void 884 WriteFPROperation::Execute(NativeProcessLinux *monitor) 885 { 886 #if defined (__arm64__) || defined (__aarch64__) 887 int regset = NT_FPREGSET; 888 struct iovec ioVec; 889 890 ioVec.iov_base = m_buf; 891 ioVec.iov_len = m_buf_size; 892 PTRACE(PTRACE_SETREGSET, m_tid, ®set, &ioVec, m_buf_size, m_error); 893 #else 894 PTRACE(PTRACE_SETFPREGS, m_tid, NULL, m_buf, m_buf_size, m_error); 895 #endif 896 } 897 898 //------------------------------------------------------------------------------ 899 /// @class WriteDBGROperation 900 /// @brief Implements NativeProcessLinux::WriteHardwareDebugRegs. 901 class WriteDBGROperation : public Operation 902 { 903 public: 904 WriteDBGROperation(lldb::tid_t tid, lldb::addr_t *addr_buf, 905 uint32_t *cntrl_buf, int type, int count) 906 : m_tid(tid), 907 m_address(addr_buf), 908 m_control(cntrl_buf), 909 m_type(type), 910 m_count(count) 911 { } 912 913 void Execute(NativeProcessLinux *monitor) override; 914 915 private: 916 lldb::tid_t m_tid; 917 lldb::addr_t * m_address; 918 uint32_t * m_control; 919 int m_type; 920 int m_count; 921 }; 922 923 void 924 WriteDBGROperation::Execute(NativeProcessLinux *monitor) 925 { 926 #if defined (__arm64__) || defined (__aarch64__) 927 struct iovec ioVec; 928 struct user_hwdebug_state dreg_state; 929 930 memset (&dreg_state, 0, sizeof (dreg_state)); 931 ioVec.iov_len = (__builtin_offsetof (struct user_hwdebug_state, dbg_regs[m_count - 1]) 932 + sizeof (dreg_state.dbg_regs [m_count - 1])); 933 934 if (m_type == 0) 935 m_type = NT_ARM_HW_WATCH; 936 else 937 m_type = NT_ARM_HW_BREAK; 938 939 for (int i = 0; i < m_count; i++) 940 { 941 dreg_state.dbg_regs[i].addr = m_address[i]; 942 dreg_state.dbg_regs[i].ctrl = m_control[i]; 943 } 944 945 PTRACE(PTRACE_SETREGSET, m_tid, &m_type, &ioVec, ioVec.iov_len, m_error); 946 #endif 947 } 948 949 950 //------------------------------------------------------------------------------ 951 /// @class WriteRegisterSetOperation 952 /// @brief Implements NativeProcessLinux::WriteRegisterSet. 953 class WriteRegisterSetOperation : public Operation 954 { 955 public: 956 WriteRegisterSetOperation(lldb::tid_t tid, void *buf, size_t buf_size, unsigned int regset) 957 : m_tid(tid), m_buf(buf), m_buf_size(buf_size), m_regset(regset) 958 { } 959 960 void Execute(NativeProcessLinux *monitor) override; 961 962 private: 963 lldb::tid_t m_tid; 964 void *m_buf; 965 size_t m_buf_size; 966 const unsigned int m_regset; 967 }; 968 969 void 970 WriteRegisterSetOperation::Execute(NativeProcessLinux *monitor) 971 { 972 PTRACE(PTRACE_SETREGSET, m_tid, (void *)&m_regset, m_buf, m_buf_size, m_error); 973 } 974 975 //------------------------------------------------------------------------------ 976 /// @class ResumeOperation 977 /// @brief Implements NativeProcessLinux::Resume. 978 class ResumeOperation : public Operation 979 { 980 public: 981 ResumeOperation(lldb::tid_t tid, uint32_t signo) : 982 m_tid(tid), m_signo(signo) { } 983 984 void Execute(NativeProcessLinux *monitor) override; 985 986 private: 987 lldb::tid_t m_tid; 988 uint32_t m_signo; 989 }; 990 991 void 992 ResumeOperation::Execute(NativeProcessLinux *monitor) 993 { 994 intptr_t data = 0; 995 996 if (m_signo != LLDB_INVALID_SIGNAL_NUMBER) 997 data = m_signo; 998 999 PTRACE(PTRACE_CONT, m_tid, nullptr, (void*)data, 0, m_error); 1000 if (m_error.Fail()) 1001 { 1002 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 1003 1004 if (log) 1005 log->Printf ("ResumeOperation (%" PRIu64 ") failed: %s", m_tid, m_error.AsCString()); 1006 } 1007 } 1008 1009 //------------------------------------------------------------------------------ 1010 /// @class SingleStepOperation 1011 /// @brief Implements NativeProcessLinux::SingleStep. 1012 class SingleStepOperation : public Operation 1013 { 1014 public: 1015 SingleStepOperation(lldb::tid_t tid, uint32_t signo) 1016 : m_tid(tid), m_signo(signo) { } 1017 1018 void Execute(NativeProcessLinux *monitor) override; 1019 1020 private: 1021 lldb::tid_t m_tid; 1022 uint32_t m_signo; 1023 }; 1024 1025 void 1026 SingleStepOperation::Execute(NativeProcessLinux *monitor) 1027 { 1028 intptr_t data = 0; 1029 1030 if (m_signo != LLDB_INVALID_SIGNAL_NUMBER) 1031 data = m_signo; 1032 1033 PTRACE(PTRACE_SINGLESTEP, m_tid, nullptr, (void*)data, 0, m_error); 1034 } 1035 1036 //------------------------------------------------------------------------------ 1037 /// @class SiginfoOperation 1038 /// @brief Implements NativeProcessLinux::GetSignalInfo. 1039 class SiginfoOperation : public Operation 1040 { 1041 public: 1042 SiginfoOperation(lldb::tid_t tid, void *info) 1043 : m_tid(tid), m_info(info) { } 1044 1045 void Execute(NativeProcessLinux *monitor) override; 1046 1047 private: 1048 lldb::tid_t m_tid; 1049 void *m_info; 1050 }; 1051 1052 void 1053 SiginfoOperation::Execute(NativeProcessLinux *monitor) 1054 { 1055 PTRACE(PTRACE_GETSIGINFO, m_tid, nullptr, m_info, 0, m_error); 1056 } 1057 1058 //------------------------------------------------------------------------------ 1059 /// @class EventMessageOperation 1060 /// @brief Implements NativeProcessLinux::GetEventMessage. 1061 class EventMessageOperation : public Operation 1062 { 1063 public: 1064 EventMessageOperation(lldb::tid_t tid, unsigned long *message) 1065 : m_tid(tid), m_message(message) { } 1066 1067 void Execute(NativeProcessLinux *monitor) override; 1068 1069 private: 1070 lldb::tid_t m_tid; 1071 unsigned long *m_message; 1072 }; 1073 1074 void 1075 EventMessageOperation::Execute(NativeProcessLinux *monitor) 1076 { 1077 PTRACE(PTRACE_GETEVENTMSG, m_tid, nullptr, m_message, 0, m_error); 1078 } 1079 1080 class DetachOperation : public Operation 1081 { 1082 public: 1083 DetachOperation(lldb::tid_t tid) : m_tid(tid) { } 1084 1085 void Execute(NativeProcessLinux *monitor) override; 1086 1087 private: 1088 lldb::tid_t m_tid; 1089 }; 1090 1091 void 1092 DetachOperation::Execute(NativeProcessLinux *monitor) 1093 { 1094 PTRACE(PTRACE_DETACH, m_tid, nullptr, 0, 0, m_error); 1095 } 1096 } // end of anonymous namespace 1097 1098 // Simple helper function to ensure flags are enabled on the given file 1099 // descriptor. 1100 static Error 1101 EnsureFDFlags(int fd, int flags) 1102 { 1103 Error error; 1104 1105 int status = fcntl(fd, F_GETFL); 1106 if (status == -1) 1107 { 1108 error.SetErrorToErrno(); 1109 return error; 1110 } 1111 1112 if (fcntl(fd, F_SETFL, status | flags) == -1) 1113 { 1114 error.SetErrorToErrno(); 1115 return error; 1116 } 1117 1118 return error; 1119 } 1120 1121 // This class encapsulates the privileged thread which performs all ptrace and wait operations on 1122 // the inferior. The thread consists of a main loop which waits for events and processes them 1123 // - SIGCHLD (delivered over a signalfd file descriptor): These signals notify us of events in 1124 // the inferior process. Upon receiving this signal we do a waitpid to get more information 1125 // and dispatch to NativeProcessLinux::MonitorCallback. 1126 // - requests for ptrace operations: These initiated via the DoOperation method, which funnels 1127 // them to the Monitor thread via m_operation member. The Monitor thread is signaled over a 1128 // pipe, and the completion of the operation is signalled over the semaphore. 1129 // - thread exit event: this is signaled from the Monitor destructor by closing the write end 1130 // of the command pipe. 1131 class NativeProcessLinux::Monitor 1132 { 1133 private: 1134 // The initial monitor operation (launch or attach). It returns a inferior process id. 1135 std::unique_ptr<InitialOperation> m_initial_operation_up; 1136 1137 ::pid_t m_child_pid = -1; 1138 NativeProcessLinux * m_native_process; 1139 1140 enum { READ, WRITE }; 1141 int m_pipefd[2] = {-1, -1}; 1142 int m_signal_fd = -1; 1143 HostThread m_thread; 1144 1145 // current operation which must be executed on the priviliged thread 1146 Mutex m_operation_mutex; 1147 Operation *m_operation = nullptr; 1148 sem_t m_operation_sem; 1149 Error m_operation_error; 1150 1151 unsigned m_operation_nesting_level = 0; 1152 1153 static constexpr char operation_command = 'o'; 1154 static constexpr char begin_block_command = '{'; 1155 static constexpr char end_block_command = '}'; 1156 1157 void 1158 HandleSignals(); 1159 1160 void 1161 HandleWait(); 1162 1163 // Returns true if the thread should exit. 1164 bool 1165 HandleCommands(); 1166 1167 void 1168 MainLoop(); 1169 1170 static void * 1171 RunMonitor(void *arg); 1172 1173 Error 1174 WaitForAck(); 1175 1176 void 1177 BeginOperationBlock() 1178 { 1179 write(m_pipefd[WRITE], &begin_block_command, sizeof operation_command); 1180 WaitForAck(); 1181 } 1182 1183 void 1184 EndOperationBlock() 1185 { 1186 write(m_pipefd[WRITE], &end_block_command, sizeof operation_command); 1187 WaitForAck(); 1188 } 1189 1190 public: 1191 Monitor(const InitialOperation &initial_operation, 1192 NativeProcessLinux *native_process) 1193 : m_initial_operation_up(new InitialOperation(initial_operation)), 1194 m_native_process(native_process) 1195 { 1196 sem_init(&m_operation_sem, 0, 0); 1197 } 1198 1199 ~Monitor(); 1200 1201 Error 1202 Initialize(); 1203 1204 void 1205 Terminate(); 1206 1207 void 1208 DoOperation(Operation *op); 1209 1210 class ScopedOperationLock { 1211 Monitor &m_monitor; 1212 1213 public: 1214 ScopedOperationLock(Monitor &monitor) 1215 : m_monitor(monitor) 1216 { m_monitor.BeginOperationBlock(); } 1217 1218 ~ScopedOperationLock() 1219 { m_monitor.EndOperationBlock(); } 1220 }; 1221 }; 1222 constexpr char NativeProcessLinux::Monitor::operation_command; 1223 constexpr char NativeProcessLinux::Monitor::begin_block_command; 1224 constexpr char NativeProcessLinux::Monitor::end_block_command; 1225 1226 Error 1227 NativeProcessLinux::Monitor::Initialize() 1228 { 1229 Error error; 1230 1231 // We get a SIGCHLD every time something interesting happens with the inferior. We shall be 1232 // listening for these signals over a signalfd file descriptors. This allows us to wait for 1233 // multiple kinds of events with select. 1234 sigset_t signals; 1235 sigemptyset(&signals); 1236 sigaddset(&signals, SIGCHLD); 1237 m_signal_fd = signalfd(-1, &signals, SFD_NONBLOCK | SFD_CLOEXEC); 1238 if (m_signal_fd < 0) 1239 { 1240 return Error("NativeProcessLinux::Monitor::%s failed due to signalfd failure. Monitoring the inferior will be impossible: %s", 1241 __FUNCTION__, strerror(errno)); 1242 1243 } 1244 1245 if (pipe2(m_pipefd, O_CLOEXEC) == -1) 1246 { 1247 error.SetErrorToErrno(); 1248 return error; 1249 } 1250 1251 if ((error = EnsureFDFlags(m_pipefd[READ], O_NONBLOCK)).Fail()) { 1252 return error; 1253 } 1254 1255 static const char g_thread_name[] = "lldb.process.nativelinux.monitor"; 1256 m_thread = ThreadLauncher::LaunchThread(g_thread_name, Monitor::RunMonitor, this, nullptr); 1257 if (!m_thread.IsJoinable()) 1258 return Error("Failed to create monitor thread for NativeProcessLinux."); 1259 1260 // Wait for initial operation to complete. 1261 return WaitForAck(); 1262 } 1263 1264 void 1265 NativeProcessLinux::Monitor::DoOperation(Operation *op) 1266 { 1267 if (m_thread.EqualsThread(pthread_self())) { 1268 // If we're on the Monitor thread, we can simply execute the operation. 1269 op->Execute(m_native_process); 1270 return; 1271 } 1272 1273 // Otherwise we need to pass the operation to the Monitor thread so it can handle it. 1274 Mutex::Locker lock(m_operation_mutex); 1275 1276 m_operation = op; 1277 1278 // notify the thread that an operation is ready to be processed 1279 write(m_pipefd[WRITE], &operation_command, sizeof operation_command); 1280 1281 WaitForAck(); 1282 } 1283 1284 void 1285 NativeProcessLinux::Monitor::Terminate() 1286 { 1287 if (m_pipefd[WRITE] >= 0) 1288 { 1289 close(m_pipefd[WRITE]); 1290 m_pipefd[WRITE] = -1; 1291 } 1292 if (m_thread.IsJoinable()) 1293 m_thread.Join(nullptr); 1294 } 1295 1296 NativeProcessLinux::Monitor::~Monitor() 1297 { 1298 Terminate(); 1299 if (m_pipefd[READ] >= 0) 1300 close(m_pipefd[READ]); 1301 if (m_signal_fd >= 0) 1302 close(m_signal_fd); 1303 sem_destroy(&m_operation_sem); 1304 } 1305 1306 void 1307 NativeProcessLinux::Monitor::HandleSignals() 1308 { 1309 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS)); 1310 1311 // We don't really care about the content of the SIGCHLD siginfo structure, as we will get 1312 // all the information from waitpid(). We just need to read all the signals so that we can 1313 // sleep next time we reach select(). 1314 while (true) 1315 { 1316 signalfd_siginfo info; 1317 ssize_t size = read(m_signal_fd, &info, sizeof info); 1318 if (size == -1) 1319 { 1320 if (errno == EAGAIN || errno == EWOULDBLOCK) 1321 break; // We are done. 1322 if (errno == EINTR) 1323 continue; 1324 if (log) 1325 log->Printf("NativeProcessLinux::Monitor::%s reading from signalfd file descriptor failed: %s", 1326 __FUNCTION__, strerror(errno)); 1327 break; 1328 } 1329 if (size != sizeof info) 1330 { 1331 // We got incomplete information structure. This should not happen, let's just log 1332 // that. 1333 if (log) 1334 log->Printf("NativeProcessLinux::Monitor::%s reading from signalfd file descriptor returned incomplete data: " 1335 "structure size is %zd, read returned %zd bytes", 1336 __FUNCTION__, sizeof info, size); 1337 break; 1338 } 1339 if (log) 1340 log->Printf("NativeProcessLinux::Monitor::%s received signal %s(%d).", __FUNCTION__, 1341 Host::GetSignalAsCString(info.ssi_signo), info.ssi_signo); 1342 } 1343 } 1344 1345 void 1346 NativeProcessLinux::Monitor::HandleWait() 1347 { 1348 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS)); 1349 // Process all pending waitpid notifications. 1350 while (true) 1351 { 1352 int status = -1; 1353 ::pid_t wait_pid = waitpid(m_child_pid, &status, __WALL | WNOHANG); 1354 1355 if (wait_pid == 0) 1356 break; // We are done. 1357 1358 if (wait_pid == -1) 1359 { 1360 if (errno == EINTR) 1361 continue; 1362 1363 if (log) 1364 log->Printf("NativeProcessLinux::Monitor::%s waitpid (pid = %" PRIi32 ", &status, __WALL | WNOHANG) failed: %s", 1365 __FUNCTION__, m_child_pid, strerror(errno)); 1366 break; 1367 } 1368 1369 bool exited = false; 1370 int signal = 0; 1371 int exit_status = 0; 1372 const char *status_cstr = NULL; 1373 if (WIFSTOPPED(status)) 1374 { 1375 signal = WSTOPSIG(status); 1376 status_cstr = "STOPPED"; 1377 } 1378 else if (WIFEXITED(status)) 1379 { 1380 exit_status = WEXITSTATUS(status); 1381 status_cstr = "EXITED"; 1382 exited = true; 1383 } 1384 else if (WIFSIGNALED(status)) 1385 { 1386 signal = WTERMSIG(status); 1387 status_cstr = "SIGNALED"; 1388 if (wait_pid == abs(m_child_pid)) { 1389 exited = true; 1390 exit_status = -1; 1391 } 1392 } 1393 else 1394 status_cstr = "(\?\?\?)"; 1395 1396 if (log) 1397 log->Printf("NativeProcessLinux::Monitor::%s: waitpid (pid = %" PRIi32 ", &status, __WALL | WNOHANG)" 1398 "=> pid = %" PRIi32 ", status = 0x%8.8x (%s), signal = %i, exit_state = %i", 1399 __FUNCTION__, m_child_pid, wait_pid, status, status_cstr, signal, exit_status); 1400 1401 m_native_process->MonitorCallback (wait_pid, exited, signal, exit_status); 1402 } 1403 } 1404 1405 bool 1406 NativeProcessLinux::Monitor::HandleCommands() 1407 { 1408 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS)); 1409 1410 while (true) 1411 { 1412 char command = 0; 1413 ssize_t size = read(m_pipefd[READ], &command, sizeof command); 1414 if (size == -1) 1415 { 1416 if (errno == EAGAIN || errno == EWOULDBLOCK) 1417 return false; 1418 if (errno == EINTR) 1419 continue; 1420 if (log) 1421 log->Printf("NativeProcessLinux::Monitor::%s exiting because read from command file descriptor failed: %s", __FUNCTION__, strerror(errno)); 1422 return true; 1423 } 1424 if (size == 0) // end of file - write end closed 1425 { 1426 if (log) 1427 log->Printf("NativeProcessLinux::Monitor::%s exit command received, exiting...", __FUNCTION__); 1428 assert(m_operation_nesting_level == 0 && "Unbalanced begin/end block commands detected"); 1429 return true; // We are done. 1430 } 1431 1432 switch (command) 1433 { 1434 case operation_command: 1435 m_operation->Execute(m_native_process); 1436 break; 1437 case begin_block_command: 1438 ++m_operation_nesting_level; 1439 break; 1440 case end_block_command: 1441 assert(m_operation_nesting_level > 0); 1442 --m_operation_nesting_level; 1443 break; 1444 default: 1445 if (log) 1446 log->Printf("NativeProcessLinux::Monitor::%s received unknown command '%c'", 1447 __FUNCTION__, command); 1448 } 1449 1450 // notify calling thread that the command has been processed 1451 sem_post(&m_operation_sem); 1452 } 1453 } 1454 1455 void 1456 NativeProcessLinux::Monitor::MainLoop() 1457 { 1458 ::pid_t child_pid = (*m_initial_operation_up)(m_operation_error); 1459 m_initial_operation_up.reset(); 1460 m_child_pid = -getpgid(child_pid), 1461 sem_post(&m_operation_sem); 1462 1463 while (true) 1464 { 1465 fd_set fds; 1466 FD_ZERO(&fds); 1467 // Only process waitpid events if we are outside of an operation block. Any pending 1468 // events will be processed after we leave the block. 1469 if (m_operation_nesting_level == 0) 1470 FD_SET(m_signal_fd, &fds); 1471 FD_SET(m_pipefd[READ], &fds); 1472 1473 int max_fd = std::max(m_signal_fd, m_pipefd[READ]) + 1; 1474 int r = select(max_fd, &fds, nullptr, nullptr, nullptr); 1475 if (r < 0) 1476 { 1477 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS)); 1478 if (log) 1479 log->Printf("NativeProcessLinux::Monitor::%s exiting because select failed: %s", 1480 __FUNCTION__, strerror(errno)); 1481 return; 1482 } 1483 1484 if (FD_ISSET(m_pipefd[READ], &fds)) 1485 { 1486 if (HandleCommands()) 1487 return; 1488 } 1489 1490 if (FD_ISSET(m_signal_fd, &fds)) 1491 { 1492 HandleSignals(); 1493 HandleWait(); 1494 } 1495 } 1496 } 1497 1498 Error 1499 NativeProcessLinux::Monitor::WaitForAck() 1500 { 1501 Error error; 1502 while (sem_wait(&m_operation_sem) != 0) 1503 { 1504 if (errno == EINTR) 1505 continue; 1506 1507 error.SetErrorToErrno(); 1508 return error; 1509 } 1510 1511 return m_operation_error; 1512 } 1513 1514 void * 1515 NativeProcessLinux::Monitor::RunMonitor(void *arg) 1516 { 1517 static_cast<Monitor *>(arg)->MainLoop(); 1518 return nullptr; 1519 } 1520 1521 1522 NativeProcessLinux::LaunchArgs::LaunchArgs(Module *module, 1523 char const **argv, 1524 char const **envp, 1525 const std::string &stdin_path, 1526 const std::string &stdout_path, 1527 const std::string &stderr_path, 1528 const char *working_dir, 1529 const ProcessLaunchInfo &launch_info) 1530 : m_module(module), 1531 m_argv(argv), 1532 m_envp(envp), 1533 m_stdin_path(stdin_path), 1534 m_stdout_path(stdout_path), 1535 m_stderr_path(stderr_path), 1536 m_working_dir(working_dir), 1537 m_launch_info(launch_info) 1538 { 1539 } 1540 1541 NativeProcessLinux::LaunchArgs::~LaunchArgs() 1542 { } 1543 1544 // ----------------------------------------------------------------------------- 1545 // Public Static Methods 1546 // ----------------------------------------------------------------------------- 1547 1548 Error 1549 NativeProcessLinux::LaunchProcess ( 1550 Module *exe_module, 1551 ProcessLaunchInfo &launch_info, 1552 NativeProcessProtocol::NativeDelegate &native_delegate, 1553 NativeProcessProtocolSP &native_process_sp) 1554 { 1555 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 1556 1557 Error error; 1558 1559 // Verify the working directory is valid if one was specified. 1560 const char* working_dir = launch_info.GetWorkingDirectory (); 1561 if (working_dir) 1562 { 1563 FileSpec working_dir_fs (working_dir, true); 1564 if (!working_dir_fs || working_dir_fs.GetFileType () != FileSpec::eFileTypeDirectory) 1565 { 1566 error.SetErrorStringWithFormat ("No such file or directory: %s", working_dir); 1567 return error; 1568 } 1569 } 1570 1571 const FileAction *file_action; 1572 1573 // Default of NULL will mean to use existing open file descriptors. 1574 std::string stdin_path; 1575 std::string stdout_path; 1576 std::string stderr_path; 1577 1578 file_action = launch_info.GetFileActionForFD (STDIN_FILENO); 1579 if (file_action) 1580 stdin_path = file_action->GetPath (); 1581 1582 file_action = launch_info.GetFileActionForFD (STDOUT_FILENO); 1583 if (file_action) 1584 stdout_path = file_action->GetPath (); 1585 1586 file_action = launch_info.GetFileActionForFD (STDERR_FILENO); 1587 if (file_action) 1588 stderr_path = file_action->GetPath (); 1589 1590 if (log) 1591 { 1592 if (!stdin_path.empty ()) 1593 log->Printf ("NativeProcessLinux::%s setting STDIN to '%s'", __FUNCTION__, stdin_path.c_str ()); 1594 else 1595 log->Printf ("NativeProcessLinux::%s leaving STDIN as is", __FUNCTION__); 1596 1597 if (!stdout_path.empty ()) 1598 log->Printf ("NativeProcessLinux::%s setting STDOUT to '%s'", __FUNCTION__, stdout_path.c_str ()); 1599 else 1600 log->Printf ("NativeProcessLinux::%s leaving STDOUT as is", __FUNCTION__); 1601 1602 if (!stderr_path.empty ()) 1603 log->Printf ("NativeProcessLinux::%s setting STDERR to '%s'", __FUNCTION__, stderr_path.c_str ()); 1604 else 1605 log->Printf ("NativeProcessLinux::%s leaving STDERR as is", __FUNCTION__); 1606 } 1607 1608 // Create the NativeProcessLinux in launch mode. 1609 native_process_sp.reset (new NativeProcessLinux ()); 1610 1611 if (log) 1612 { 1613 int i = 0; 1614 for (const char **args = launch_info.GetArguments ().GetConstArgumentVector (); *args; ++args, ++i) 1615 { 1616 log->Printf ("NativeProcessLinux::%s arg %d: \"%s\"", __FUNCTION__, i, *args ? *args : "nullptr"); 1617 ++i; 1618 } 1619 } 1620 1621 if (!native_process_sp->RegisterNativeDelegate (native_delegate)) 1622 { 1623 native_process_sp.reset (); 1624 error.SetErrorStringWithFormat ("failed to register the native delegate"); 1625 return error; 1626 } 1627 1628 std::static_pointer_cast<NativeProcessLinux> (native_process_sp)->LaunchInferior ( 1629 exe_module, 1630 launch_info.GetArguments ().GetConstArgumentVector (), 1631 launch_info.GetEnvironmentEntries ().GetConstArgumentVector (), 1632 stdin_path, 1633 stdout_path, 1634 stderr_path, 1635 working_dir, 1636 launch_info, 1637 error); 1638 1639 if (error.Fail ()) 1640 { 1641 native_process_sp.reset (); 1642 if (log) 1643 log->Printf ("NativeProcessLinux::%s failed to launch process: %s", __FUNCTION__, error.AsCString ()); 1644 return error; 1645 } 1646 1647 launch_info.SetProcessID (native_process_sp->GetID ()); 1648 1649 return error; 1650 } 1651 1652 Error 1653 NativeProcessLinux::AttachToProcess ( 1654 lldb::pid_t pid, 1655 NativeProcessProtocol::NativeDelegate &native_delegate, 1656 NativeProcessProtocolSP &native_process_sp) 1657 { 1658 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 1659 if (log && log->GetMask ().Test (POSIX_LOG_VERBOSE)) 1660 log->Printf ("NativeProcessLinux::%s(pid = %" PRIi64 ")", __FUNCTION__, pid); 1661 1662 // Grab the current platform architecture. This should be Linux, 1663 // since this code is only intended to run on a Linux host. 1664 PlatformSP platform_sp (Platform::GetHostPlatform ()); 1665 if (!platform_sp) 1666 return Error("failed to get a valid default platform"); 1667 1668 // Retrieve the architecture for the running process. 1669 ArchSpec process_arch; 1670 Error error = ResolveProcessArchitecture (pid, *platform_sp.get (), process_arch); 1671 if (!error.Success ()) 1672 return error; 1673 1674 std::shared_ptr<NativeProcessLinux> native_process_linux_sp (new NativeProcessLinux ()); 1675 1676 if (!native_process_linux_sp->RegisterNativeDelegate (native_delegate)) 1677 { 1678 error.SetErrorStringWithFormat ("failed to register the native delegate"); 1679 return error; 1680 } 1681 1682 native_process_linux_sp->AttachToInferior (pid, error); 1683 if (!error.Success ()) 1684 return error; 1685 1686 native_process_sp = native_process_linux_sp; 1687 return error; 1688 } 1689 1690 // ----------------------------------------------------------------------------- 1691 // Public Instance Methods 1692 // ----------------------------------------------------------------------------- 1693 1694 NativeProcessLinux::NativeProcessLinux () : 1695 NativeProcessProtocol (LLDB_INVALID_PROCESS_ID), 1696 m_arch (), 1697 m_supports_mem_region (eLazyBoolCalculate), 1698 m_mem_region_cache (), 1699 m_mem_region_cache_mutex () 1700 { 1701 } 1702 1703 //------------------------------------------------------------------------------ 1704 // NativeProcessLinux spawns a new thread which performs all operations on the inferior process. 1705 // Refer to Monitor and Operation classes to see why this is necessary. 1706 //------------------------------------------------------------------------------ 1707 void 1708 NativeProcessLinux::LaunchInferior ( 1709 Module *module, 1710 const char *argv[], 1711 const char *envp[], 1712 const std::string &stdin_path, 1713 const std::string &stdout_path, 1714 const std::string &stderr_path, 1715 const char *working_dir, 1716 const ProcessLaunchInfo &launch_info, 1717 Error &error) 1718 { 1719 if (module) 1720 m_arch = module->GetArchitecture (); 1721 1722 SetState (eStateLaunching); 1723 1724 std::unique_ptr<LaunchArgs> args( 1725 new LaunchArgs( 1726 module, argv, envp, 1727 stdin_path, stdout_path, stderr_path, 1728 working_dir, launch_info)); 1729 1730 StartMonitorThread ([&] (Error &e) { return Launch(args.get(), e); }, error); 1731 if (!error.Success ()) 1732 return; 1733 } 1734 1735 void 1736 NativeProcessLinux::AttachToInferior (lldb::pid_t pid, Error &error) 1737 { 1738 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 1739 if (log) 1740 log->Printf ("NativeProcessLinux::%s (pid = %" PRIi64 ")", __FUNCTION__, pid); 1741 1742 // We can use the Host for everything except the ResolveExecutable portion. 1743 PlatformSP platform_sp = Platform::GetHostPlatform (); 1744 if (!platform_sp) 1745 { 1746 if (log) 1747 log->Printf ("NativeProcessLinux::%s (pid = %" PRIi64 "): no default platform set", __FUNCTION__, pid); 1748 error.SetErrorString ("no default platform available"); 1749 return; 1750 } 1751 1752 // Gather info about the process. 1753 ProcessInstanceInfo process_info; 1754 if (!platform_sp->GetProcessInfo (pid, process_info)) 1755 { 1756 if (log) 1757 log->Printf ("NativeProcessLinux::%s (pid = %" PRIi64 "): failed to get process info", __FUNCTION__, pid); 1758 error.SetErrorString ("failed to get process info"); 1759 return; 1760 } 1761 1762 // Resolve the executable module 1763 ModuleSP exe_module_sp; 1764 FileSpecList executable_search_paths (Target::GetDefaultExecutableSearchPaths()); 1765 ModuleSpec exe_module_spec(process_info.GetExecutableFile(), process_info.GetArchitecture()); 1766 error = platform_sp->ResolveExecutable(exe_module_spec, exe_module_sp, 1767 executable_search_paths.GetSize() ? &executable_search_paths : NULL); 1768 if (!error.Success()) 1769 return; 1770 1771 // Set the architecture to the exe architecture. 1772 m_arch = exe_module_sp->GetArchitecture(); 1773 if (log) 1774 log->Printf ("NativeProcessLinux::%s (pid = %" PRIi64 ") detected architecture %s", __FUNCTION__, pid, m_arch.GetArchitectureName ()); 1775 1776 m_pid = pid; 1777 SetState(eStateAttaching); 1778 1779 StartMonitorThread ([=] (Error &e) { return Attach(pid, e); }, error); 1780 if (!error.Success ()) 1781 return; 1782 } 1783 1784 void 1785 NativeProcessLinux::Terminate () 1786 { 1787 m_monitor_up->Terminate(); 1788 } 1789 1790 ::pid_t 1791 NativeProcessLinux::Launch(LaunchArgs *args, Error &error) 1792 { 1793 assert (args && "null args"); 1794 1795 const char **argv = args->m_argv; 1796 const char **envp = args->m_envp; 1797 const char *working_dir = args->m_working_dir; 1798 1799 lldb_utility::PseudoTerminal terminal; 1800 const size_t err_len = 1024; 1801 char err_str[err_len]; 1802 lldb::pid_t pid; 1803 NativeThreadProtocolSP thread_sp; 1804 1805 lldb::ThreadSP inferior; 1806 1807 // Propagate the environment if one is not supplied. 1808 if (envp == NULL || envp[0] == NULL) 1809 envp = const_cast<const char **>(environ); 1810 1811 if ((pid = terminal.Fork(err_str, err_len)) == static_cast<lldb::pid_t> (-1)) 1812 { 1813 error.SetErrorToGenericError(); 1814 error.SetErrorStringWithFormat("Process fork failed: %s", err_str); 1815 return -1; 1816 } 1817 1818 // Recognized child exit status codes. 1819 enum { 1820 ePtraceFailed = 1, 1821 eDupStdinFailed, 1822 eDupStdoutFailed, 1823 eDupStderrFailed, 1824 eChdirFailed, 1825 eExecFailed, 1826 eSetGidFailed 1827 }; 1828 1829 // Child process. 1830 if (pid == 0) 1831 { 1832 // FIXME consider opening a pipe between parent/child and have this forked child 1833 // send log info to parent re: launch status, in place of the log lines removed here. 1834 1835 // Start tracing this child that is about to exec. 1836 PTRACE(PTRACE_TRACEME, 0, nullptr, nullptr, 0, error); 1837 if (error.Fail()) 1838 exit(ePtraceFailed); 1839 1840 // terminal has already dupped the tty descriptors to stdin/out/err. 1841 // This closes original fd from which they were copied (and avoids 1842 // leaking descriptors to the debugged process. 1843 terminal.CloseSlaveFileDescriptor(); 1844 1845 // Do not inherit setgid powers. 1846 if (setgid(getgid()) != 0) 1847 exit(eSetGidFailed); 1848 1849 // Attempt to have our own process group. 1850 if (setpgid(0, 0) != 0) 1851 { 1852 // FIXME log that this failed. This is common. 1853 // Don't allow this to prevent an inferior exec. 1854 } 1855 1856 // Dup file descriptors if needed. 1857 if (!args->m_stdin_path.empty ()) 1858 if (!DupDescriptor(args->m_stdin_path.c_str (), STDIN_FILENO, O_RDONLY)) 1859 exit(eDupStdinFailed); 1860 1861 if (!args->m_stdout_path.empty ()) 1862 if (!DupDescriptor(args->m_stdout_path.c_str (), STDOUT_FILENO, O_WRONLY | O_CREAT | O_TRUNC)) 1863 exit(eDupStdoutFailed); 1864 1865 if (!args->m_stderr_path.empty ()) 1866 if (!DupDescriptor(args->m_stderr_path.c_str (), STDERR_FILENO, O_WRONLY | O_CREAT | O_TRUNC)) 1867 exit(eDupStderrFailed); 1868 1869 // Close everything besides stdin, stdout, and stderr that has no file 1870 // action to avoid leaking 1871 for (int fd = 3; fd < sysconf(_SC_OPEN_MAX); ++fd) 1872 if (!args->m_launch_info.GetFileActionForFD(fd)) 1873 close(fd); 1874 1875 // Change working directory 1876 if (working_dir != NULL && working_dir[0]) 1877 if (0 != ::chdir(working_dir)) 1878 exit(eChdirFailed); 1879 1880 // Disable ASLR if requested. 1881 if (args->m_launch_info.GetFlags ().Test (lldb::eLaunchFlagDisableASLR)) 1882 { 1883 const int old_personality = personality (LLDB_PERSONALITY_GET_CURRENT_SETTINGS); 1884 if (old_personality == -1) 1885 { 1886 // Can't retrieve Linux personality. Cannot disable ASLR. 1887 } 1888 else 1889 { 1890 const int new_personality = personality (ADDR_NO_RANDOMIZE | old_personality); 1891 if (new_personality == -1) 1892 { 1893 // Disabling ASLR failed. 1894 } 1895 else 1896 { 1897 // Disabling ASLR succeeded. 1898 } 1899 } 1900 } 1901 1902 // Execute. We should never return... 1903 execve(argv[0], 1904 const_cast<char *const *>(argv), 1905 const_cast<char *const *>(envp)); 1906 1907 // ...unless exec fails. In which case we definitely need to end the child here. 1908 exit(eExecFailed); 1909 } 1910 1911 // 1912 // This is the parent code here. 1913 // 1914 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 1915 1916 // Wait for the child process to trap on its call to execve. 1917 ::pid_t wpid; 1918 int status; 1919 if ((wpid = waitpid(pid, &status, 0)) < 0) 1920 { 1921 error.SetErrorToErrno(); 1922 if (log) 1923 log->Printf ("NativeProcessLinux::%s waitpid for inferior failed with %s", 1924 __FUNCTION__, error.AsCString ()); 1925 1926 // Mark the inferior as invalid. 1927 // FIXME this could really use a new state - eStateLaunchFailure. For now, using eStateInvalid. 1928 SetState (StateType::eStateInvalid); 1929 1930 return -1; 1931 } 1932 else if (WIFEXITED(status)) 1933 { 1934 // open, dup or execve likely failed for some reason. 1935 error.SetErrorToGenericError(); 1936 switch (WEXITSTATUS(status)) 1937 { 1938 case ePtraceFailed: 1939 error.SetErrorString("Child ptrace failed."); 1940 break; 1941 case eDupStdinFailed: 1942 error.SetErrorString("Child open stdin failed."); 1943 break; 1944 case eDupStdoutFailed: 1945 error.SetErrorString("Child open stdout failed."); 1946 break; 1947 case eDupStderrFailed: 1948 error.SetErrorString("Child open stderr failed."); 1949 break; 1950 case eChdirFailed: 1951 error.SetErrorString("Child failed to set working directory."); 1952 break; 1953 case eExecFailed: 1954 error.SetErrorString("Child exec failed."); 1955 break; 1956 case eSetGidFailed: 1957 error.SetErrorString("Child setgid failed."); 1958 break; 1959 default: 1960 error.SetErrorString("Child returned unknown exit status."); 1961 break; 1962 } 1963 1964 if (log) 1965 { 1966 log->Printf ("NativeProcessLinux::%s inferior exited with status %d before issuing a STOP", 1967 __FUNCTION__, 1968 WEXITSTATUS(status)); 1969 } 1970 1971 // Mark the inferior as invalid. 1972 // FIXME this could really use a new state - eStateLaunchFailure. For now, using eStateInvalid. 1973 SetState (StateType::eStateInvalid); 1974 1975 return -1; 1976 } 1977 assert(WIFSTOPPED(status) && (wpid == static_cast< ::pid_t> (pid)) && 1978 "Could not sync with inferior process."); 1979 1980 if (log) 1981 log->Printf ("NativeProcessLinux::%s inferior started, now in stopped state", __FUNCTION__); 1982 1983 error = SetDefaultPtraceOpts(pid); 1984 if (error.Fail()) 1985 { 1986 if (log) 1987 log->Printf ("NativeProcessLinux::%s inferior failed to set default ptrace options: %s", 1988 __FUNCTION__, error.AsCString ()); 1989 1990 // Mark the inferior as invalid. 1991 // FIXME this could really use a new state - eStateLaunchFailure. For now, using eStateInvalid. 1992 SetState (StateType::eStateInvalid); 1993 1994 return -1; 1995 } 1996 1997 // Release the master terminal descriptor and pass it off to the 1998 // NativeProcessLinux instance. Similarly stash the inferior pid. 1999 m_terminal_fd = terminal.ReleaseMasterFileDescriptor(); 2000 m_pid = pid; 2001 2002 // Set the terminal fd to be in non blocking mode (it simplifies the 2003 // implementation of ProcessLinux::GetSTDOUT to have a non-blocking 2004 // descriptor to read from). 2005 error = EnsureFDFlags(m_terminal_fd, O_NONBLOCK); 2006 if (error.Fail()) 2007 { 2008 if (log) 2009 log->Printf ("NativeProcessLinux::%s inferior EnsureFDFlags failed for ensuring terminal O_NONBLOCK setting: %s", 2010 __FUNCTION__, error.AsCString ()); 2011 2012 // Mark the inferior as invalid. 2013 // FIXME this could really use a new state - eStateLaunchFailure. For now, using eStateInvalid. 2014 SetState (StateType::eStateInvalid); 2015 2016 return -1; 2017 } 2018 2019 if (log) 2020 log->Printf ("NativeProcessLinux::%s() adding pid = %" PRIu64, __FUNCTION__, pid); 2021 2022 thread_sp = AddThread (pid); 2023 assert (thread_sp && "AddThread() returned a nullptr thread"); 2024 std::static_pointer_cast<NativeThreadLinux> (thread_sp)->SetStoppedBySignal (SIGSTOP); 2025 ThreadWasCreated(pid); 2026 2027 // Let our process instance know the thread has stopped. 2028 SetCurrentThreadID (thread_sp->GetID ()); 2029 SetState (StateType::eStateStopped); 2030 2031 if (log) 2032 { 2033 if (error.Success ()) 2034 { 2035 log->Printf ("NativeProcessLinux::%s inferior launching succeeded", __FUNCTION__); 2036 } 2037 else 2038 { 2039 log->Printf ("NativeProcessLinux::%s inferior launching failed: %s", 2040 __FUNCTION__, error.AsCString ()); 2041 return -1; 2042 } 2043 } 2044 return pid; 2045 } 2046 2047 ::pid_t 2048 NativeProcessLinux::Attach(lldb::pid_t pid, Error &error) 2049 { 2050 lldb::ThreadSP inferior; 2051 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 2052 2053 // Use a map to keep track of the threads which we have attached/need to attach. 2054 Host::TidMap tids_to_attach; 2055 if (pid <= 1) 2056 { 2057 error.SetErrorToGenericError(); 2058 error.SetErrorString("Attaching to process 1 is not allowed."); 2059 return -1; 2060 } 2061 2062 while (Host::FindProcessThreads(pid, tids_to_attach)) 2063 { 2064 for (Host::TidMap::iterator it = tids_to_attach.begin(); 2065 it != tids_to_attach.end();) 2066 { 2067 if (it->second == false) 2068 { 2069 lldb::tid_t tid = it->first; 2070 2071 // Attach to the requested process. 2072 // An attach will cause the thread to stop with a SIGSTOP. 2073 PTRACE(PTRACE_ATTACH, tid, nullptr, nullptr, 0, error); 2074 if (error.Fail()) 2075 { 2076 // No such thread. The thread may have exited. 2077 // More error handling may be needed. 2078 if (error.GetError() == ESRCH) 2079 { 2080 it = tids_to_attach.erase(it); 2081 continue; 2082 } 2083 else 2084 return -1; 2085 } 2086 2087 int status; 2088 // Need to use __WALL otherwise we receive an error with errno=ECHLD 2089 // At this point we should have a thread stopped if waitpid succeeds. 2090 if ((status = waitpid(tid, NULL, __WALL)) < 0) 2091 { 2092 // No such thread. The thread may have exited. 2093 // More error handling may be needed. 2094 if (errno == ESRCH) 2095 { 2096 it = tids_to_attach.erase(it); 2097 continue; 2098 } 2099 else 2100 { 2101 error.SetErrorToErrno(); 2102 return -1; 2103 } 2104 } 2105 2106 error = SetDefaultPtraceOpts(tid); 2107 if (error.Fail()) 2108 return -1; 2109 2110 if (log) 2111 log->Printf ("NativeProcessLinux::%s() adding tid = %" PRIu64, __FUNCTION__, tid); 2112 2113 it->second = true; 2114 2115 // Create the thread, mark it as stopped. 2116 NativeThreadProtocolSP thread_sp (AddThread (static_cast<lldb::tid_t> (tid))); 2117 assert (thread_sp && "AddThread() returned a nullptr"); 2118 2119 // This will notify this is a new thread and tell the system it is stopped. 2120 std::static_pointer_cast<NativeThreadLinux> (thread_sp)->SetStoppedBySignal (SIGSTOP); 2121 ThreadWasCreated(tid); 2122 SetCurrentThreadID (thread_sp->GetID ()); 2123 } 2124 2125 // move the loop forward 2126 ++it; 2127 } 2128 } 2129 2130 if (tids_to_attach.size() > 0) 2131 { 2132 m_pid = pid; 2133 // Let our process instance know the thread has stopped. 2134 SetState (StateType::eStateStopped); 2135 } 2136 else 2137 { 2138 error.SetErrorToGenericError(); 2139 error.SetErrorString("No such process."); 2140 return -1; 2141 } 2142 2143 return pid; 2144 } 2145 2146 Error 2147 NativeProcessLinux::SetDefaultPtraceOpts(lldb::pid_t pid) 2148 { 2149 long ptrace_opts = 0; 2150 2151 // Have the child raise an event on exit. This is used to keep the child in 2152 // limbo until it is destroyed. 2153 ptrace_opts |= PTRACE_O_TRACEEXIT; 2154 2155 // Have the tracer trace threads which spawn in the inferior process. 2156 // TODO: if we want to support tracing the inferiors' child, add the 2157 // appropriate ptrace flags here (PTRACE_O_TRACEFORK, PTRACE_O_TRACEVFORK) 2158 ptrace_opts |= PTRACE_O_TRACECLONE; 2159 2160 // Have the tracer notify us before execve returns 2161 // (needed to disable legacy SIGTRAP generation) 2162 ptrace_opts |= PTRACE_O_TRACEEXEC; 2163 2164 Error error; 2165 PTRACE(PTRACE_SETOPTIONS, pid, nullptr, (void*)ptrace_opts, 0, error); 2166 return error; 2167 } 2168 2169 static ExitType convert_pid_status_to_exit_type (int status) 2170 { 2171 if (WIFEXITED (status)) 2172 return ExitType::eExitTypeExit; 2173 else if (WIFSIGNALED (status)) 2174 return ExitType::eExitTypeSignal; 2175 else if (WIFSTOPPED (status)) 2176 return ExitType::eExitTypeStop; 2177 else 2178 { 2179 // We don't know what this is. 2180 return ExitType::eExitTypeInvalid; 2181 } 2182 } 2183 2184 static int convert_pid_status_to_return_code (int status) 2185 { 2186 if (WIFEXITED (status)) 2187 return WEXITSTATUS (status); 2188 else if (WIFSIGNALED (status)) 2189 return WTERMSIG (status); 2190 else if (WIFSTOPPED (status)) 2191 return WSTOPSIG (status); 2192 else 2193 { 2194 // We don't know what this is. 2195 return ExitType::eExitTypeInvalid; 2196 } 2197 } 2198 2199 // Handles all waitpid events from the inferior process. 2200 void 2201 NativeProcessLinux::MonitorCallback(lldb::pid_t pid, 2202 bool exited, 2203 int signal, 2204 int status) 2205 { 2206 Log *log (GetLogIfAnyCategoriesSet (LIBLLDB_LOG_PROCESS)); 2207 2208 // Certain activities differ based on whether the pid is the tid of the main thread. 2209 const bool is_main_thread = (pid == GetID ()); 2210 2211 // Handle when the thread exits. 2212 if (exited) 2213 { 2214 if (log) 2215 log->Printf ("NativeProcessLinux::%s() got exit signal(%d) , tid = %" PRIu64 " (%s main thread)", __FUNCTION__, signal, pid, is_main_thread ? "is" : "is not"); 2216 2217 // This is a thread that exited. Ensure we're not tracking it anymore. 2218 const bool thread_found = StopTrackingThread (pid); 2219 2220 if (is_main_thread) 2221 { 2222 // We only set the exit status and notify the delegate if we haven't already set the process 2223 // state to an exited state. We normally should have received a SIGTRAP | (PTRACE_EVENT_EXIT << 8) 2224 // for the main thread. 2225 const bool already_notified = (GetState() == StateType::eStateExited) || (GetState () == StateType::eStateCrashed); 2226 if (!already_notified) 2227 { 2228 if (log) 2229 log->Printf ("NativeProcessLinux::%s() tid = %" PRIu64 " handling main thread exit (%s), expected exit state already set but state was %s instead, setting exit state now", __FUNCTION__, pid, thread_found ? "stopped tracking thread metadata" : "thread metadata not found", StateAsCString (GetState ())); 2230 // The main thread exited. We're done monitoring. Report to delegate. 2231 SetExitStatus (convert_pid_status_to_exit_type (status), convert_pid_status_to_return_code (status), nullptr, true); 2232 2233 // Notify delegate that our process has exited. 2234 SetState (StateType::eStateExited, true); 2235 } 2236 else 2237 { 2238 if (log) 2239 log->Printf ("NativeProcessLinux::%s() tid = %" PRIu64 " main thread now exited (%s)", __FUNCTION__, pid, thread_found ? "stopped tracking thread metadata" : "thread metadata not found"); 2240 } 2241 } 2242 else 2243 { 2244 // Do we want to report to the delegate in this case? I think not. If this was an orderly 2245 // thread exit, we would already have received the SIGTRAP | (PTRACE_EVENT_EXIT << 8) signal, 2246 // and we would have done an all-stop then. 2247 if (log) 2248 log->Printf ("NativeProcessLinux::%s() tid = %" PRIu64 " handling non-main thread exit (%s)", __FUNCTION__, pid, thread_found ? "stopped tracking thread metadata" : "thread metadata not found"); 2249 } 2250 return; 2251 } 2252 2253 // Get details on the signal raised. 2254 siginfo_t info; 2255 const auto err = GetSignalInfo(pid, &info); 2256 if (err.Success()) 2257 { 2258 // We have retrieved the signal info. Dispatch appropriately. 2259 if (info.si_signo == SIGTRAP) 2260 MonitorSIGTRAP(&info, pid); 2261 else 2262 MonitorSignal(&info, pid, exited); 2263 } 2264 else 2265 { 2266 if (err.GetError() == EINVAL) 2267 { 2268 // This is a group stop reception for this tid. 2269 if (log) 2270 log->Printf ("NativeProcessLinux::%s received a group stop for pid %" PRIu64 " tid %" PRIu64, __FUNCTION__, GetID (), pid); 2271 ThreadDidStop(pid, false); 2272 } 2273 else 2274 { 2275 // ptrace(GETSIGINFO) failed (but not due to group-stop). 2276 2277 // A return value of ESRCH means the thread/process is no longer on the system, 2278 // so it was killed somehow outside of our control. Either way, we can't do anything 2279 // with it anymore. 2280 2281 // Stop tracking the metadata for the thread since it's entirely off the system now. 2282 const bool thread_found = StopTrackingThread (pid); 2283 2284 if (log) 2285 log->Printf ("NativeProcessLinux::%s GetSignalInfo failed: %s, tid = %" PRIu64 ", signal = %d, status = %d (%s, %s, %s)", 2286 __FUNCTION__, err.AsCString(), pid, signal, status, err.GetError() == ESRCH ? "thread/process killed" : "unknown reason", is_main_thread ? "is main thread" : "is not main thread", thread_found ? "thread metadata removed" : "thread metadata not found"); 2287 2288 if (is_main_thread) 2289 { 2290 // Notify the delegate - our process is not available but appears to have been killed outside 2291 // our control. Is eStateExited the right exit state in this case? 2292 SetExitStatus (convert_pid_status_to_exit_type (status), convert_pid_status_to_return_code (status), nullptr, true); 2293 SetState (StateType::eStateExited, true); 2294 } 2295 else 2296 { 2297 // This thread was pulled out from underneath us. Anything to do here? Do we want to do an all stop? 2298 if (log) 2299 log->Printf ("NativeProcessLinux::%s pid %" PRIu64 " tid %" PRIu64 " non-main thread exit occurred, didn't tell delegate anything since thread disappeared out from underneath us", __FUNCTION__, GetID (), pid); 2300 } 2301 } 2302 } 2303 } 2304 2305 void 2306 NativeProcessLinux::WaitForNewThread(::pid_t tid) 2307 { 2308 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 2309 2310 NativeThreadProtocolSP new_thread_sp = GetThreadByID(tid); 2311 2312 if (new_thread_sp) 2313 { 2314 // We are already tracking the thread - we got the event on the new thread (see 2315 // MonitorSignal) before this one. We are done. 2316 return; 2317 } 2318 2319 // The thread is not tracked yet, let's wait for it to appear. 2320 int status = -1; 2321 ::pid_t wait_pid; 2322 do 2323 { 2324 if (log) 2325 log->Printf ("NativeProcessLinux::%s() received thread creation event for tid %" PRIu32 ". tid not tracked yet, waiting for thread to appear...", __FUNCTION__, tid); 2326 wait_pid = waitpid(tid, &status, __WALL); 2327 } 2328 while (wait_pid == -1 && errno == EINTR); 2329 // Since we are waiting on a specific tid, this must be the creation event. But let's do 2330 // some checks just in case. 2331 if (wait_pid != tid) { 2332 if (log) 2333 log->Printf ("NativeProcessLinux::%s() waiting for tid %" PRIu32 " failed. Assuming the thread has disappeared in the meantime", __FUNCTION__, tid); 2334 // The only way I know of this could happen is if the whole process was 2335 // SIGKILLed in the mean time. In any case, we can't do anything about that now. 2336 return; 2337 } 2338 if (WIFEXITED(status)) 2339 { 2340 if (log) 2341 log->Printf ("NativeProcessLinux::%s() waiting for tid %" PRIu32 " returned an 'exited' event. Not tracking the thread.", __FUNCTION__, tid); 2342 // Also a very improbable event. 2343 return; 2344 } 2345 2346 siginfo_t info; 2347 Error error = GetSignalInfo(tid, &info); 2348 if (error.Fail()) 2349 { 2350 if (log) 2351 log->Printf ("NativeProcessLinux::%s() GetSignalInfo for tid %" PRIu32 " failed. Assuming the thread has disappeared in the meantime.", __FUNCTION__, tid); 2352 return; 2353 } 2354 2355 if (((info.si_pid != 0) || (info.si_code != SI_USER)) && log) 2356 { 2357 // We should be getting a thread creation signal here, but we received something 2358 // else. There isn't much we can do about it now, so we will just log that. Since the 2359 // thread is alive and we are receiving events from it, we shall pretend that it was 2360 // created properly. 2361 log->Printf ("NativeProcessLinux::%s() GetSignalInfo for tid %" PRIu32 " received unexpected signal with code %d from pid %d.", __FUNCTION__, tid, info.si_code, info.si_pid); 2362 } 2363 2364 if (log) 2365 log->Printf ("NativeProcessLinux::%s() pid = %" PRIu64 ": tracking new thread tid %" PRIu32, 2366 __FUNCTION__, GetID (), tid); 2367 2368 new_thread_sp = AddThread(tid); 2369 std::static_pointer_cast<NativeThreadLinux> (new_thread_sp)->SetRunning (); 2370 Resume (tid, LLDB_INVALID_SIGNAL_NUMBER); 2371 ThreadWasCreated(tid); 2372 } 2373 2374 void 2375 NativeProcessLinux::MonitorSIGTRAP(const siginfo_t *info, lldb::pid_t pid) 2376 { 2377 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 2378 const bool is_main_thread = (pid == GetID ()); 2379 2380 assert(info && info->si_signo == SIGTRAP && "Unexpected child signal!"); 2381 if (!info) 2382 return; 2383 2384 Mutex::Locker locker (m_threads_mutex); 2385 2386 // See if we can find a thread for this signal. 2387 NativeThreadProtocolSP thread_sp = GetThreadByID (pid); 2388 if (!thread_sp) 2389 { 2390 if (log) 2391 log->Printf ("NativeProcessLinux::%s() pid %" PRIu64 " no thread found for tid %" PRIu64, __FUNCTION__, GetID (), pid); 2392 } 2393 2394 switch (info->si_code) 2395 { 2396 // TODO: these two cases are required if we want to support tracing of the inferiors' children. We'd need this to debug a monitor. 2397 // case (SIGTRAP | (PTRACE_EVENT_FORK << 8)): 2398 // case (SIGTRAP | (PTRACE_EVENT_VFORK << 8)): 2399 2400 case (SIGTRAP | (PTRACE_EVENT_CLONE << 8)): 2401 { 2402 // This is the notification on the parent thread which informs us of new thread 2403 // creation. 2404 // We don't want to do anything with the parent thread so we just resume it. In case we 2405 // want to implement "break on thread creation" functionality, we would need to stop 2406 // here. 2407 2408 unsigned long event_message = 0; 2409 if (GetEventMessage (pid, &event_message).Fail()) 2410 { 2411 if (log) 2412 log->Printf ("NativeProcessLinux::%s() pid %" PRIu64 " received thread creation event but GetEventMessage failed so we don't know the new tid", __FUNCTION__, pid); 2413 } else 2414 WaitForNewThread(event_message); 2415 2416 Resume (pid, LLDB_INVALID_SIGNAL_NUMBER); 2417 break; 2418 } 2419 2420 case (SIGTRAP | (PTRACE_EVENT_EXEC << 8)): 2421 { 2422 NativeThreadProtocolSP main_thread_sp; 2423 if (log) 2424 log->Printf ("NativeProcessLinux::%s() received exec event, code = %d", __FUNCTION__, info->si_code ^ SIGTRAP); 2425 2426 // Exec clears any pending notifications. 2427 m_pending_notification_up.reset (); 2428 2429 // Remove all but the main thread here. Linux fork creates a new process which only copies the main thread. Mutexes are in undefined state. 2430 if (log) 2431 log->Printf ("NativeProcessLinux::%s exec received, stop tracking all but main thread", __FUNCTION__); 2432 2433 for (auto thread_sp : m_threads) 2434 { 2435 const bool is_main_thread = thread_sp && thread_sp->GetID () == GetID (); 2436 if (is_main_thread) 2437 { 2438 main_thread_sp = thread_sp; 2439 if (log) 2440 log->Printf ("NativeProcessLinux::%s found main thread with tid %" PRIu64 ", keeping", __FUNCTION__, main_thread_sp->GetID ()); 2441 } 2442 else 2443 { 2444 // Tell thread coordinator this thread is dead. 2445 if (log) 2446 log->Printf ("NativeProcessLinux::%s discarding non-main-thread tid %" PRIu64 " due to exec", __FUNCTION__, thread_sp->GetID ()); 2447 } 2448 } 2449 2450 m_threads.clear (); 2451 2452 if (main_thread_sp) 2453 { 2454 m_threads.push_back (main_thread_sp); 2455 SetCurrentThreadID (main_thread_sp->GetID ()); 2456 std::static_pointer_cast<NativeThreadLinux> (main_thread_sp)->SetStoppedByExec (); 2457 } 2458 else 2459 { 2460 SetCurrentThreadID (LLDB_INVALID_THREAD_ID); 2461 if (log) 2462 log->Printf ("NativeProcessLinux::%s pid %" PRIu64 "no main thread found, discarded all threads, we're in a no-thread state!", __FUNCTION__, GetID ()); 2463 } 2464 2465 // Tell coordinator about about the "new" (since exec) stopped main thread. 2466 const lldb::tid_t main_thread_tid = GetID (); 2467 ThreadWasCreated(main_thread_tid); 2468 2469 // NOTE: ideally these next statements would execute at the same time as the coordinator thread create was executed. 2470 // Consider a handler that can execute when that happens. 2471 // Let our delegate know we have just exec'd. 2472 NotifyDidExec (); 2473 2474 // If we have a main thread, indicate we are stopped. 2475 assert (main_thread_sp && "exec called during ptraced process but no main thread metadata tracked"); 2476 2477 // Let the process know we're stopped. 2478 StopRunningThreads (pid); 2479 2480 break; 2481 } 2482 2483 case (SIGTRAP | (PTRACE_EVENT_EXIT << 8)): 2484 { 2485 // The inferior process or one of its threads is about to exit. 2486 // We don't want to do anything with the thread so we just resume it. In case we 2487 // want to implement "break on thread exit" functionality, we would need to stop 2488 // here. 2489 2490 unsigned long data = 0; 2491 if (GetEventMessage(pid, &data).Fail()) 2492 data = -1; 2493 2494 if (log) 2495 { 2496 log->Printf ("NativeProcessLinux::%s() received PTRACE_EVENT_EXIT, data = %lx (WIFEXITED=%s,WIFSIGNALED=%s), pid = %" PRIu64 " (%s)", 2497 __FUNCTION__, 2498 data, WIFEXITED (data) ? "true" : "false", WIFSIGNALED (data) ? "true" : "false", 2499 pid, 2500 is_main_thread ? "is main thread" : "not main thread"); 2501 } 2502 2503 if (is_main_thread) 2504 { 2505 SetExitStatus (convert_pid_status_to_exit_type (data), convert_pid_status_to_return_code (data), nullptr, true); 2506 } 2507 2508 Resume(pid, LLDB_INVALID_SIGNAL_NUMBER); 2509 2510 break; 2511 } 2512 2513 case 0: 2514 case TRAP_TRACE: // We receive this on single stepping. 2515 case TRAP_HWBKPT: // We receive this on watchpoint hit 2516 if (thread_sp) 2517 { 2518 // If a watchpoint was hit, report it 2519 uint32_t wp_index; 2520 Error error = thread_sp->GetRegisterContext()->GetWatchpointHitIndex(wp_index, (lldb::addr_t)info->si_addr); 2521 if (error.Fail() && log) 2522 log->Printf("NativeProcessLinux::%s() " 2523 "received error while checking for watchpoint hits, " 2524 "pid = %" PRIu64 " error = %s", 2525 __FUNCTION__, pid, error.AsCString()); 2526 if (wp_index != LLDB_INVALID_INDEX32) 2527 { 2528 MonitorWatchpoint(pid, thread_sp, wp_index); 2529 break; 2530 } 2531 } 2532 // Otherwise, report step over 2533 MonitorTrace(pid, thread_sp); 2534 break; 2535 2536 case SI_KERNEL: 2537 case TRAP_BRKPT: 2538 MonitorBreakpoint(pid, thread_sp); 2539 break; 2540 2541 case SIGTRAP: 2542 case (SIGTRAP | 0x80): 2543 if (log) 2544 log->Printf ("NativeProcessLinux::%s() received unknown SIGTRAP system call stop event, pid %" PRIu64 "tid %" PRIu64 ", resuming", __FUNCTION__, GetID (), pid); 2545 2546 // Ignore these signals until we know more about them. 2547 Resume(pid, LLDB_INVALID_SIGNAL_NUMBER); 2548 break; 2549 2550 default: 2551 assert(false && "Unexpected SIGTRAP code!"); 2552 if (log) 2553 log->Printf ("NativeProcessLinux::%s() pid %" PRIu64 "tid %" PRIu64 " received unhandled SIGTRAP code: 0x%d", 2554 __FUNCTION__, GetID (), pid, info->si_code); 2555 break; 2556 2557 } 2558 } 2559 2560 void 2561 NativeProcessLinux::MonitorTrace(lldb::pid_t pid, NativeThreadProtocolSP thread_sp) 2562 { 2563 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS)); 2564 if (log) 2565 log->Printf("NativeProcessLinux::%s() received trace event, pid = %" PRIu64 " (single stepping)", 2566 __FUNCTION__, pid); 2567 2568 if (thread_sp) 2569 std::static_pointer_cast<NativeThreadLinux>(thread_sp)->SetStoppedByTrace(); 2570 2571 // This thread is currently stopped. 2572 ThreadDidStop(pid, false); 2573 2574 // Here we don't have to request the rest of the threads to stop or request a deferred stop. 2575 // This would have already happened at the time the Resume() with step operation was signaled. 2576 // At this point, we just need to say we stopped, and the deferred notifcation will fire off 2577 // once all running threads have checked in as stopped. 2578 SetCurrentThreadID(pid); 2579 // Tell the process we have a stop (from software breakpoint). 2580 StopRunningThreads(pid); 2581 } 2582 2583 void 2584 NativeProcessLinux::MonitorBreakpoint(lldb::pid_t pid, NativeThreadProtocolSP thread_sp) 2585 { 2586 Log *log(GetLogIfAnyCategoriesSet(LIBLLDB_LOG_PROCESS | LIBLLDB_LOG_BREAKPOINTS)); 2587 if (log) 2588 log->Printf("NativeProcessLinux::%s() received breakpoint event, pid = %" PRIu64, 2589 __FUNCTION__, pid); 2590 2591 // This thread is currently stopped. 2592 ThreadDidStop(pid, false); 2593 2594 // Mark the thread as stopped at breakpoint. 2595 if (thread_sp) 2596 { 2597 std::static_pointer_cast<NativeThreadLinux>(thread_sp)->SetStoppedByBreakpoint(); 2598 Error error = FixupBreakpointPCAsNeeded(thread_sp); 2599 if (error.Fail()) 2600 if (log) 2601 log->Printf("NativeProcessLinux::%s() pid = %" PRIu64 " fixup: %s", 2602 __FUNCTION__, pid, error.AsCString()); 2603 2604 auto it = m_threads_stepping_with_breakpoint.find(pid); 2605 if (it != m_threads_stepping_with_breakpoint.end()) 2606 { 2607 Error error = RemoveBreakpoint (it->second); 2608 if (error.Fail()) 2609 if (log) 2610 log->Printf("NativeProcessLinux::%s() pid = %" PRIu64 " remove stepping breakpoint: %s", 2611 __FUNCTION__, pid, error.AsCString()); 2612 2613 m_threads_stepping_with_breakpoint.erase(it); 2614 std::static_pointer_cast<NativeThreadLinux>(thread_sp)->SetStoppedByTrace(); 2615 } 2616 } 2617 else 2618 if (log) 2619 log->Printf("NativeProcessLinux::%s() pid = %" PRIu64 ": " 2620 "warning, cannot process software breakpoint since no thread metadata", 2621 __FUNCTION__, pid); 2622 2623 2624 // We need to tell all other running threads before we notify the delegate about this stop. 2625 StopRunningThreads(pid); 2626 } 2627 2628 void 2629 NativeProcessLinux::MonitorWatchpoint(lldb::pid_t pid, NativeThreadProtocolSP thread_sp, uint32_t wp_index) 2630 { 2631 Log *log(GetLogIfAnyCategoriesSet(LIBLLDB_LOG_PROCESS | LIBLLDB_LOG_WATCHPOINTS)); 2632 if (log) 2633 log->Printf("NativeProcessLinux::%s() received watchpoint event, " 2634 "pid = %" PRIu64 ", wp_index = %" PRIu32, 2635 __FUNCTION__, pid, wp_index); 2636 2637 // This thread is currently stopped. 2638 ThreadDidStop(pid, false); 2639 2640 // Mark the thread as stopped at watchpoint. 2641 // The address is at (lldb::addr_t)info->si_addr if we need it. 2642 lldbassert(thread_sp && "thread_sp cannot be NULL"); 2643 std::static_pointer_cast<NativeThreadLinux>(thread_sp)->SetStoppedByWatchpoint(wp_index); 2644 2645 // We need to tell all other running threads before we notify the delegate about this stop. 2646 StopRunningThreads(pid); 2647 } 2648 2649 void 2650 NativeProcessLinux::MonitorSignal(const siginfo_t *info, lldb::pid_t pid, bool exited) 2651 { 2652 assert (info && "null info"); 2653 if (!info) 2654 return; 2655 2656 const int signo = info->si_signo; 2657 const bool is_from_llgs = info->si_pid == getpid (); 2658 2659 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 2660 2661 // POSIX says that process behaviour is undefined after it ignores a SIGFPE, 2662 // SIGILL, SIGSEGV, or SIGBUS *unless* that signal was generated by a 2663 // kill(2) or raise(3). Similarly for tgkill(2) on Linux. 2664 // 2665 // IOW, user generated signals never generate what we consider to be a 2666 // "crash". 2667 // 2668 // Similarly, ACK signals generated by this monitor. 2669 2670 Mutex::Locker locker (m_threads_mutex); 2671 2672 // See if we can find a thread for this signal. 2673 NativeThreadProtocolSP thread_sp = GetThreadByID (pid); 2674 if (!thread_sp) 2675 { 2676 if (log) 2677 log->Printf ("NativeProcessLinux::%s() pid %" PRIu64 " no thread found for tid %" PRIu64, __FUNCTION__, GetID (), pid); 2678 } 2679 2680 // Handle the signal. 2681 if (info->si_code == SI_TKILL || info->si_code == SI_USER) 2682 { 2683 if (log) 2684 log->Printf ("NativeProcessLinux::%s() received signal %s (%d) with code %s, (siginfo pid = %d (%s), waitpid pid = %" PRIu64 ")", 2685 __FUNCTION__, 2686 GetUnixSignals ().GetSignalAsCString (signo), 2687 signo, 2688 (info->si_code == SI_TKILL ? "SI_TKILL" : "SI_USER"), 2689 info->si_pid, 2690 is_from_llgs ? "from llgs" : "not from llgs", 2691 pid); 2692 } 2693 2694 // Check for new thread notification. 2695 if ((info->si_pid == 0) && (info->si_code == SI_USER)) 2696 { 2697 // A new thread creation is being signaled. This is one of two parts that come in 2698 // a non-deterministic order. This code handles the case where the new thread event comes 2699 // before the event on the parent thread. For the opposite case see code in 2700 // MonitorSIGTRAP. 2701 if (log) 2702 log->Printf ("NativeProcessLinux::%s() pid = %" PRIu64 " tid %" PRIu64 ": new thread notification", 2703 __FUNCTION__, GetID (), pid); 2704 2705 thread_sp = AddThread(pid); 2706 assert (thread_sp.get() && "failed to create the tracking data for newly created inferior thread"); 2707 // We can now resume the newly created thread. 2708 std::static_pointer_cast<NativeThreadLinux> (thread_sp)->SetRunning (); 2709 Resume (pid, LLDB_INVALID_SIGNAL_NUMBER); 2710 ThreadWasCreated(pid); 2711 // Done handling. 2712 return; 2713 } 2714 2715 // Check for thread stop notification. 2716 if (is_from_llgs && (info->si_code == SI_TKILL) && (signo == SIGSTOP)) 2717 { 2718 // This is a tgkill()-based stop. 2719 if (thread_sp) 2720 { 2721 if (log) 2722 log->Printf ("NativeProcessLinux::%s() pid %" PRIu64 " tid %" PRIu64 ", thread stopped", 2723 __FUNCTION__, 2724 GetID (), 2725 pid); 2726 2727 // Check that we're not already marked with a stop reason. 2728 // Note this thread really shouldn't already be marked as stopped - if we were, that would imply that 2729 // the kernel signaled us with the thread stopping which we handled and marked as stopped, 2730 // and that, without an intervening resume, we received another stop. It is more likely 2731 // that we are missing the marking of a run state somewhere if we find that the thread was 2732 // marked as stopped. 2733 std::shared_ptr<NativeThreadLinux> linux_thread_sp = std::static_pointer_cast<NativeThreadLinux> (thread_sp); 2734 assert (linux_thread_sp && "linux_thread_sp is null!"); 2735 2736 const StateType thread_state = linux_thread_sp->GetState (); 2737 if (!StateIsStoppedState (thread_state, false)) 2738 { 2739 // An inferior thread has stopped because of a SIGSTOP we have sent it. 2740 // Generally, these are not important stops and we don't want to report them as 2741 // they are just used to stop other threads when one thread (the one with the 2742 // *real* stop reason) hits a breakpoint (watchpoint, etc...). However, in the 2743 // case of an asynchronous Interrupt(), this *is* the real stop reason, so we 2744 // leave the signal intact if this is the thread that was chosen as the 2745 // triggering thread. 2746 if (m_pending_notification_up && m_pending_notification_up->triggering_tid == pid) 2747 linux_thread_sp->SetStoppedBySignal(SIGSTOP); 2748 else 2749 linux_thread_sp->SetStoppedBySignal(0); 2750 2751 SetCurrentThreadID (thread_sp->GetID ()); 2752 ThreadDidStop (thread_sp->GetID (), true); 2753 } 2754 else 2755 { 2756 if (log) 2757 { 2758 // Retrieve the signal name if the thread was stopped by a signal. 2759 int stop_signo = 0; 2760 const bool stopped_by_signal = linux_thread_sp->IsStopped (&stop_signo); 2761 const char *signal_name = stopped_by_signal ? GetUnixSignals ().GetSignalAsCString (stop_signo) : "<not stopped by signal>"; 2762 if (!signal_name) 2763 signal_name = "<no-signal-name>"; 2764 2765 log->Printf ("NativeProcessLinux::%s() pid %" PRIu64 " tid %" PRIu64 ", thread was already marked as a stopped state (state=%s, signal=%d (%s)), leaving stop signal as is", 2766 __FUNCTION__, 2767 GetID (), 2768 linux_thread_sp->GetID (), 2769 StateAsCString (thread_state), 2770 stop_signo, 2771 signal_name); 2772 } 2773 ThreadDidStop (thread_sp->GetID (), false); 2774 } 2775 } 2776 2777 // Done handling. 2778 return; 2779 } 2780 2781 if (log) 2782 log->Printf ("NativeProcessLinux::%s() received signal %s", __FUNCTION__, GetUnixSignals ().GetSignalAsCString (signo)); 2783 2784 // This thread is stopped. 2785 ThreadDidStop (pid, false); 2786 2787 switch (signo) 2788 { 2789 case SIGSTOP: 2790 { 2791 std::static_pointer_cast<NativeThreadLinux> (thread_sp)->SetStoppedBySignal (signo); 2792 if (log) 2793 { 2794 if (is_from_llgs) 2795 log->Printf ("NativeProcessLinux::%s pid = %" PRIu64 " tid %" PRIu64 " received SIGSTOP from llgs, most likely an interrupt", __FUNCTION__, GetID (), pid); 2796 else 2797 log->Printf ("NativeProcessLinux::%s pid = %" PRIu64 " tid %" PRIu64 " received SIGSTOP from outside of debugger", __FUNCTION__, GetID (), pid); 2798 } 2799 2800 // Resume this thread to get the group-stop mechanism to fire off the true group stops. 2801 // This thread will get stopped again as part of the group-stop completion. 2802 ResumeThread(pid, 2803 [=](lldb::tid_t tid_to_resume, bool supress_signal) 2804 { 2805 std::static_pointer_cast<NativeThreadLinux> (thread_sp)->SetRunning (); 2806 // Pass this signal number on to the inferior to handle. 2807 return Resume (tid_to_resume, (supress_signal) ? LLDB_INVALID_SIGNAL_NUMBER : signo); 2808 }, 2809 true); 2810 } 2811 break; 2812 case SIGSEGV: 2813 case SIGILL: 2814 case SIGFPE: 2815 case SIGBUS: 2816 if (thread_sp) 2817 std::static_pointer_cast<NativeThreadLinux> (thread_sp)->SetCrashedWithException (*info); 2818 break; 2819 default: 2820 // This is just a pre-signal-delivery notification of the incoming signal. 2821 if (thread_sp) 2822 std::static_pointer_cast<NativeThreadLinux> (thread_sp)->SetStoppedBySignal (signo); 2823 2824 break; 2825 } 2826 2827 // Send a stop to the debugger after we get all other threads to stop. 2828 StopRunningThreads (pid); 2829 } 2830 2831 namespace { 2832 2833 struct EmulatorBaton 2834 { 2835 NativeProcessLinux* m_process; 2836 NativeRegisterContext* m_reg_context; 2837 2838 // eRegisterKindDWARF -> RegsiterValue 2839 std::unordered_map<uint32_t, RegisterValue> m_register_values; 2840 2841 EmulatorBaton(NativeProcessLinux* process, NativeRegisterContext* reg_context) : 2842 m_process(process), m_reg_context(reg_context) {} 2843 }; 2844 2845 } // anonymous namespace 2846 2847 static size_t 2848 ReadMemoryCallback (EmulateInstruction *instruction, 2849 void *baton, 2850 const EmulateInstruction::Context &context, 2851 lldb::addr_t addr, 2852 void *dst, 2853 size_t length) 2854 { 2855 EmulatorBaton* emulator_baton = static_cast<EmulatorBaton*>(baton); 2856 2857 size_t bytes_read; 2858 emulator_baton->m_process->ReadMemory(addr, dst, length, bytes_read); 2859 return bytes_read; 2860 } 2861 2862 static bool 2863 ReadRegisterCallback (EmulateInstruction *instruction, 2864 void *baton, 2865 const RegisterInfo *reg_info, 2866 RegisterValue ®_value) 2867 { 2868 EmulatorBaton* emulator_baton = static_cast<EmulatorBaton*>(baton); 2869 2870 auto it = emulator_baton->m_register_values.find(reg_info->kinds[eRegisterKindDWARF]); 2871 if (it != emulator_baton->m_register_values.end()) 2872 { 2873 reg_value = it->second; 2874 return true; 2875 } 2876 2877 // The emulator only fill in the dwarf regsiter numbers (and in some case 2878 // the generic register numbers). Get the full register info from the 2879 // register context based on the dwarf register numbers. 2880 const RegisterInfo* full_reg_info = emulator_baton->m_reg_context->GetRegisterInfo( 2881 eRegisterKindDWARF, reg_info->kinds[eRegisterKindDWARF]); 2882 2883 Error error = emulator_baton->m_reg_context->ReadRegister(full_reg_info, reg_value); 2884 if (error.Success()) 2885 return true; 2886 2887 return false; 2888 } 2889 2890 static bool 2891 WriteRegisterCallback (EmulateInstruction *instruction, 2892 void *baton, 2893 const EmulateInstruction::Context &context, 2894 const RegisterInfo *reg_info, 2895 const RegisterValue ®_value) 2896 { 2897 EmulatorBaton* emulator_baton = static_cast<EmulatorBaton*>(baton); 2898 emulator_baton->m_register_values[reg_info->kinds[eRegisterKindDWARF]] = reg_value; 2899 return true; 2900 } 2901 2902 static size_t 2903 WriteMemoryCallback (EmulateInstruction *instruction, 2904 void *baton, 2905 const EmulateInstruction::Context &context, 2906 lldb::addr_t addr, 2907 const void *dst, 2908 size_t length) 2909 { 2910 return length; 2911 } 2912 2913 static lldb::addr_t 2914 ReadFlags (NativeRegisterContext* regsiter_context) 2915 { 2916 const RegisterInfo* flags_info = regsiter_context->GetRegisterInfo( 2917 eRegisterKindGeneric, LLDB_REGNUM_GENERIC_FLAGS); 2918 return regsiter_context->ReadRegisterAsUnsigned(flags_info, LLDB_INVALID_ADDRESS); 2919 } 2920 2921 Error 2922 NativeProcessLinux::SetupSoftwareSingleStepping(NativeThreadProtocolSP thread_sp) 2923 { 2924 Error error; 2925 NativeRegisterContextSP register_context_sp = thread_sp->GetRegisterContext(); 2926 2927 std::unique_ptr<EmulateInstruction> emulator_ap( 2928 EmulateInstruction::FindPlugin(m_arch, eInstructionTypePCModifying, nullptr)); 2929 2930 if (emulator_ap == nullptr) 2931 return Error("Instruction emulator not found!"); 2932 2933 EmulatorBaton baton(this, register_context_sp.get()); 2934 emulator_ap->SetBaton(&baton); 2935 emulator_ap->SetReadMemCallback(&ReadMemoryCallback); 2936 emulator_ap->SetReadRegCallback(&ReadRegisterCallback); 2937 emulator_ap->SetWriteMemCallback(&WriteMemoryCallback); 2938 emulator_ap->SetWriteRegCallback(&WriteRegisterCallback); 2939 2940 if (!emulator_ap->ReadInstruction()) 2941 return Error("Read instruction failed!"); 2942 2943 bool emulation_result = emulator_ap->EvaluateInstruction(eEmulateInstructionOptionAutoAdvancePC); 2944 2945 const RegisterInfo* reg_info_pc = register_context_sp->GetRegisterInfo(eRegisterKindGeneric, LLDB_REGNUM_GENERIC_PC); 2946 const RegisterInfo* reg_info_flags = register_context_sp->GetRegisterInfo(eRegisterKindGeneric, LLDB_REGNUM_GENERIC_FLAGS); 2947 2948 auto pc_it = baton.m_register_values.find(reg_info_pc->kinds[eRegisterKindDWARF]); 2949 auto flags_it = baton.m_register_values.find(reg_info_flags->kinds[eRegisterKindDWARF]); 2950 2951 lldb::addr_t next_pc; 2952 lldb::addr_t next_flags; 2953 if (emulation_result) 2954 { 2955 assert(pc_it != baton.m_register_values.end() && "Emulation was successfull but PC wasn't updated"); 2956 next_pc = pc_it->second.GetAsUInt64(); 2957 2958 if (flags_it != baton.m_register_values.end()) 2959 next_flags = flags_it->second.GetAsUInt64(); 2960 else 2961 next_flags = ReadFlags (register_context_sp.get()); 2962 } 2963 else if (pc_it == baton.m_register_values.end()) 2964 { 2965 // Emulate instruction failed and it haven't changed PC. Advance PC 2966 // with the size of the current opcode because the emulation of all 2967 // PC modifying instruction should be successful. The failure most 2968 // likely caused by a not supported instruction which don't modify PC. 2969 next_pc = register_context_sp->GetPC() + emulator_ap->GetOpcode().GetByteSize(); 2970 next_flags = ReadFlags (register_context_sp.get()); 2971 } 2972 else 2973 { 2974 // The instruction emulation failed after it modified the PC. It is an 2975 // unknown error where we can't continue because the next instruction is 2976 // modifying the PC but we don't know how. 2977 return Error ("Instruction emulation failed unexpectedly."); 2978 } 2979 2980 if (m_arch.GetMachine() == llvm::Triple::arm) 2981 { 2982 if (next_flags & 0x20) 2983 { 2984 // Thumb mode 2985 error = SetSoftwareBreakpoint(next_pc, 2); 2986 } 2987 else 2988 { 2989 // Arm mode 2990 error = SetSoftwareBreakpoint(next_pc, 4); 2991 } 2992 } 2993 else if (m_arch.GetMachine() == llvm::Triple::mips64 2994 || m_arch.GetMachine() == llvm::Triple::mips64el) 2995 error = SetSoftwareBreakpoint(next_pc, 4); 2996 else 2997 { 2998 // No size hint is given for the next breakpoint 2999 error = SetSoftwareBreakpoint(next_pc, 0); 3000 } 3001 3002 if (error.Fail()) 3003 return error; 3004 3005 m_threads_stepping_with_breakpoint.insert({thread_sp->GetID(), next_pc}); 3006 3007 return Error(); 3008 } 3009 3010 bool 3011 NativeProcessLinux::SupportHardwareSingleStepping() const 3012 { 3013 if (m_arch.GetMachine() == llvm::Triple::arm 3014 || m_arch.GetMachine() == llvm::Triple::mips64 || m_arch.GetMachine() == llvm::Triple::mips64el) 3015 return false; 3016 return true; 3017 } 3018 3019 Error 3020 NativeProcessLinux::Resume (const ResumeActionList &resume_actions) 3021 { 3022 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS | LIBLLDB_LOG_THREAD)); 3023 if (log) 3024 log->Printf ("NativeProcessLinux::%s called: pid %" PRIu64, __FUNCTION__, GetID ()); 3025 3026 bool stepping = false; 3027 bool software_single_step = !SupportHardwareSingleStepping(); 3028 3029 Monitor::ScopedOperationLock monitor_lock(*m_monitor_up); 3030 Mutex::Locker locker (m_threads_mutex); 3031 3032 if (software_single_step) 3033 { 3034 for (auto thread_sp : m_threads) 3035 { 3036 assert (thread_sp && "thread list should not contain NULL threads"); 3037 3038 const ResumeAction *const action = resume_actions.GetActionForThread (thread_sp->GetID (), true); 3039 if (action == nullptr) 3040 continue; 3041 3042 if (action->state == eStateStepping) 3043 { 3044 Error error = SetupSoftwareSingleStepping(thread_sp); 3045 if (error.Fail()) 3046 return error; 3047 } 3048 } 3049 } 3050 3051 for (auto thread_sp : m_threads) 3052 { 3053 assert (thread_sp && "thread list should not contain NULL threads"); 3054 3055 const ResumeAction *const action = resume_actions.GetActionForThread (thread_sp->GetID (), true); 3056 3057 if (action == nullptr) 3058 { 3059 if (log) 3060 log->Printf ("NativeProcessLinux::%s no action specified for pid %" PRIu64 " tid %" PRIu64, 3061 __FUNCTION__, GetID (), thread_sp->GetID ()); 3062 continue; 3063 } 3064 3065 if (log) 3066 { 3067 log->Printf ("NativeProcessLinux::%s processing resume action state %s for pid %" PRIu64 " tid %" PRIu64, 3068 __FUNCTION__, StateAsCString (action->state), GetID (), thread_sp->GetID ()); 3069 } 3070 3071 switch (action->state) 3072 { 3073 case eStateRunning: 3074 { 3075 // Run the thread, possibly feeding it the signal. 3076 const int signo = action->signal; 3077 ResumeThread(thread_sp->GetID (), 3078 [=](lldb::tid_t tid_to_resume, bool supress_signal) 3079 { 3080 std::static_pointer_cast<NativeThreadLinux> (thread_sp)->SetRunning (); 3081 // Pass this signal number on to the inferior to handle. 3082 const auto resume_result = Resume (tid_to_resume, (signo > 0 && !supress_signal) ? signo : LLDB_INVALID_SIGNAL_NUMBER); 3083 if (resume_result.Success()) 3084 SetState(eStateRunning, true); 3085 return resume_result; 3086 }, 3087 false); 3088 break; 3089 } 3090 3091 case eStateStepping: 3092 { 3093 // Request the step. 3094 const int signo = action->signal; 3095 ResumeThread(thread_sp->GetID (), 3096 [=](lldb::tid_t tid_to_step, bool supress_signal) 3097 { 3098 std::static_pointer_cast<NativeThreadLinux> (thread_sp)->SetStepping (); 3099 3100 Error step_result; 3101 if (software_single_step) 3102 step_result = Resume (tid_to_step, (signo > 0 && !supress_signal) ? signo : LLDB_INVALID_SIGNAL_NUMBER); 3103 else 3104 step_result = SingleStep (tid_to_step,(signo > 0 && !supress_signal) ? signo : LLDB_INVALID_SIGNAL_NUMBER); 3105 3106 assert (step_result.Success() && "SingleStep() failed"); 3107 if (step_result.Success()) 3108 SetState(eStateStepping, true); 3109 return step_result; 3110 }, 3111 false); 3112 stepping = true; 3113 break; 3114 } 3115 3116 case eStateSuspended: 3117 case eStateStopped: 3118 lldbassert(0 && "Unexpected state"); 3119 3120 default: 3121 return Error ("NativeProcessLinux::%s (): unexpected state %s specified for pid %" PRIu64 ", tid %" PRIu64, 3122 __FUNCTION__, StateAsCString (action->state), GetID (), thread_sp->GetID ()); 3123 } 3124 } 3125 3126 return Error(); 3127 } 3128 3129 Error 3130 NativeProcessLinux::Halt () 3131 { 3132 Error error; 3133 3134 if (kill (GetID (), SIGSTOP) != 0) 3135 error.SetErrorToErrno (); 3136 3137 return error; 3138 } 3139 3140 Error 3141 NativeProcessLinux::Detach () 3142 { 3143 Error error; 3144 3145 // Tell ptrace to detach from the process. 3146 if (GetID () != LLDB_INVALID_PROCESS_ID) 3147 error = Detach (GetID ()); 3148 3149 // Stop monitoring the inferior. 3150 m_monitor_up->Terminate(); 3151 3152 // No error. 3153 return error; 3154 } 3155 3156 Error 3157 NativeProcessLinux::Signal (int signo) 3158 { 3159 Error error; 3160 3161 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 3162 if (log) 3163 log->Printf ("NativeProcessLinux::%s: sending signal %d (%s) to pid %" PRIu64, 3164 __FUNCTION__, signo, GetUnixSignals ().GetSignalAsCString (signo), GetID ()); 3165 3166 if (kill(GetID(), signo)) 3167 error.SetErrorToErrno(); 3168 3169 return error; 3170 } 3171 3172 Error 3173 NativeProcessLinux::Interrupt () 3174 { 3175 // Pick a running thread (or if none, a not-dead stopped thread) as 3176 // the chosen thread that will be the stop-reason thread. 3177 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 3178 3179 NativeThreadProtocolSP running_thread_sp; 3180 NativeThreadProtocolSP stopped_thread_sp; 3181 3182 if (log) 3183 log->Printf ("NativeProcessLinux::%s selecting running thread for interrupt target", __FUNCTION__); 3184 3185 Monitor::ScopedOperationLock monitor_lock(*m_monitor_up); 3186 Mutex::Locker locker (m_threads_mutex); 3187 3188 for (auto thread_sp : m_threads) 3189 { 3190 // The thread shouldn't be null but lets just cover that here. 3191 if (!thread_sp) 3192 continue; 3193 3194 // If we have a running or stepping thread, we'll call that the 3195 // target of the interrupt. 3196 const auto thread_state = thread_sp->GetState (); 3197 if (thread_state == eStateRunning || 3198 thread_state == eStateStepping) 3199 { 3200 running_thread_sp = thread_sp; 3201 break; 3202 } 3203 else if (!stopped_thread_sp && StateIsStoppedState (thread_state, true)) 3204 { 3205 // Remember the first non-dead stopped thread. We'll use that as a backup if there are no running threads. 3206 stopped_thread_sp = thread_sp; 3207 } 3208 } 3209 3210 if (!running_thread_sp && !stopped_thread_sp) 3211 { 3212 Error error("found no running/stepping or live stopped threads as target for interrupt"); 3213 if (log) 3214 log->Printf ("NativeProcessLinux::%s skipping due to error: %s", __FUNCTION__, error.AsCString ()); 3215 3216 return error; 3217 } 3218 3219 NativeThreadProtocolSP deferred_signal_thread_sp = running_thread_sp ? running_thread_sp : stopped_thread_sp; 3220 3221 if (log) 3222 log->Printf ("NativeProcessLinux::%s pid %" PRIu64 " %s tid %" PRIu64 " chosen for interrupt target", 3223 __FUNCTION__, 3224 GetID (), 3225 running_thread_sp ? "running" : "stopped", 3226 deferred_signal_thread_sp->GetID ()); 3227 3228 StopRunningThreads(deferred_signal_thread_sp->GetID()); 3229 3230 return Error(); 3231 } 3232 3233 Error 3234 NativeProcessLinux::Kill () 3235 { 3236 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 3237 if (log) 3238 log->Printf ("NativeProcessLinux::%s called for PID %" PRIu64, __FUNCTION__, GetID ()); 3239 3240 Error error; 3241 3242 switch (m_state) 3243 { 3244 case StateType::eStateInvalid: 3245 case StateType::eStateExited: 3246 case StateType::eStateCrashed: 3247 case StateType::eStateDetached: 3248 case StateType::eStateUnloaded: 3249 // Nothing to do - the process is already dead. 3250 if (log) 3251 log->Printf ("NativeProcessLinux::%s ignored for PID %" PRIu64 " due to current state: %s", __FUNCTION__, GetID (), StateAsCString (m_state)); 3252 return error; 3253 3254 case StateType::eStateConnected: 3255 case StateType::eStateAttaching: 3256 case StateType::eStateLaunching: 3257 case StateType::eStateStopped: 3258 case StateType::eStateRunning: 3259 case StateType::eStateStepping: 3260 case StateType::eStateSuspended: 3261 // We can try to kill a process in these states. 3262 break; 3263 } 3264 3265 if (kill (GetID (), SIGKILL) != 0) 3266 { 3267 error.SetErrorToErrno (); 3268 return error; 3269 } 3270 3271 return error; 3272 } 3273 3274 static Error 3275 ParseMemoryRegionInfoFromProcMapsLine (const std::string &maps_line, MemoryRegionInfo &memory_region_info) 3276 { 3277 memory_region_info.Clear(); 3278 3279 StringExtractor line_extractor (maps_line.c_str ()); 3280 3281 // Format: {address_start_hex}-{address_end_hex} perms offset dev inode pathname 3282 // perms: rwxp (letter is present if set, '-' if not, final character is p=private, s=shared). 3283 3284 // Parse out the starting address 3285 lldb::addr_t start_address = line_extractor.GetHexMaxU64 (false, 0); 3286 3287 // Parse out hyphen separating start and end address from range. 3288 if (!line_extractor.GetBytesLeft () || (line_extractor.GetChar () != '-')) 3289 return Error ("malformed /proc/{pid}/maps entry, missing dash between address range"); 3290 3291 // Parse out the ending address 3292 lldb::addr_t end_address = line_extractor.GetHexMaxU64 (false, start_address); 3293 3294 // Parse out the space after the address. 3295 if (!line_extractor.GetBytesLeft () || (line_extractor.GetChar () != ' ')) 3296 return Error ("malformed /proc/{pid}/maps entry, missing space after range"); 3297 3298 // Save the range. 3299 memory_region_info.GetRange ().SetRangeBase (start_address); 3300 memory_region_info.GetRange ().SetRangeEnd (end_address); 3301 3302 // Parse out each permission entry. 3303 if (line_extractor.GetBytesLeft () < 4) 3304 return Error ("malformed /proc/{pid}/maps entry, missing some portion of permissions"); 3305 3306 // Handle read permission. 3307 const char read_perm_char = line_extractor.GetChar (); 3308 if (read_perm_char == 'r') 3309 memory_region_info.SetReadable (MemoryRegionInfo::OptionalBool::eYes); 3310 else 3311 { 3312 assert ( (read_perm_char == '-') && "unexpected /proc/{pid}/maps read permission char" ); 3313 memory_region_info.SetReadable (MemoryRegionInfo::OptionalBool::eNo); 3314 } 3315 3316 // Handle write permission. 3317 const char write_perm_char = line_extractor.GetChar (); 3318 if (write_perm_char == 'w') 3319 memory_region_info.SetWritable (MemoryRegionInfo::OptionalBool::eYes); 3320 else 3321 { 3322 assert ( (write_perm_char == '-') && "unexpected /proc/{pid}/maps write permission char" ); 3323 memory_region_info.SetWritable (MemoryRegionInfo::OptionalBool::eNo); 3324 } 3325 3326 // Handle execute permission. 3327 const char exec_perm_char = line_extractor.GetChar (); 3328 if (exec_perm_char == 'x') 3329 memory_region_info.SetExecutable (MemoryRegionInfo::OptionalBool::eYes); 3330 else 3331 { 3332 assert ( (exec_perm_char == '-') && "unexpected /proc/{pid}/maps exec permission char" ); 3333 memory_region_info.SetExecutable (MemoryRegionInfo::OptionalBool::eNo); 3334 } 3335 3336 return Error (); 3337 } 3338 3339 Error 3340 NativeProcessLinux::GetMemoryRegionInfo (lldb::addr_t load_addr, MemoryRegionInfo &range_info) 3341 { 3342 // FIXME review that the final memory region returned extends to the end of the virtual address space, 3343 // with no perms if it is not mapped. 3344 3345 // Use an approach that reads memory regions from /proc/{pid}/maps. 3346 // Assume proc maps entries are in ascending order. 3347 // FIXME assert if we find differently. 3348 Mutex::Locker locker (m_mem_region_cache_mutex); 3349 3350 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 3351 Error error; 3352 3353 if (m_supports_mem_region == LazyBool::eLazyBoolNo) 3354 { 3355 // We're done. 3356 error.SetErrorString ("unsupported"); 3357 return error; 3358 } 3359 3360 // If our cache is empty, pull the latest. There should always be at least one memory region 3361 // if memory region handling is supported. 3362 if (m_mem_region_cache.empty ()) 3363 { 3364 error = ProcFileReader::ProcessLineByLine (GetID (), "maps", 3365 [&] (const std::string &line) -> bool 3366 { 3367 MemoryRegionInfo info; 3368 const Error parse_error = ParseMemoryRegionInfoFromProcMapsLine (line, info); 3369 if (parse_error.Success ()) 3370 { 3371 m_mem_region_cache.push_back (info); 3372 return true; 3373 } 3374 else 3375 { 3376 if (log) 3377 log->Printf ("NativeProcessLinux::%s failed to parse proc maps line '%s': %s", __FUNCTION__, line.c_str (), error.AsCString ()); 3378 return false; 3379 } 3380 }); 3381 3382 // If we had an error, we'll mark unsupported. 3383 if (error.Fail ()) 3384 { 3385 m_supports_mem_region = LazyBool::eLazyBoolNo; 3386 return error; 3387 } 3388 else if (m_mem_region_cache.empty ()) 3389 { 3390 // No entries after attempting to read them. This shouldn't happen if /proc/{pid}/maps 3391 // is supported. Assume we don't support map entries via procfs. 3392 if (log) 3393 log->Printf ("NativeProcessLinux::%s failed to find any procfs maps entries, assuming no support for memory region metadata retrieval", __FUNCTION__); 3394 m_supports_mem_region = LazyBool::eLazyBoolNo; 3395 error.SetErrorString ("not supported"); 3396 return error; 3397 } 3398 3399 if (log) 3400 log->Printf ("NativeProcessLinux::%s read %" PRIu64 " memory region entries from /proc/%" PRIu64 "/maps", __FUNCTION__, static_cast<uint64_t> (m_mem_region_cache.size ()), GetID ()); 3401 3402 // We support memory retrieval, remember that. 3403 m_supports_mem_region = LazyBool::eLazyBoolYes; 3404 } 3405 else 3406 { 3407 if (log) 3408 log->Printf ("NativeProcessLinux::%s reusing %" PRIu64 " cached memory region entries", __FUNCTION__, static_cast<uint64_t> (m_mem_region_cache.size ())); 3409 } 3410 3411 lldb::addr_t prev_base_address = 0; 3412 3413 // FIXME start by finding the last region that is <= target address using binary search. Data is sorted. 3414 // There can be a ton of regions on pthreads apps with lots of threads. 3415 for (auto it = m_mem_region_cache.begin(); it != m_mem_region_cache.end (); ++it) 3416 { 3417 MemoryRegionInfo &proc_entry_info = *it; 3418 3419 // Sanity check assumption that /proc/{pid}/maps entries are ascending. 3420 assert ((proc_entry_info.GetRange ().GetRangeBase () >= prev_base_address) && "descending /proc/pid/maps entries detected, unexpected"); 3421 prev_base_address = proc_entry_info.GetRange ().GetRangeBase (); 3422 3423 // If the target address comes before this entry, indicate distance to next region. 3424 if (load_addr < proc_entry_info.GetRange ().GetRangeBase ()) 3425 { 3426 range_info.GetRange ().SetRangeBase (load_addr); 3427 range_info.GetRange ().SetByteSize (proc_entry_info.GetRange ().GetRangeBase () - load_addr); 3428 range_info.SetReadable (MemoryRegionInfo::OptionalBool::eNo); 3429 range_info.SetWritable (MemoryRegionInfo::OptionalBool::eNo); 3430 range_info.SetExecutable (MemoryRegionInfo::OptionalBool::eNo); 3431 3432 return error; 3433 } 3434 else if (proc_entry_info.GetRange ().Contains (load_addr)) 3435 { 3436 // The target address is within the memory region we're processing here. 3437 range_info = proc_entry_info; 3438 return error; 3439 } 3440 3441 // The target memory address comes somewhere after the region we just parsed. 3442 } 3443 3444 // If we made it here, we didn't find an entry that contained the given address. 3445 error.SetErrorString ("address comes after final region"); 3446 3447 if (log) 3448 log->Printf ("NativeProcessLinux::%s failed to find map entry for address 0x%" PRIx64 ": %s", __FUNCTION__, load_addr, error.AsCString ()); 3449 3450 return error; 3451 } 3452 3453 void 3454 NativeProcessLinux::DoStopIDBumped (uint32_t newBumpId) 3455 { 3456 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 3457 if (log) 3458 log->Printf ("NativeProcessLinux::%s(newBumpId=%" PRIu32 ") called", __FUNCTION__, newBumpId); 3459 3460 { 3461 Mutex::Locker locker (m_mem_region_cache_mutex); 3462 if (log) 3463 log->Printf ("NativeProcessLinux::%s clearing %" PRIu64 " entries from the cache", __FUNCTION__, static_cast<uint64_t> (m_mem_region_cache.size ())); 3464 m_mem_region_cache.clear (); 3465 } 3466 } 3467 3468 Error 3469 NativeProcessLinux::AllocateMemory(size_t size, uint32_t permissions, lldb::addr_t &addr) 3470 { 3471 // FIXME implementing this requires the equivalent of 3472 // InferiorCallPOSIX::InferiorCallMmap, which depends on 3473 // functional ThreadPlans working with Native*Protocol. 3474 #if 1 3475 return Error ("not implemented yet"); 3476 #else 3477 addr = LLDB_INVALID_ADDRESS; 3478 3479 unsigned prot = 0; 3480 if (permissions & lldb::ePermissionsReadable) 3481 prot |= eMmapProtRead; 3482 if (permissions & lldb::ePermissionsWritable) 3483 prot |= eMmapProtWrite; 3484 if (permissions & lldb::ePermissionsExecutable) 3485 prot |= eMmapProtExec; 3486 3487 // TODO implement this directly in NativeProcessLinux 3488 // (and lift to NativeProcessPOSIX if/when that class is 3489 // refactored out). 3490 if (InferiorCallMmap(this, addr, 0, size, prot, 3491 eMmapFlagsAnon | eMmapFlagsPrivate, -1, 0)) { 3492 m_addr_to_mmap_size[addr] = size; 3493 return Error (); 3494 } else { 3495 addr = LLDB_INVALID_ADDRESS; 3496 return Error("unable to allocate %" PRIu64 " bytes of memory with permissions %s", size, GetPermissionsAsCString (permissions)); 3497 } 3498 #endif 3499 } 3500 3501 Error 3502 NativeProcessLinux::DeallocateMemory (lldb::addr_t addr) 3503 { 3504 // FIXME see comments in AllocateMemory - required lower-level 3505 // bits not in place yet (ThreadPlans) 3506 return Error ("not implemented"); 3507 } 3508 3509 lldb::addr_t 3510 NativeProcessLinux::GetSharedLibraryInfoAddress () 3511 { 3512 #if 1 3513 // punt on this for now 3514 return LLDB_INVALID_ADDRESS; 3515 #else 3516 // Return the image info address for the exe module 3517 #if 1 3518 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 3519 3520 ModuleSP module_sp; 3521 Error error = GetExeModuleSP (module_sp); 3522 if (error.Fail ()) 3523 { 3524 if (log) 3525 log->Warning ("NativeProcessLinux::%s failed to retrieve exe module: %s", __FUNCTION__, error.AsCString ()); 3526 return LLDB_INVALID_ADDRESS; 3527 } 3528 3529 if (module_sp == nullptr) 3530 { 3531 if (log) 3532 log->Warning ("NativeProcessLinux::%s exe module returned was NULL", __FUNCTION__); 3533 return LLDB_INVALID_ADDRESS; 3534 } 3535 3536 ObjectFileSP object_file_sp = module_sp->GetObjectFile (); 3537 if (object_file_sp == nullptr) 3538 { 3539 if (log) 3540 log->Warning ("NativeProcessLinux::%s exe module returned a NULL object file", __FUNCTION__); 3541 return LLDB_INVALID_ADDRESS; 3542 } 3543 3544 return obj_file_sp->GetImageInfoAddress(); 3545 #else 3546 Target *target = &GetTarget(); 3547 ObjectFile *obj_file = target->GetExecutableModule()->GetObjectFile(); 3548 Address addr = obj_file->GetImageInfoAddress(target); 3549 3550 if (addr.IsValid()) 3551 return addr.GetLoadAddress(target); 3552 return LLDB_INVALID_ADDRESS; 3553 #endif 3554 #endif // punt on this for now 3555 } 3556 3557 size_t 3558 NativeProcessLinux::UpdateThreads () 3559 { 3560 // The NativeProcessLinux monitoring threads are always up to date 3561 // with respect to thread state and they keep the thread list 3562 // populated properly. All this method needs to do is return the 3563 // thread count. 3564 Mutex::Locker locker (m_threads_mutex); 3565 return m_threads.size (); 3566 } 3567 3568 bool 3569 NativeProcessLinux::GetArchitecture (ArchSpec &arch) const 3570 { 3571 arch = m_arch; 3572 return true; 3573 } 3574 3575 Error 3576 NativeProcessLinux::GetSoftwareBreakpointPCOffset (NativeRegisterContextSP context_sp, uint32_t &actual_opcode_size) 3577 { 3578 // FIXME put this behind a breakpoint protocol class that can be 3579 // set per architecture. Need ARM, MIPS support here. 3580 static const uint8_t g_aarch64_opcode[] = { 0x00, 0x00, 0x20, 0xd4 }; 3581 static const uint8_t g_i386_opcode [] = { 0xCC }; 3582 static const uint8_t g_mips64_opcode[] = { 0x00, 0x00, 0x00, 0x0d }; 3583 3584 switch (m_arch.GetMachine ()) 3585 { 3586 case llvm::Triple::aarch64: 3587 actual_opcode_size = static_cast<uint32_t> (sizeof(g_aarch64_opcode)); 3588 return Error (); 3589 3590 case llvm::Triple::arm: 3591 actual_opcode_size = 0; // On arm the PC don't get updated for breakpoint hits 3592 return Error (); 3593 3594 case llvm::Triple::x86: 3595 case llvm::Triple::x86_64: 3596 actual_opcode_size = static_cast<uint32_t> (sizeof(g_i386_opcode)); 3597 return Error (); 3598 3599 case llvm::Triple::mips64: 3600 case llvm::Triple::mips64el: 3601 actual_opcode_size = static_cast<uint32_t> (sizeof(g_mips64_opcode)); 3602 return Error (); 3603 3604 default: 3605 assert(false && "CPU type not supported!"); 3606 return Error ("CPU type not supported"); 3607 } 3608 } 3609 3610 Error 3611 NativeProcessLinux::SetBreakpoint (lldb::addr_t addr, uint32_t size, bool hardware) 3612 { 3613 if (hardware) 3614 return Error ("NativeProcessLinux does not support hardware breakpoints"); 3615 else 3616 return SetSoftwareBreakpoint (addr, size); 3617 } 3618 3619 Error 3620 NativeProcessLinux::GetSoftwareBreakpointTrapOpcode (size_t trap_opcode_size_hint, 3621 size_t &actual_opcode_size, 3622 const uint8_t *&trap_opcode_bytes) 3623 { 3624 // FIXME put this behind a breakpoint protocol class that can be set per 3625 // architecture. Need MIPS support here. 3626 static const uint8_t g_aarch64_opcode[] = { 0x00, 0x00, 0x20, 0xd4 }; 3627 // The ARM reference recommends the use of 0xe7fddefe and 0xdefe but the 3628 // linux kernel does otherwise. 3629 static const uint8_t g_arm_breakpoint_opcode[] = { 0xf0, 0x01, 0xf0, 0xe7 }; 3630 static const uint8_t g_i386_opcode [] = { 0xCC }; 3631 static const uint8_t g_mips64_opcode[] = { 0x00, 0x00, 0x00, 0x0d }; 3632 static const uint8_t g_mips64el_opcode[] = { 0x0d, 0x00, 0x00, 0x00 }; 3633 static const uint8_t g_thumb_breakpoint_opcode[] = { 0x01, 0xde }; 3634 3635 switch (m_arch.GetMachine ()) 3636 { 3637 case llvm::Triple::aarch64: 3638 trap_opcode_bytes = g_aarch64_opcode; 3639 actual_opcode_size = sizeof(g_aarch64_opcode); 3640 return Error (); 3641 3642 case llvm::Triple::arm: 3643 switch (trap_opcode_size_hint) 3644 { 3645 case 2: 3646 trap_opcode_bytes = g_thumb_breakpoint_opcode; 3647 actual_opcode_size = sizeof(g_thumb_breakpoint_opcode); 3648 return Error (); 3649 case 4: 3650 trap_opcode_bytes = g_arm_breakpoint_opcode; 3651 actual_opcode_size = sizeof(g_arm_breakpoint_opcode); 3652 return Error (); 3653 default: 3654 assert(false && "Unrecognised trap opcode size hint!"); 3655 return Error ("Unrecognised trap opcode size hint!"); 3656 } 3657 3658 case llvm::Triple::x86: 3659 case llvm::Triple::x86_64: 3660 trap_opcode_bytes = g_i386_opcode; 3661 actual_opcode_size = sizeof(g_i386_opcode); 3662 return Error (); 3663 3664 case llvm::Triple::mips64: 3665 trap_opcode_bytes = g_mips64_opcode; 3666 actual_opcode_size = sizeof(g_mips64_opcode); 3667 return Error (); 3668 3669 case llvm::Triple::mips64el: 3670 trap_opcode_bytes = g_mips64el_opcode; 3671 actual_opcode_size = sizeof(g_mips64el_opcode); 3672 return Error (); 3673 3674 default: 3675 assert(false && "CPU type not supported!"); 3676 return Error ("CPU type not supported"); 3677 } 3678 } 3679 3680 #if 0 3681 ProcessMessage::CrashReason 3682 NativeProcessLinux::GetCrashReasonForSIGSEGV(const siginfo_t *info) 3683 { 3684 ProcessMessage::CrashReason reason; 3685 assert(info->si_signo == SIGSEGV); 3686 3687 reason = ProcessMessage::eInvalidCrashReason; 3688 3689 switch (info->si_code) 3690 { 3691 default: 3692 assert(false && "unexpected si_code for SIGSEGV"); 3693 break; 3694 case SI_KERNEL: 3695 // Linux will occasionally send spurious SI_KERNEL codes. 3696 // (this is poorly documented in sigaction) 3697 // One way to get this is via unaligned SIMD loads. 3698 reason = ProcessMessage::eInvalidAddress; // for lack of anything better 3699 break; 3700 case SEGV_MAPERR: 3701 reason = ProcessMessage::eInvalidAddress; 3702 break; 3703 case SEGV_ACCERR: 3704 reason = ProcessMessage::ePrivilegedAddress; 3705 break; 3706 } 3707 3708 return reason; 3709 } 3710 #endif 3711 3712 3713 #if 0 3714 ProcessMessage::CrashReason 3715 NativeProcessLinux::GetCrashReasonForSIGILL(const siginfo_t *info) 3716 { 3717 ProcessMessage::CrashReason reason; 3718 assert(info->si_signo == SIGILL); 3719 3720 reason = ProcessMessage::eInvalidCrashReason; 3721 3722 switch (info->si_code) 3723 { 3724 default: 3725 assert(false && "unexpected si_code for SIGILL"); 3726 break; 3727 case ILL_ILLOPC: 3728 reason = ProcessMessage::eIllegalOpcode; 3729 break; 3730 case ILL_ILLOPN: 3731 reason = ProcessMessage::eIllegalOperand; 3732 break; 3733 case ILL_ILLADR: 3734 reason = ProcessMessage::eIllegalAddressingMode; 3735 break; 3736 case ILL_ILLTRP: 3737 reason = ProcessMessage::eIllegalTrap; 3738 break; 3739 case ILL_PRVOPC: 3740 reason = ProcessMessage::ePrivilegedOpcode; 3741 break; 3742 case ILL_PRVREG: 3743 reason = ProcessMessage::ePrivilegedRegister; 3744 break; 3745 case ILL_COPROC: 3746 reason = ProcessMessage::eCoprocessorError; 3747 break; 3748 case ILL_BADSTK: 3749 reason = ProcessMessage::eInternalStackError; 3750 break; 3751 } 3752 3753 return reason; 3754 } 3755 #endif 3756 3757 #if 0 3758 ProcessMessage::CrashReason 3759 NativeProcessLinux::GetCrashReasonForSIGFPE(const siginfo_t *info) 3760 { 3761 ProcessMessage::CrashReason reason; 3762 assert(info->si_signo == SIGFPE); 3763 3764 reason = ProcessMessage::eInvalidCrashReason; 3765 3766 switch (info->si_code) 3767 { 3768 default: 3769 assert(false && "unexpected si_code for SIGFPE"); 3770 break; 3771 case FPE_INTDIV: 3772 reason = ProcessMessage::eIntegerDivideByZero; 3773 break; 3774 case FPE_INTOVF: 3775 reason = ProcessMessage::eIntegerOverflow; 3776 break; 3777 case FPE_FLTDIV: 3778 reason = ProcessMessage::eFloatDivideByZero; 3779 break; 3780 case FPE_FLTOVF: 3781 reason = ProcessMessage::eFloatOverflow; 3782 break; 3783 case FPE_FLTUND: 3784 reason = ProcessMessage::eFloatUnderflow; 3785 break; 3786 case FPE_FLTRES: 3787 reason = ProcessMessage::eFloatInexactResult; 3788 break; 3789 case FPE_FLTINV: 3790 reason = ProcessMessage::eFloatInvalidOperation; 3791 break; 3792 case FPE_FLTSUB: 3793 reason = ProcessMessage::eFloatSubscriptRange; 3794 break; 3795 } 3796 3797 return reason; 3798 } 3799 #endif 3800 3801 #if 0 3802 ProcessMessage::CrashReason 3803 NativeProcessLinux::GetCrashReasonForSIGBUS(const siginfo_t *info) 3804 { 3805 ProcessMessage::CrashReason reason; 3806 assert(info->si_signo == SIGBUS); 3807 3808 reason = ProcessMessage::eInvalidCrashReason; 3809 3810 switch (info->si_code) 3811 { 3812 default: 3813 assert(false && "unexpected si_code for SIGBUS"); 3814 break; 3815 case BUS_ADRALN: 3816 reason = ProcessMessage::eIllegalAlignment; 3817 break; 3818 case BUS_ADRERR: 3819 reason = ProcessMessage::eIllegalAddress; 3820 break; 3821 case BUS_OBJERR: 3822 reason = ProcessMessage::eHardwareError; 3823 break; 3824 } 3825 3826 return reason; 3827 } 3828 #endif 3829 3830 Error 3831 NativeProcessLinux::SetWatchpoint (lldb::addr_t addr, size_t size, uint32_t watch_flags, bool hardware) 3832 { 3833 // The base SetWatchpoint will end up executing monitor operations. Let's lock the monitor 3834 // for it. 3835 Monitor::ScopedOperationLock monitor_lock(*m_monitor_up); 3836 return NativeProcessProtocol::SetWatchpoint(addr, size, watch_flags, hardware); 3837 } 3838 3839 Error 3840 NativeProcessLinux::RemoveWatchpoint (lldb::addr_t addr) 3841 { 3842 // The base RemoveWatchpoint will end up executing monitor operations. Let's lock the monitor 3843 // for it. 3844 Monitor::ScopedOperationLock monitor_lock(*m_monitor_up); 3845 return NativeProcessProtocol::RemoveWatchpoint(addr); 3846 } 3847 3848 Error 3849 NativeProcessLinux::ReadMemory (lldb::addr_t addr, void *buf, size_t size, size_t &bytes_read) 3850 { 3851 ReadOperation op(addr, buf, size, bytes_read); 3852 m_monitor_up->DoOperation(&op); 3853 return op.GetError (); 3854 } 3855 3856 Error 3857 NativeProcessLinux::ReadMemoryWithoutTrap(lldb::addr_t addr, void *buf, size_t size, size_t &bytes_read) 3858 { 3859 Error error = ReadMemory(addr, buf, size, bytes_read); 3860 if (error.Fail()) return error; 3861 return m_breakpoint_list.RemoveTrapsFromBuffer(addr, buf, size); 3862 } 3863 3864 Error 3865 NativeProcessLinux::WriteMemory(lldb::addr_t addr, const void *buf, size_t size, size_t &bytes_written) 3866 { 3867 WriteOperation op(addr, buf, size, bytes_written); 3868 m_monitor_up->DoOperation(&op); 3869 return op.GetError (); 3870 } 3871 3872 Error 3873 NativeProcessLinux::ReadRegisterValue(lldb::tid_t tid, uint32_t offset, const char* reg_name, 3874 uint32_t size, RegisterValue &value) 3875 { 3876 ReadRegOperation op(tid, offset, reg_name, value); 3877 m_monitor_up->DoOperation(&op); 3878 return op.GetError(); 3879 } 3880 3881 Error 3882 NativeProcessLinux::WriteRegisterValue(lldb::tid_t tid, unsigned offset, 3883 const char* reg_name, const RegisterValue &value) 3884 { 3885 WriteRegOperation op(tid, offset, reg_name, value); 3886 m_monitor_up->DoOperation(&op); 3887 return op.GetError(); 3888 } 3889 3890 Error 3891 NativeProcessLinux::ReadGPR(lldb::tid_t tid, void *buf, size_t buf_size) 3892 { 3893 ReadGPROperation op(tid, buf, buf_size); 3894 m_monitor_up->DoOperation(&op); 3895 return op.GetError(); 3896 } 3897 3898 Error 3899 NativeProcessLinux::ReadFPR(lldb::tid_t tid, void *buf, size_t buf_size) 3900 { 3901 ReadFPROperation op(tid, buf, buf_size); 3902 m_monitor_up->DoOperation(&op); 3903 return op.GetError(); 3904 } 3905 3906 Error 3907 NativeProcessLinux::ReadRegisterSet(lldb::tid_t tid, void *buf, size_t buf_size, unsigned int regset) 3908 { 3909 ReadRegisterSetOperation op(tid, buf, buf_size, regset); 3910 m_monitor_up->DoOperation(&op); 3911 return op.GetError(); 3912 } 3913 3914 Error 3915 NativeProcessLinux::ReadHardwareDebugInfo (lldb::tid_t tid, unsigned int &watch_count , unsigned int &break_count) 3916 { 3917 ReadDBGROperation op(tid, watch_count, break_count); 3918 m_monitor_up->DoOperation(&op); 3919 return op.GetError(); 3920 } 3921 3922 Error 3923 NativeProcessLinux::WriteHardwareDebugRegs (lldb::tid_t tid, lldb::addr_t *addr_buf, uint32_t *cntrl_buf, int type, int count) 3924 { 3925 WriteDBGROperation op(tid, addr_buf, cntrl_buf, type, count); 3926 m_monitor_up->DoOperation(&op); 3927 return op.GetError(); 3928 } 3929 3930 Error 3931 NativeProcessLinux::WriteGPR(lldb::tid_t tid, void *buf, size_t buf_size) 3932 { 3933 WriteGPROperation op(tid, buf, buf_size); 3934 m_monitor_up->DoOperation(&op); 3935 return op.GetError(); 3936 } 3937 3938 Error 3939 NativeProcessLinux::WriteFPR(lldb::tid_t tid, void *buf, size_t buf_size) 3940 { 3941 WriteFPROperation op(tid, buf, buf_size); 3942 m_monitor_up->DoOperation(&op); 3943 return op.GetError(); 3944 } 3945 3946 Error 3947 NativeProcessLinux::WriteRegisterSet(lldb::tid_t tid, void *buf, size_t buf_size, unsigned int regset) 3948 { 3949 WriteRegisterSetOperation op(tid, buf, buf_size, regset); 3950 m_monitor_up->DoOperation(&op); 3951 return op.GetError(); 3952 } 3953 3954 Error 3955 NativeProcessLinux::Resume (lldb::tid_t tid, uint32_t signo) 3956 { 3957 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 3958 3959 if (log) 3960 log->Printf ("NativeProcessLinux::%s() resuming thread = %" PRIu64 " with signal %s", __FUNCTION__, tid, 3961 GetUnixSignals().GetSignalAsCString (signo)); 3962 ResumeOperation op (tid, signo); 3963 m_monitor_up->DoOperation (&op); 3964 if (log) 3965 log->Printf ("NativeProcessLinux::%s() resuming thread = %" PRIu64 " result = %s", __FUNCTION__, tid, op.GetError().Success() ? "true" : "false"); 3966 return op.GetError(); 3967 } 3968 3969 Error 3970 NativeProcessLinux::SingleStep(lldb::tid_t tid, uint32_t signo) 3971 { 3972 SingleStepOperation op(tid, signo); 3973 m_monitor_up->DoOperation(&op); 3974 return op.GetError(); 3975 } 3976 3977 Error 3978 NativeProcessLinux::GetSignalInfo(lldb::tid_t tid, void *siginfo) 3979 { 3980 SiginfoOperation op(tid, siginfo); 3981 m_monitor_up->DoOperation(&op); 3982 return op.GetError(); 3983 } 3984 3985 Error 3986 NativeProcessLinux::GetEventMessage(lldb::tid_t tid, unsigned long *message) 3987 { 3988 EventMessageOperation op(tid, message); 3989 m_monitor_up->DoOperation(&op); 3990 return op.GetError(); 3991 } 3992 3993 Error 3994 NativeProcessLinux::Detach(lldb::tid_t tid) 3995 { 3996 if (tid == LLDB_INVALID_THREAD_ID) 3997 return Error(); 3998 3999 DetachOperation op(tid); 4000 m_monitor_up->DoOperation(&op); 4001 return op.GetError(); 4002 } 4003 4004 bool 4005 NativeProcessLinux::DupDescriptor(const char *path, int fd, int flags) 4006 { 4007 int target_fd = open(path, flags, 0666); 4008 4009 if (target_fd == -1) 4010 return false; 4011 4012 if (dup2(target_fd, fd) == -1) 4013 return false; 4014 4015 return (close(target_fd) == -1) ? false : true; 4016 } 4017 4018 void 4019 NativeProcessLinux::StartMonitorThread(const InitialOperation &initial_operation, Error &error) 4020 { 4021 m_monitor_up.reset(new Monitor(initial_operation, this)); 4022 error = m_monitor_up->Initialize(); 4023 if (error.Fail()) { 4024 m_monitor_up.reset(); 4025 } 4026 } 4027 4028 bool 4029 NativeProcessLinux::HasThreadNoLock (lldb::tid_t thread_id) 4030 { 4031 for (auto thread_sp : m_threads) 4032 { 4033 assert (thread_sp && "thread list should not contain NULL threads"); 4034 if (thread_sp->GetID () == thread_id) 4035 { 4036 // We have this thread. 4037 return true; 4038 } 4039 } 4040 4041 // We don't have this thread. 4042 return false; 4043 } 4044 4045 NativeThreadProtocolSP 4046 NativeProcessLinux::MaybeGetThreadNoLock (lldb::tid_t thread_id) 4047 { 4048 // CONSIDER organize threads by map - we can do better than linear. 4049 for (auto thread_sp : m_threads) 4050 { 4051 if (thread_sp->GetID () == thread_id) 4052 return thread_sp; 4053 } 4054 4055 // We don't have this thread. 4056 return NativeThreadProtocolSP (); 4057 } 4058 4059 bool 4060 NativeProcessLinux::StopTrackingThread (lldb::tid_t thread_id) 4061 { 4062 Log *const log = GetLogIfAllCategoriesSet (LIBLLDB_LOG_THREAD); 4063 4064 if (log) 4065 log->Printf("NativeProcessLinux::%s (tid: %" PRIu64 ")", __FUNCTION__, thread_id); 4066 4067 bool found = false; 4068 4069 Mutex::Locker locker (m_threads_mutex); 4070 for (auto it = m_threads.begin (); it != m_threads.end (); ++it) 4071 { 4072 if (*it && ((*it)->GetID () == thread_id)) 4073 { 4074 m_threads.erase (it); 4075 found = true; 4076 break; 4077 } 4078 } 4079 4080 // If we have a pending notification, remove this from the set. 4081 if (m_pending_notification_up) 4082 { 4083 m_pending_notification_up->wait_for_stop_tids.erase(thread_id); 4084 SignalIfRequirementsSatisfied(); 4085 } 4086 4087 return found; 4088 } 4089 4090 NativeThreadProtocolSP 4091 NativeProcessLinux::AddThread (lldb::tid_t thread_id) 4092 { 4093 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_THREAD)); 4094 4095 Mutex::Locker locker (m_threads_mutex); 4096 4097 if (log) 4098 { 4099 log->Printf ("NativeProcessLinux::%s pid %" PRIu64 " adding thread with tid %" PRIu64, 4100 __FUNCTION__, 4101 GetID (), 4102 thread_id); 4103 } 4104 4105 assert (!HasThreadNoLock (thread_id) && "attempted to add a thread by id that already exists"); 4106 4107 // If this is the first thread, save it as the current thread 4108 if (m_threads.empty ()) 4109 SetCurrentThreadID (thread_id); 4110 4111 NativeThreadProtocolSP thread_sp (new NativeThreadLinux (this, thread_id)); 4112 m_threads.push_back (thread_sp); 4113 4114 return thread_sp; 4115 } 4116 4117 Error 4118 NativeProcessLinux::FixupBreakpointPCAsNeeded (NativeThreadProtocolSP &thread_sp) 4119 { 4120 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS)); 4121 4122 Error error; 4123 4124 // Get a linux thread pointer. 4125 if (!thread_sp) 4126 { 4127 error.SetErrorString ("null thread_sp"); 4128 if (log) 4129 log->Printf ("NativeProcessLinux::%s failed: %s", __FUNCTION__, error.AsCString ()); 4130 return error; 4131 } 4132 std::shared_ptr<NativeThreadLinux> linux_thread_sp = std::static_pointer_cast<NativeThreadLinux> (thread_sp); 4133 4134 // Find out the size of a breakpoint (might depend on where we are in the code). 4135 NativeRegisterContextSP context_sp = linux_thread_sp->GetRegisterContext (); 4136 if (!context_sp) 4137 { 4138 error.SetErrorString ("cannot get a NativeRegisterContext for the thread"); 4139 if (log) 4140 log->Printf ("NativeProcessLinux::%s failed: %s", __FUNCTION__, error.AsCString ()); 4141 return error; 4142 } 4143 4144 uint32_t breakpoint_size = 0; 4145 error = GetSoftwareBreakpointPCOffset (context_sp, breakpoint_size); 4146 if (error.Fail ()) 4147 { 4148 if (log) 4149 log->Printf ("NativeProcessLinux::%s GetBreakpointSize() failed: %s", __FUNCTION__, error.AsCString ()); 4150 return error; 4151 } 4152 else 4153 { 4154 if (log) 4155 log->Printf ("NativeProcessLinux::%s breakpoint size: %" PRIu32, __FUNCTION__, breakpoint_size); 4156 } 4157 4158 // First try probing for a breakpoint at a software breakpoint location: PC - breakpoint size. 4159 const lldb::addr_t initial_pc_addr = context_sp->GetPC (); 4160 lldb::addr_t breakpoint_addr = initial_pc_addr; 4161 if (breakpoint_size > 0) 4162 { 4163 // Do not allow breakpoint probe to wrap around. 4164 if (breakpoint_addr >= breakpoint_size) 4165 breakpoint_addr -= breakpoint_size; 4166 } 4167 4168 // Check if we stopped because of a breakpoint. 4169 NativeBreakpointSP breakpoint_sp; 4170 error = m_breakpoint_list.GetBreakpoint (breakpoint_addr, breakpoint_sp); 4171 if (!error.Success () || !breakpoint_sp) 4172 { 4173 // We didn't find one at a software probe location. Nothing to do. 4174 if (log) 4175 log->Printf ("NativeProcessLinux::%s pid %" PRIu64 " no lldb breakpoint found at current pc with adjustment: 0x%" PRIx64, __FUNCTION__, GetID (), breakpoint_addr); 4176 return Error (); 4177 } 4178 4179 // If the breakpoint is not a software breakpoint, nothing to do. 4180 if (!breakpoint_sp->IsSoftwareBreakpoint ()) 4181 { 4182 if (log) 4183 log->Printf ("NativeProcessLinux::%s pid %" PRIu64 " breakpoint found at 0x%" PRIx64 ", not software, nothing to adjust", __FUNCTION__, GetID (), breakpoint_addr); 4184 return Error (); 4185 } 4186 4187 // 4188 // We have a software breakpoint and need to adjust the PC. 4189 // 4190 4191 // Sanity check. 4192 if (breakpoint_size == 0) 4193 { 4194 // Nothing to do! How did we get here? 4195 if (log) 4196 log->Printf ("NativeProcessLinux::%s pid %" PRIu64 " breakpoint found at 0x%" PRIx64 ", it is software, but the size is zero, nothing to do (unexpected)", __FUNCTION__, GetID (), breakpoint_addr); 4197 return Error (); 4198 } 4199 4200 // Change the program counter. 4201 if (log) 4202 log->Printf ("NativeProcessLinux::%s pid %" PRIu64 " tid %" PRIu64 ": changing PC from 0x%" PRIx64 " to 0x%" PRIx64, __FUNCTION__, GetID (), linux_thread_sp->GetID (), initial_pc_addr, breakpoint_addr); 4203 4204 error = context_sp->SetPC (breakpoint_addr); 4205 if (error.Fail ()) 4206 { 4207 if (log) 4208 log->Printf ("NativeProcessLinux::%s pid %" PRIu64 " tid %" PRIu64 ": failed to set PC: %s", __FUNCTION__, GetID (), linux_thread_sp->GetID (), error.AsCString ()); 4209 return error; 4210 } 4211 4212 return error; 4213 } 4214 4215 Error 4216 NativeProcessLinux::GetLoadedModuleFileSpec(const char* module_path, FileSpec& file_spec) 4217 { 4218 char maps_file_name[32]; 4219 snprintf(maps_file_name, sizeof(maps_file_name), "/proc/%" PRIu64 "/maps", GetID()); 4220 4221 FileSpec maps_file_spec(maps_file_name, false); 4222 if (!maps_file_spec.Exists()) { 4223 file_spec.Clear(); 4224 return Error("/proc/%" PRIu64 "/maps file doesn't exists!", GetID()); 4225 } 4226 4227 FileSpec module_file_spec(module_path, true); 4228 4229 std::ifstream maps_file(maps_file_name); 4230 std::string maps_data_str((std::istreambuf_iterator<char>(maps_file)), std::istreambuf_iterator<char>()); 4231 StringRef maps_data(maps_data_str.c_str()); 4232 4233 while (!maps_data.empty()) 4234 { 4235 StringRef maps_row; 4236 std::tie(maps_row, maps_data) = maps_data.split('\n'); 4237 4238 SmallVector<StringRef, 16> maps_columns; 4239 maps_row.split(maps_columns, StringRef(" "), -1, false); 4240 4241 if (maps_columns.size() >= 6) 4242 { 4243 file_spec.SetFile(maps_columns[5].str().c_str(), false); 4244 if (file_spec.GetFilename() == module_file_spec.GetFilename()) 4245 return Error(); 4246 } 4247 } 4248 4249 file_spec.Clear(); 4250 return Error("Module file (%s) not found in /proc/%" PRIu64 "/maps file!", 4251 module_file_spec.GetFilename().AsCString(), GetID()); 4252 } 4253 4254 Error 4255 NativeProcessLinux::ResumeThread( 4256 lldb::tid_t tid, 4257 NativeThreadLinux::ResumeThreadFunction request_thread_resume_function, 4258 bool error_when_already_running) 4259 { 4260 Log *const log = GetLogIfAllCategoriesSet (LIBLLDB_LOG_THREAD); 4261 4262 if (log) 4263 log->Printf("NativeProcessLinux::%s (tid: %" PRIu64 ", error_when_already_running: %s)", 4264 __FUNCTION__, tid, error_when_already_running?"true":"false"); 4265 4266 auto thread_sp = std::static_pointer_cast<NativeThreadLinux>(GetThreadByID(tid)); 4267 lldbassert(thread_sp != nullptr); 4268 4269 auto& context = thread_sp->GetThreadContext(); 4270 // Tell the thread to resume if we don't already think it is running. 4271 const bool is_stopped = StateIsStoppedState(thread_sp->GetState(), true); 4272 4273 lldbassert(!(error_when_already_running && !is_stopped)); 4274 4275 if (!is_stopped) 4276 { 4277 // It's not an error, just a log, if the error_when_already_running flag is not set. 4278 // This covers cases where, for instance, we're just trying to resume all threads 4279 // from the user side. 4280 if (log) 4281 log->Printf("NativeProcessLinux::%s tid %" PRIu64 " optional resume skipped since it is already running", 4282 __FUNCTION__, 4283 tid); 4284 return Error(); 4285 } 4286 4287 // Before we do the resume below, first check if we have a pending 4288 // stop notification that is currently waiting for 4289 // this thread to stop. This is potentially a buggy situation since 4290 // we're ostensibly waiting for threads to stop before we send out the 4291 // pending notification, and here we are resuming one before we send 4292 // out the pending stop notification. 4293 if (m_pending_notification_up && log && m_pending_notification_up->wait_for_stop_tids.count (tid) > 0) 4294 { 4295 log->Printf("NativeProcessLinux::%s about to resume tid %" PRIu64 " per explicit request but we have a pending stop notification (tid %" PRIu64 ") that is actively waiting for this thread to stop. Valid sequence of events?", __FUNCTION__, tid, m_pending_notification_up->triggering_tid); 4296 } 4297 4298 // Request a resume. We expect this to be synchronous and the system 4299 // to reflect it is running after this completes. 4300 const auto error = request_thread_resume_function (tid, false); 4301 if (error.Success()) 4302 context.request_resume_function = request_thread_resume_function; 4303 else if (log) 4304 { 4305 log->Printf("NativeProcessLinux::%s failed to resume thread tid %" PRIu64 ": %s", 4306 __FUNCTION__, tid, error.AsCString ()); 4307 } 4308 4309 return error; 4310 } 4311 4312 //===----------------------------------------------------------------------===// 4313 4314 void 4315 NativeProcessLinux::StopRunningThreads(const lldb::tid_t triggering_tid) 4316 { 4317 Log *const log = GetLogIfAllCategoriesSet (LIBLLDB_LOG_THREAD); 4318 4319 if (log) 4320 { 4321 log->Printf("NativeProcessLinux::%s about to process event: (triggering_tid: %" PRIu64 ")", 4322 __FUNCTION__, triggering_tid); 4323 } 4324 4325 DoStopThreads(PendingNotificationUP(new PendingNotification(triggering_tid))); 4326 4327 if (log) 4328 { 4329 log->Printf("NativeProcessLinux::%s event processing done", __FUNCTION__); 4330 } 4331 } 4332 4333 void 4334 NativeProcessLinux::SignalIfRequirementsSatisfied() 4335 { 4336 if (m_pending_notification_up && m_pending_notification_up->wait_for_stop_tids.empty ()) 4337 { 4338 SetCurrentThreadID(m_pending_notification_up->triggering_tid); 4339 SetState(StateType::eStateStopped, true); 4340 m_pending_notification_up.reset(); 4341 } 4342 } 4343 4344 void 4345 NativeProcessLinux::RequestStopOnAllRunningThreads() 4346 { 4347 // Request a stop for all the thread stops that need to be stopped 4348 // and are not already known to be stopped. Keep a list of all the 4349 // threads from which we still need to hear a stop reply. 4350 4351 ThreadIDSet sent_tids; 4352 for (const auto &thread_sp: m_threads) 4353 { 4354 // We only care about running threads 4355 if (StateIsStoppedState(thread_sp->GetState(), true)) 4356 continue; 4357 4358 static_pointer_cast<NativeThreadLinux>(thread_sp)->RequestStop(); 4359 sent_tids.insert (thread_sp->GetID()); 4360 } 4361 4362 // Set the wait list to the set of tids for which we requested stops. 4363 m_pending_notification_up->wait_for_stop_tids.swap (sent_tids); 4364 } 4365 4366 4367 Error 4368 NativeProcessLinux::ThreadDidStop (lldb::tid_t tid, bool initiated_by_llgs) 4369 { 4370 Log *const log = GetLogIfAllCategoriesSet (LIBLLDB_LOG_THREAD); 4371 4372 if (log) 4373 log->Printf("NativeProcessLinux::%s (tid: %" PRIu64 ", %sinitiated by llgs)", 4374 __FUNCTION__, tid, initiated_by_llgs?"":"not "); 4375 4376 // Ensure we know about the thread. 4377 auto thread_sp = std::static_pointer_cast<NativeThreadLinux>(GetThreadByID(tid)); 4378 lldbassert(thread_sp != nullptr); 4379 4380 // Update the global list of known thread states. This one is definitely stopped. 4381 auto& context = thread_sp->GetThreadContext(); 4382 const auto stop_was_requested = context.stop_requested; 4383 context.stop_requested = false; 4384 4385 // If we have a pending notification, remove this from the set. 4386 if (m_pending_notification_up) 4387 { 4388 m_pending_notification_up->wait_for_stop_tids.erase(tid); 4389 SignalIfRequirementsSatisfied(); 4390 } 4391 4392 Error error; 4393 if (initiated_by_llgs && context.request_resume_function && !stop_was_requested) 4394 { 4395 // We can end up here if stop was initiated by LLGS but by this time a 4396 // thread stop has occurred - maybe initiated by another event. 4397 if (log) 4398 log->Printf("Resuming thread %" PRIu64 " since stop wasn't requested", tid); 4399 error = context.request_resume_function (tid, true); 4400 if (error.Fail() && log) 4401 { 4402 log->Printf("NativeProcessLinux::%s failed to resume thread tid %" PRIu64 ": %s", 4403 __FUNCTION__, tid, error.AsCString ()); 4404 } 4405 } 4406 return error; 4407 } 4408 4409 void 4410 NativeProcessLinux::DoStopThreads(PendingNotificationUP &¬ification_up) 4411 { 4412 Log *const log = GetLogIfAllCategoriesSet (LIBLLDB_LOG_THREAD); 4413 if (m_pending_notification_up && log) 4414 { 4415 // Yikes - we've already got a pending signal notification in progress. 4416 // Log this info. We lose the pending notification here. 4417 log->Printf("NativeProcessLinux::%s dropping existing pending signal notification for tid %" PRIu64 ", to be replaced with signal for tid %" PRIu64, 4418 __FUNCTION__, 4419 m_pending_notification_up->triggering_tid, 4420 notification_up->triggering_tid); 4421 } 4422 m_pending_notification_up = std::move(notification_up); 4423 4424 RequestStopOnAllRunningThreads(); 4425 4426 SignalIfRequirementsSatisfied(); 4427 } 4428 4429 void 4430 NativeProcessLinux::ThreadWasCreated (lldb::tid_t tid) 4431 { 4432 Log *const log = GetLogIfAllCategoriesSet (LIBLLDB_LOG_THREAD); 4433 4434 if (log) 4435 log->Printf("NativeProcessLinux::%s (tid: %" PRIu64 ")", __FUNCTION__, tid); 4436 4437 auto thread_sp = std::static_pointer_cast<NativeThreadLinux>(GetThreadByID(tid)); 4438 lldbassert(thread_sp != nullptr); 4439 4440 if (m_pending_notification_up && StateIsRunningState(thread_sp->GetState())) 4441 { 4442 // We will need to wait for this new thread to stop as well before firing the 4443 // notification. 4444 m_pending_notification_up->wait_for_stop_tids.insert(tid); 4445 thread_sp->RequestStop(); 4446 } 4447 } 4448