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_base = &dreg_state; 932 ioVec.iov_len = sizeof (dreg_state); 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 if (m_threads_stepping_with_breakpoint.find(pid) != m_threads_stepping_with_breakpoint.end()) 2605 std::static_pointer_cast<NativeThreadLinux>(thread_sp)->SetStoppedByTrace(); 2606 } 2607 else 2608 if (log) 2609 log->Printf("NativeProcessLinux::%s() pid = %" PRIu64 ": " 2610 "warning, cannot process software breakpoint since no thread metadata", 2611 __FUNCTION__, pid); 2612 2613 2614 // We need to tell all other running threads before we notify the delegate about this stop. 2615 StopRunningThreads(pid); 2616 } 2617 2618 void 2619 NativeProcessLinux::MonitorWatchpoint(lldb::pid_t pid, NativeThreadProtocolSP thread_sp, uint32_t wp_index) 2620 { 2621 Log *log(GetLogIfAnyCategoriesSet(LIBLLDB_LOG_PROCESS | LIBLLDB_LOG_WATCHPOINTS)); 2622 if (log) 2623 log->Printf("NativeProcessLinux::%s() received watchpoint event, " 2624 "pid = %" PRIu64 ", wp_index = %" PRIu32, 2625 __FUNCTION__, pid, wp_index); 2626 2627 // This thread is currently stopped. 2628 ThreadDidStop(pid, false); 2629 2630 // Mark the thread as stopped at watchpoint. 2631 // The address is at (lldb::addr_t)info->si_addr if we need it. 2632 lldbassert(thread_sp && "thread_sp cannot be NULL"); 2633 std::static_pointer_cast<NativeThreadLinux>(thread_sp)->SetStoppedByWatchpoint(wp_index); 2634 2635 // We need to tell all other running threads before we notify the delegate about this stop. 2636 StopRunningThreads(pid); 2637 } 2638 2639 void 2640 NativeProcessLinux::MonitorSignal(const siginfo_t *info, lldb::pid_t pid, bool exited) 2641 { 2642 assert (info && "null info"); 2643 if (!info) 2644 return; 2645 2646 const int signo = info->si_signo; 2647 const bool is_from_llgs = info->si_pid == getpid (); 2648 2649 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 2650 2651 // POSIX says that process behaviour is undefined after it ignores a SIGFPE, 2652 // SIGILL, SIGSEGV, or SIGBUS *unless* that signal was generated by a 2653 // kill(2) or raise(3). Similarly for tgkill(2) on Linux. 2654 // 2655 // IOW, user generated signals never generate what we consider to be a 2656 // "crash". 2657 // 2658 // Similarly, ACK signals generated by this monitor. 2659 2660 Mutex::Locker locker (m_threads_mutex); 2661 2662 // See if we can find a thread for this signal. 2663 NativeThreadProtocolSP thread_sp = GetThreadByID (pid); 2664 if (!thread_sp) 2665 { 2666 if (log) 2667 log->Printf ("NativeProcessLinux::%s() pid %" PRIu64 " no thread found for tid %" PRIu64, __FUNCTION__, GetID (), pid); 2668 } 2669 2670 // Handle the signal. 2671 if (info->si_code == SI_TKILL || info->si_code == SI_USER) 2672 { 2673 if (log) 2674 log->Printf ("NativeProcessLinux::%s() received signal %s (%d) with code %s, (siginfo pid = %d (%s), waitpid pid = %" PRIu64 ")", 2675 __FUNCTION__, 2676 GetUnixSignals ().GetSignalAsCString (signo), 2677 signo, 2678 (info->si_code == SI_TKILL ? "SI_TKILL" : "SI_USER"), 2679 info->si_pid, 2680 is_from_llgs ? "from llgs" : "not from llgs", 2681 pid); 2682 } 2683 2684 // Check for new thread notification. 2685 if ((info->si_pid == 0) && (info->si_code == SI_USER)) 2686 { 2687 // A new thread creation is being signaled. This is one of two parts that come in 2688 // a non-deterministic order. This code handles the case where the new thread event comes 2689 // before the event on the parent thread. For the opposite case see code in 2690 // MonitorSIGTRAP. 2691 if (log) 2692 log->Printf ("NativeProcessLinux::%s() pid = %" PRIu64 " tid %" PRIu64 ": new thread notification", 2693 __FUNCTION__, GetID (), pid); 2694 2695 thread_sp = AddThread(pid); 2696 assert (thread_sp.get() && "failed to create the tracking data for newly created inferior thread"); 2697 // We can now resume the newly created thread. 2698 std::static_pointer_cast<NativeThreadLinux> (thread_sp)->SetRunning (); 2699 Resume (pid, LLDB_INVALID_SIGNAL_NUMBER); 2700 ThreadWasCreated(pid); 2701 // Done handling. 2702 return; 2703 } 2704 2705 // Check for thread stop notification. 2706 if (is_from_llgs && (info->si_code == SI_TKILL) && (signo == SIGSTOP)) 2707 { 2708 // This is a tgkill()-based stop. 2709 if (thread_sp) 2710 { 2711 if (log) 2712 log->Printf ("NativeProcessLinux::%s() pid %" PRIu64 " tid %" PRIu64 ", thread stopped", 2713 __FUNCTION__, 2714 GetID (), 2715 pid); 2716 2717 // Check that we're not already marked with a stop reason. 2718 // Note this thread really shouldn't already be marked as stopped - if we were, that would imply that 2719 // the kernel signaled us with the thread stopping which we handled and marked as stopped, 2720 // and that, without an intervening resume, we received another stop. It is more likely 2721 // that we are missing the marking of a run state somewhere if we find that the thread was 2722 // marked as stopped. 2723 std::shared_ptr<NativeThreadLinux> linux_thread_sp = std::static_pointer_cast<NativeThreadLinux> (thread_sp); 2724 assert (linux_thread_sp && "linux_thread_sp is null!"); 2725 2726 const StateType thread_state = linux_thread_sp->GetState (); 2727 if (!StateIsStoppedState (thread_state, false)) 2728 { 2729 // An inferior thread has stopped because of a SIGSTOP we have sent it. 2730 // Generally, these are not important stops and we don't want to report them as 2731 // they are just used to stop other threads when one thread (the one with the 2732 // *real* stop reason) hits a breakpoint (watchpoint, etc...). However, in the 2733 // case of an asynchronous Interrupt(), this *is* the real stop reason, so we 2734 // leave the signal intact if this is the thread that was chosen as the 2735 // triggering thread. 2736 if (m_pending_notification_up && m_pending_notification_up->triggering_tid == pid) 2737 linux_thread_sp->SetStoppedBySignal(SIGSTOP); 2738 else 2739 linux_thread_sp->SetStoppedBySignal(0); 2740 2741 SetCurrentThreadID (thread_sp->GetID ()); 2742 ThreadDidStop (thread_sp->GetID (), true); 2743 } 2744 else 2745 { 2746 if (log) 2747 { 2748 // Retrieve the signal name if the thread was stopped by a signal. 2749 int stop_signo = 0; 2750 const bool stopped_by_signal = linux_thread_sp->IsStopped (&stop_signo); 2751 const char *signal_name = stopped_by_signal ? GetUnixSignals ().GetSignalAsCString (stop_signo) : "<not stopped by signal>"; 2752 if (!signal_name) 2753 signal_name = "<no-signal-name>"; 2754 2755 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", 2756 __FUNCTION__, 2757 GetID (), 2758 linux_thread_sp->GetID (), 2759 StateAsCString (thread_state), 2760 stop_signo, 2761 signal_name); 2762 } 2763 ThreadDidStop (thread_sp->GetID (), false); 2764 } 2765 } 2766 2767 // Done handling. 2768 return; 2769 } 2770 2771 if (log) 2772 log->Printf ("NativeProcessLinux::%s() received signal %s", __FUNCTION__, GetUnixSignals ().GetSignalAsCString (signo)); 2773 2774 // This thread is stopped. 2775 ThreadDidStop (pid, false); 2776 2777 switch (signo) 2778 { 2779 case SIGSTOP: 2780 { 2781 std::static_pointer_cast<NativeThreadLinux> (thread_sp)->SetStoppedBySignal (signo); 2782 if (log) 2783 { 2784 if (is_from_llgs) 2785 log->Printf ("NativeProcessLinux::%s pid = %" PRIu64 " tid %" PRIu64 " received SIGSTOP from llgs, most likely an interrupt", __FUNCTION__, GetID (), pid); 2786 else 2787 log->Printf ("NativeProcessLinux::%s pid = %" PRIu64 " tid %" PRIu64 " received SIGSTOP from outside of debugger", __FUNCTION__, GetID (), pid); 2788 } 2789 2790 // Resume this thread to get the group-stop mechanism to fire off the true group stops. 2791 // This thread will get stopped again as part of the group-stop completion. 2792 ResumeThread(pid, 2793 [=](lldb::tid_t tid_to_resume, bool supress_signal) 2794 { 2795 std::static_pointer_cast<NativeThreadLinux> (thread_sp)->SetRunning (); 2796 // Pass this signal number on to the inferior to handle. 2797 return Resume (tid_to_resume, (supress_signal) ? LLDB_INVALID_SIGNAL_NUMBER : signo); 2798 }, 2799 true); 2800 } 2801 break; 2802 case SIGSEGV: 2803 case SIGILL: 2804 case SIGFPE: 2805 case SIGBUS: 2806 if (thread_sp) 2807 std::static_pointer_cast<NativeThreadLinux> (thread_sp)->SetCrashedWithException (*info); 2808 break; 2809 default: 2810 // This is just a pre-signal-delivery notification of the incoming signal. 2811 if (thread_sp) 2812 std::static_pointer_cast<NativeThreadLinux> (thread_sp)->SetStoppedBySignal (signo); 2813 2814 break; 2815 } 2816 2817 // Send a stop to the debugger after we get all other threads to stop. 2818 StopRunningThreads (pid); 2819 } 2820 2821 namespace { 2822 2823 struct EmulatorBaton 2824 { 2825 NativeProcessLinux* m_process; 2826 NativeRegisterContext* m_reg_context; 2827 2828 // eRegisterKindDWARF -> RegsiterValue 2829 std::unordered_map<uint32_t, RegisterValue> m_register_values; 2830 2831 EmulatorBaton(NativeProcessLinux* process, NativeRegisterContext* reg_context) : 2832 m_process(process), m_reg_context(reg_context) {} 2833 }; 2834 2835 } // anonymous namespace 2836 2837 static size_t 2838 ReadMemoryCallback (EmulateInstruction *instruction, 2839 void *baton, 2840 const EmulateInstruction::Context &context, 2841 lldb::addr_t addr, 2842 void *dst, 2843 size_t length) 2844 { 2845 EmulatorBaton* emulator_baton = static_cast<EmulatorBaton*>(baton); 2846 2847 size_t bytes_read; 2848 emulator_baton->m_process->ReadMemory(addr, dst, length, bytes_read); 2849 return bytes_read; 2850 } 2851 2852 static bool 2853 ReadRegisterCallback (EmulateInstruction *instruction, 2854 void *baton, 2855 const RegisterInfo *reg_info, 2856 RegisterValue ®_value) 2857 { 2858 EmulatorBaton* emulator_baton = static_cast<EmulatorBaton*>(baton); 2859 2860 auto it = emulator_baton->m_register_values.find(reg_info->kinds[eRegisterKindDWARF]); 2861 if (it != emulator_baton->m_register_values.end()) 2862 { 2863 reg_value = it->second; 2864 return true; 2865 } 2866 2867 // The emulator only fill in the dwarf regsiter numbers (and in some case 2868 // the generic register numbers). Get the full register info from the 2869 // register context based on the dwarf register numbers. 2870 const RegisterInfo* full_reg_info = emulator_baton->m_reg_context->GetRegisterInfo( 2871 eRegisterKindDWARF, reg_info->kinds[eRegisterKindDWARF]); 2872 2873 Error error = emulator_baton->m_reg_context->ReadRegister(full_reg_info, reg_value); 2874 if (error.Success()) 2875 return true; 2876 2877 return false; 2878 } 2879 2880 static bool 2881 WriteRegisterCallback (EmulateInstruction *instruction, 2882 void *baton, 2883 const EmulateInstruction::Context &context, 2884 const RegisterInfo *reg_info, 2885 const RegisterValue ®_value) 2886 { 2887 EmulatorBaton* emulator_baton = static_cast<EmulatorBaton*>(baton); 2888 emulator_baton->m_register_values[reg_info->kinds[eRegisterKindDWARF]] = reg_value; 2889 return true; 2890 } 2891 2892 static size_t 2893 WriteMemoryCallback (EmulateInstruction *instruction, 2894 void *baton, 2895 const EmulateInstruction::Context &context, 2896 lldb::addr_t addr, 2897 const void *dst, 2898 size_t length) 2899 { 2900 return length; 2901 } 2902 2903 static lldb::addr_t 2904 ReadFlags (NativeRegisterContext* regsiter_context) 2905 { 2906 const RegisterInfo* flags_info = regsiter_context->GetRegisterInfo( 2907 eRegisterKindGeneric, LLDB_REGNUM_GENERIC_FLAGS); 2908 return regsiter_context->ReadRegisterAsUnsigned(flags_info, LLDB_INVALID_ADDRESS); 2909 } 2910 2911 Error 2912 NativeProcessLinux::SetupSoftwareSingleStepping(NativeThreadProtocolSP thread_sp) 2913 { 2914 Error error; 2915 NativeRegisterContextSP register_context_sp = thread_sp->GetRegisterContext(); 2916 2917 std::unique_ptr<EmulateInstruction> emulator_ap( 2918 EmulateInstruction::FindPlugin(m_arch, eInstructionTypePCModifying, nullptr)); 2919 2920 if (emulator_ap == nullptr) 2921 return Error("Instruction emulator not found!"); 2922 2923 EmulatorBaton baton(this, register_context_sp.get()); 2924 emulator_ap->SetBaton(&baton); 2925 emulator_ap->SetReadMemCallback(&ReadMemoryCallback); 2926 emulator_ap->SetReadRegCallback(&ReadRegisterCallback); 2927 emulator_ap->SetWriteMemCallback(&WriteMemoryCallback); 2928 emulator_ap->SetWriteRegCallback(&WriteRegisterCallback); 2929 2930 if (!emulator_ap->ReadInstruction()) 2931 return Error("Read instruction failed!"); 2932 2933 bool emulation_result = emulator_ap->EvaluateInstruction(eEmulateInstructionOptionAutoAdvancePC); 2934 2935 const RegisterInfo* reg_info_pc = register_context_sp->GetRegisterInfo(eRegisterKindGeneric, LLDB_REGNUM_GENERIC_PC); 2936 const RegisterInfo* reg_info_flags = register_context_sp->GetRegisterInfo(eRegisterKindGeneric, LLDB_REGNUM_GENERIC_FLAGS); 2937 2938 auto pc_it = baton.m_register_values.find(reg_info_pc->kinds[eRegisterKindDWARF]); 2939 auto flags_it = baton.m_register_values.find(reg_info_flags->kinds[eRegisterKindDWARF]); 2940 2941 lldb::addr_t next_pc; 2942 lldb::addr_t next_flags; 2943 if (emulation_result) 2944 { 2945 assert(pc_it != baton.m_register_values.end() && "Emulation was successfull but PC wasn't updated"); 2946 next_pc = pc_it->second.GetAsUInt64(); 2947 2948 if (flags_it != baton.m_register_values.end()) 2949 next_flags = flags_it->second.GetAsUInt64(); 2950 else 2951 next_flags = ReadFlags (register_context_sp.get()); 2952 } 2953 else if (pc_it == baton.m_register_values.end()) 2954 { 2955 // Emulate instruction failed and it haven't changed PC. Advance PC 2956 // with the size of the current opcode because the emulation of all 2957 // PC modifying instruction should be successful. The failure most 2958 // likely caused by a not supported instruction which don't modify PC. 2959 next_pc = register_context_sp->GetPC() + emulator_ap->GetOpcode().GetByteSize(); 2960 next_flags = ReadFlags (register_context_sp.get()); 2961 } 2962 else 2963 { 2964 // The instruction emulation failed after it modified the PC. It is an 2965 // unknown error where we can't continue because the next instruction is 2966 // modifying the PC but we don't know how. 2967 return Error ("Instruction emulation failed unexpectedly."); 2968 } 2969 2970 if (m_arch.GetMachine() == llvm::Triple::arm) 2971 { 2972 if (next_flags & 0x20) 2973 { 2974 // Thumb mode 2975 error = SetSoftwareBreakpoint(next_pc, 2); 2976 } 2977 else 2978 { 2979 // Arm mode 2980 error = SetSoftwareBreakpoint(next_pc, 4); 2981 } 2982 } 2983 else if (m_arch.GetMachine() == llvm::Triple::mips64 2984 || m_arch.GetMachine() == llvm::Triple::mips64el) 2985 error = SetSoftwareBreakpoint(next_pc, 4); 2986 else 2987 { 2988 // No size hint is given for the next breakpoint 2989 error = SetSoftwareBreakpoint(next_pc, 0); 2990 } 2991 2992 if (error.Fail()) 2993 return error; 2994 2995 m_threads_stepping_with_breakpoint.insert({thread_sp->GetID(), next_pc}); 2996 2997 return Error(); 2998 } 2999 3000 bool 3001 NativeProcessLinux::SupportHardwareSingleStepping() const 3002 { 3003 if (m_arch.GetMachine() == llvm::Triple::arm 3004 || m_arch.GetMachine() == llvm::Triple::mips64 || m_arch.GetMachine() == llvm::Triple::mips64el) 3005 return false; 3006 return true; 3007 } 3008 3009 Error 3010 NativeProcessLinux::Resume (const ResumeActionList &resume_actions) 3011 { 3012 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS | LIBLLDB_LOG_THREAD)); 3013 if (log) 3014 log->Printf ("NativeProcessLinux::%s called: pid %" PRIu64, __FUNCTION__, GetID ()); 3015 3016 bool software_single_step = !SupportHardwareSingleStepping(); 3017 3018 Monitor::ScopedOperationLock monitor_lock(*m_monitor_up); 3019 Mutex::Locker locker (m_threads_mutex); 3020 3021 if (software_single_step) 3022 { 3023 for (auto thread_sp : m_threads) 3024 { 3025 assert (thread_sp && "thread list should not contain NULL threads"); 3026 3027 const ResumeAction *const action = resume_actions.GetActionForThread (thread_sp->GetID (), true); 3028 if (action == nullptr) 3029 continue; 3030 3031 if (action->state == eStateStepping) 3032 { 3033 Error error = SetupSoftwareSingleStepping(thread_sp); 3034 if (error.Fail()) 3035 return error; 3036 } 3037 } 3038 } 3039 3040 for (auto thread_sp : m_threads) 3041 { 3042 assert (thread_sp && "thread list should not contain NULL threads"); 3043 3044 const ResumeAction *const action = resume_actions.GetActionForThread (thread_sp->GetID (), true); 3045 3046 if (action == nullptr) 3047 { 3048 if (log) 3049 log->Printf ("NativeProcessLinux::%s no action specified for pid %" PRIu64 " tid %" PRIu64, 3050 __FUNCTION__, GetID (), thread_sp->GetID ()); 3051 continue; 3052 } 3053 3054 if (log) 3055 { 3056 log->Printf ("NativeProcessLinux::%s processing resume action state %s for pid %" PRIu64 " tid %" PRIu64, 3057 __FUNCTION__, StateAsCString (action->state), GetID (), thread_sp->GetID ()); 3058 } 3059 3060 switch (action->state) 3061 { 3062 case eStateRunning: 3063 { 3064 // Run the thread, possibly feeding it the signal. 3065 const int signo = action->signal; 3066 ResumeThread(thread_sp->GetID (), 3067 [=](lldb::tid_t tid_to_resume, bool supress_signal) 3068 { 3069 std::static_pointer_cast<NativeThreadLinux> (thread_sp)->SetRunning (); 3070 // Pass this signal number on to the inferior to handle. 3071 const auto resume_result = Resume (tid_to_resume, (signo > 0 && !supress_signal) ? signo : LLDB_INVALID_SIGNAL_NUMBER); 3072 if (resume_result.Success()) 3073 SetState(eStateRunning, true); 3074 return resume_result; 3075 }, 3076 false); 3077 break; 3078 } 3079 3080 case eStateStepping: 3081 { 3082 // Request the step. 3083 const int signo = action->signal; 3084 ResumeThread(thread_sp->GetID (), 3085 [=](lldb::tid_t tid_to_step, bool supress_signal) 3086 { 3087 std::static_pointer_cast<NativeThreadLinux> (thread_sp)->SetStepping (); 3088 3089 Error step_result; 3090 if (software_single_step) 3091 step_result = Resume (tid_to_step, (signo > 0 && !supress_signal) ? signo : LLDB_INVALID_SIGNAL_NUMBER); 3092 else 3093 step_result = SingleStep (tid_to_step,(signo > 0 && !supress_signal) ? signo : LLDB_INVALID_SIGNAL_NUMBER); 3094 3095 assert (step_result.Success() && "SingleStep() failed"); 3096 if (step_result.Success()) 3097 SetState(eStateStepping, true); 3098 return step_result; 3099 }, 3100 false); 3101 break; 3102 } 3103 3104 case eStateSuspended: 3105 case eStateStopped: 3106 lldbassert(0 && "Unexpected state"); 3107 3108 default: 3109 return Error ("NativeProcessLinux::%s (): unexpected state %s specified for pid %" PRIu64 ", tid %" PRIu64, 3110 __FUNCTION__, StateAsCString (action->state), GetID (), thread_sp->GetID ()); 3111 } 3112 } 3113 3114 return Error(); 3115 } 3116 3117 Error 3118 NativeProcessLinux::Halt () 3119 { 3120 Error error; 3121 3122 if (kill (GetID (), SIGSTOP) != 0) 3123 error.SetErrorToErrno (); 3124 3125 return error; 3126 } 3127 3128 Error 3129 NativeProcessLinux::Detach () 3130 { 3131 Error error; 3132 3133 // Tell ptrace to detach from the process. 3134 if (GetID () != LLDB_INVALID_PROCESS_ID) 3135 error = Detach (GetID ()); 3136 3137 // Stop monitoring the inferior. 3138 m_monitor_up->Terminate(); 3139 3140 // No error. 3141 return error; 3142 } 3143 3144 Error 3145 NativeProcessLinux::Signal (int signo) 3146 { 3147 Error error; 3148 3149 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 3150 if (log) 3151 log->Printf ("NativeProcessLinux::%s: sending signal %d (%s) to pid %" PRIu64, 3152 __FUNCTION__, signo, GetUnixSignals ().GetSignalAsCString (signo), GetID ()); 3153 3154 if (kill(GetID(), signo)) 3155 error.SetErrorToErrno(); 3156 3157 return error; 3158 } 3159 3160 Error 3161 NativeProcessLinux::Interrupt () 3162 { 3163 // Pick a running thread (or if none, a not-dead stopped thread) as 3164 // the chosen thread that will be the stop-reason thread. 3165 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 3166 3167 NativeThreadProtocolSP running_thread_sp; 3168 NativeThreadProtocolSP stopped_thread_sp; 3169 3170 if (log) 3171 log->Printf ("NativeProcessLinux::%s selecting running thread for interrupt target", __FUNCTION__); 3172 3173 Monitor::ScopedOperationLock monitor_lock(*m_monitor_up); 3174 Mutex::Locker locker (m_threads_mutex); 3175 3176 for (auto thread_sp : m_threads) 3177 { 3178 // The thread shouldn't be null but lets just cover that here. 3179 if (!thread_sp) 3180 continue; 3181 3182 // If we have a running or stepping thread, we'll call that the 3183 // target of the interrupt. 3184 const auto thread_state = thread_sp->GetState (); 3185 if (thread_state == eStateRunning || 3186 thread_state == eStateStepping) 3187 { 3188 running_thread_sp = thread_sp; 3189 break; 3190 } 3191 else if (!stopped_thread_sp && StateIsStoppedState (thread_state, true)) 3192 { 3193 // Remember the first non-dead stopped thread. We'll use that as a backup if there are no running threads. 3194 stopped_thread_sp = thread_sp; 3195 } 3196 } 3197 3198 if (!running_thread_sp && !stopped_thread_sp) 3199 { 3200 Error error("found no running/stepping or live stopped threads as target for interrupt"); 3201 if (log) 3202 log->Printf ("NativeProcessLinux::%s skipping due to error: %s", __FUNCTION__, error.AsCString ()); 3203 3204 return error; 3205 } 3206 3207 NativeThreadProtocolSP deferred_signal_thread_sp = running_thread_sp ? running_thread_sp : stopped_thread_sp; 3208 3209 if (log) 3210 log->Printf ("NativeProcessLinux::%s pid %" PRIu64 " %s tid %" PRIu64 " chosen for interrupt target", 3211 __FUNCTION__, 3212 GetID (), 3213 running_thread_sp ? "running" : "stopped", 3214 deferred_signal_thread_sp->GetID ()); 3215 3216 StopRunningThreads(deferred_signal_thread_sp->GetID()); 3217 3218 return Error(); 3219 } 3220 3221 Error 3222 NativeProcessLinux::Kill () 3223 { 3224 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 3225 if (log) 3226 log->Printf ("NativeProcessLinux::%s called for PID %" PRIu64, __FUNCTION__, GetID ()); 3227 3228 Error error; 3229 3230 switch (m_state) 3231 { 3232 case StateType::eStateInvalid: 3233 case StateType::eStateExited: 3234 case StateType::eStateCrashed: 3235 case StateType::eStateDetached: 3236 case StateType::eStateUnloaded: 3237 // Nothing to do - the process is already dead. 3238 if (log) 3239 log->Printf ("NativeProcessLinux::%s ignored for PID %" PRIu64 " due to current state: %s", __FUNCTION__, GetID (), StateAsCString (m_state)); 3240 return error; 3241 3242 case StateType::eStateConnected: 3243 case StateType::eStateAttaching: 3244 case StateType::eStateLaunching: 3245 case StateType::eStateStopped: 3246 case StateType::eStateRunning: 3247 case StateType::eStateStepping: 3248 case StateType::eStateSuspended: 3249 // We can try to kill a process in these states. 3250 break; 3251 } 3252 3253 if (kill (GetID (), SIGKILL) != 0) 3254 { 3255 error.SetErrorToErrno (); 3256 return error; 3257 } 3258 3259 return error; 3260 } 3261 3262 static Error 3263 ParseMemoryRegionInfoFromProcMapsLine (const std::string &maps_line, MemoryRegionInfo &memory_region_info) 3264 { 3265 memory_region_info.Clear(); 3266 3267 StringExtractor line_extractor (maps_line.c_str ()); 3268 3269 // Format: {address_start_hex}-{address_end_hex} perms offset dev inode pathname 3270 // perms: rwxp (letter is present if set, '-' if not, final character is p=private, s=shared). 3271 3272 // Parse out the starting address 3273 lldb::addr_t start_address = line_extractor.GetHexMaxU64 (false, 0); 3274 3275 // Parse out hyphen separating start and end address from range. 3276 if (!line_extractor.GetBytesLeft () || (line_extractor.GetChar () != '-')) 3277 return Error ("malformed /proc/{pid}/maps entry, missing dash between address range"); 3278 3279 // Parse out the ending address 3280 lldb::addr_t end_address = line_extractor.GetHexMaxU64 (false, start_address); 3281 3282 // Parse out the space after the address. 3283 if (!line_extractor.GetBytesLeft () || (line_extractor.GetChar () != ' ')) 3284 return Error ("malformed /proc/{pid}/maps entry, missing space after range"); 3285 3286 // Save the range. 3287 memory_region_info.GetRange ().SetRangeBase (start_address); 3288 memory_region_info.GetRange ().SetRangeEnd (end_address); 3289 3290 // Parse out each permission entry. 3291 if (line_extractor.GetBytesLeft () < 4) 3292 return Error ("malformed /proc/{pid}/maps entry, missing some portion of permissions"); 3293 3294 // Handle read permission. 3295 const char read_perm_char = line_extractor.GetChar (); 3296 if (read_perm_char == 'r') 3297 memory_region_info.SetReadable (MemoryRegionInfo::OptionalBool::eYes); 3298 else 3299 { 3300 assert ( (read_perm_char == '-') && "unexpected /proc/{pid}/maps read permission char" ); 3301 memory_region_info.SetReadable (MemoryRegionInfo::OptionalBool::eNo); 3302 } 3303 3304 // Handle write permission. 3305 const char write_perm_char = line_extractor.GetChar (); 3306 if (write_perm_char == 'w') 3307 memory_region_info.SetWritable (MemoryRegionInfo::OptionalBool::eYes); 3308 else 3309 { 3310 assert ( (write_perm_char == '-') && "unexpected /proc/{pid}/maps write permission char" ); 3311 memory_region_info.SetWritable (MemoryRegionInfo::OptionalBool::eNo); 3312 } 3313 3314 // Handle execute permission. 3315 const char exec_perm_char = line_extractor.GetChar (); 3316 if (exec_perm_char == 'x') 3317 memory_region_info.SetExecutable (MemoryRegionInfo::OptionalBool::eYes); 3318 else 3319 { 3320 assert ( (exec_perm_char == '-') && "unexpected /proc/{pid}/maps exec permission char" ); 3321 memory_region_info.SetExecutable (MemoryRegionInfo::OptionalBool::eNo); 3322 } 3323 3324 return Error (); 3325 } 3326 3327 Error 3328 NativeProcessLinux::GetMemoryRegionInfo (lldb::addr_t load_addr, MemoryRegionInfo &range_info) 3329 { 3330 // FIXME review that the final memory region returned extends to the end of the virtual address space, 3331 // with no perms if it is not mapped. 3332 3333 // Use an approach that reads memory regions from /proc/{pid}/maps. 3334 // Assume proc maps entries are in ascending order. 3335 // FIXME assert if we find differently. 3336 Mutex::Locker locker (m_mem_region_cache_mutex); 3337 3338 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 3339 Error error; 3340 3341 if (m_supports_mem_region == LazyBool::eLazyBoolNo) 3342 { 3343 // We're done. 3344 error.SetErrorString ("unsupported"); 3345 return error; 3346 } 3347 3348 // If our cache is empty, pull the latest. There should always be at least one memory region 3349 // if memory region handling is supported. 3350 if (m_mem_region_cache.empty ()) 3351 { 3352 error = ProcFileReader::ProcessLineByLine (GetID (), "maps", 3353 [&] (const std::string &line) -> bool 3354 { 3355 MemoryRegionInfo info; 3356 const Error parse_error = ParseMemoryRegionInfoFromProcMapsLine (line, info); 3357 if (parse_error.Success ()) 3358 { 3359 m_mem_region_cache.push_back (info); 3360 return true; 3361 } 3362 else 3363 { 3364 if (log) 3365 log->Printf ("NativeProcessLinux::%s failed to parse proc maps line '%s': %s", __FUNCTION__, line.c_str (), error.AsCString ()); 3366 return false; 3367 } 3368 }); 3369 3370 // If we had an error, we'll mark unsupported. 3371 if (error.Fail ()) 3372 { 3373 m_supports_mem_region = LazyBool::eLazyBoolNo; 3374 return error; 3375 } 3376 else if (m_mem_region_cache.empty ()) 3377 { 3378 // No entries after attempting to read them. This shouldn't happen if /proc/{pid}/maps 3379 // is supported. Assume we don't support map entries via procfs. 3380 if (log) 3381 log->Printf ("NativeProcessLinux::%s failed to find any procfs maps entries, assuming no support for memory region metadata retrieval", __FUNCTION__); 3382 m_supports_mem_region = LazyBool::eLazyBoolNo; 3383 error.SetErrorString ("not supported"); 3384 return error; 3385 } 3386 3387 if (log) 3388 log->Printf ("NativeProcessLinux::%s read %" PRIu64 " memory region entries from /proc/%" PRIu64 "/maps", __FUNCTION__, static_cast<uint64_t> (m_mem_region_cache.size ()), GetID ()); 3389 3390 // We support memory retrieval, remember that. 3391 m_supports_mem_region = LazyBool::eLazyBoolYes; 3392 } 3393 else 3394 { 3395 if (log) 3396 log->Printf ("NativeProcessLinux::%s reusing %" PRIu64 " cached memory region entries", __FUNCTION__, static_cast<uint64_t> (m_mem_region_cache.size ())); 3397 } 3398 3399 lldb::addr_t prev_base_address = 0; 3400 3401 // FIXME start by finding the last region that is <= target address using binary search. Data is sorted. 3402 // There can be a ton of regions on pthreads apps with lots of threads. 3403 for (auto it = m_mem_region_cache.begin(); it != m_mem_region_cache.end (); ++it) 3404 { 3405 MemoryRegionInfo &proc_entry_info = *it; 3406 3407 // Sanity check assumption that /proc/{pid}/maps entries are ascending. 3408 assert ((proc_entry_info.GetRange ().GetRangeBase () >= prev_base_address) && "descending /proc/pid/maps entries detected, unexpected"); 3409 prev_base_address = proc_entry_info.GetRange ().GetRangeBase (); 3410 3411 // If the target address comes before this entry, indicate distance to next region. 3412 if (load_addr < proc_entry_info.GetRange ().GetRangeBase ()) 3413 { 3414 range_info.GetRange ().SetRangeBase (load_addr); 3415 range_info.GetRange ().SetByteSize (proc_entry_info.GetRange ().GetRangeBase () - load_addr); 3416 range_info.SetReadable (MemoryRegionInfo::OptionalBool::eNo); 3417 range_info.SetWritable (MemoryRegionInfo::OptionalBool::eNo); 3418 range_info.SetExecutable (MemoryRegionInfo::OptionalBool::eNo); 3419 3420 return error; 3421 } 3422 else if (proc_entry_info.GetRange ().Contains (load_addr)) 3423 { 3424 // The target address is within the memory region we're processing here. 3425 range_info = proc_entry_info; 3426 return error; 3427 } 3428 3429 // The target memory address comes somewhere after the region we just parsed. 3430 } 3431 3432 // If we made it here, we didn't find an entry that contained the given address. 3433 error.SetErrorString ("address comes after final region"); 3434 3435 if (log) 3436 log->Printf ("NativeProcessLinux::%s failed to find map entry for address 0x%" PRIx64 ": %s", __FUNCTION__, load_addr, error.AsCString ()); 3437 3438 return error; 3439 } 3440 3441 void 3442 NativeProcessLinux::DoStopIDBumped (uint32_t newBumpId) 3443 { 3444 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 3445 if (log) 3446 log->Printf ("NativeProcessLinux::%s(newBumpId=%" PRIu32 ") called", __FUNCTION__, newBumpId); 3447 3448 { 3449 Mutex::Locker locker (m_mem_region_cache_mutex); 3450 if (log) 3451 log->Printf ("NativeProcessLinux::%s clearing %" PRIu64 " entries from the cache", __FUNCTION__, static_cast<uint64_t> (m_mem_region_cache.size ())); 3452 m_mem_region_cache.clear (); 3453 } 3454 } 3455 3456 Error 3457 NativeProcessLinux::AllocateMemory(size_t size, uint32_t permissions, lldb::addr_t &addr) 3458 { 3459 // FIXME implementing this requires the equivalent of 3460 // InferiorCallPOSIX::InferiorCallMmap, which depends on 3461 // functional ThreadPlans working with Native*Protocol. 3462 #if 1 3463 return Error ("not implemented yet"); 3464 #else 3465 addr = LLDB_INVALID_ADDRESS; 3466 3467 unsigned prot = 0; 3468 if (permissions & lldb::ePermissionsReadable) 3469 prot |= eMmapProtRead; 3470 if (permissions & lldb::ePermissionsWritable) 3471 prot |= eMmapProtWrite; 3472 if (permissions & lldb::ePermissionsExecutable) 3473 prot |= eMmapProtExec; 3474 3475 // TODO implement this directly in NativeProcessLinux 3476 // (and lift to NativeProcessPOSIX if/when that class is 3477 // refactored out). 3478 if (InferiorCallMmap(this, addr, 0, size, prot, 3479 eMmapFlagsAnon | eMmapFlagsPrivate, -1, 0)) { 3480 m_addr_to_mmap_size[addr] = size; 3481 return Error (); 3482 } else { 3483 addr = LLDB_INVALID_ADDRESS; 3484 return Error("unable to allocate %" PRIu64 " bytes of memory with permissions %s", size, GetPermissionsAsCString (permissions)); 3485 } 3486 #endif 3487 } 3488 3489 Error 3490 NativeProcessLinux::DeallocateMemory (lldb::addr_t addr) 3491 { 3492 // FIXME see comments in AllocateMemory - required lower-level 3493 // bits not in place yet (ThreadPlans) 3494 return Error ("not implemented"); 3495 } 3496 3497 lldb::addr_t 3498 NativeProcessLinux::GetSharedLibraryInfoAddress () 3499 { 3500 #if 1 3501 // punt on this for now 3502 return LLDB_INVALID_ADDRESS; 3503 #else 3504 // Return the image info address for the exe module 3505 #if 1 3506 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 3507 3508 ModuleSP module_sp; 3509 Error error = GetExeModuleSP (module_sp); 3510 if (error.Fail ()) 3511 { 3512 if (log) 3513 log->Warning ("NativeProcessLinux::%s failed to retrieve exe module: %s", __FUNCTION__, error.AsCString ()); 3514 return LLDB_INVALID_ADDRESS; 3515 } 3516 3517 if (module_sp == nullptr) 3518 { 3519 if (log) 3520 log->Warning ("NativeProcessLinux::%s exe module returned was NULL", __FUNCTION__); 3521 return LLDB_INVALID_ADDRESS; 3522 } 3523 3524 ObjectFileSP object_file_sp = module_sp->GetObjectFile (); 3525 if (object_file_sp == nullptr) 3526 { 3527 if (log) 3528 log->Warning ("NativeProcessLinux::%s exe module returned a NULL object file", __FUNCTION__); 3529 return LLDB_INVALID_ADDRESS; 3530 } 3531 3532 return obj_file_sp->GetImageInfoAddress(); 3533 #else 3534 Target *target = &GetTarget(); 3535 ObjectFile *obj_file = target->GetExecutableModule()->GetObjectFile(); 3536 Address addr = obj_file->GetImageInfoAddress(target); 3537 3538 if (addr.IsValid()) 3539 return addr.GetLoadAddress(target); 3540 return LLDB_INVALID_ADDRESS; 3541 #endif 3542 #endif // punt on this for now 3543 } 3544 3545 size_t 3546 NativeProcessLinux::UpdateThreads () 3547 { 3548 // The NativeProcessLinux monitoring threads are always up to date 3549 // with respect to thread state and they keep the thread list 3550 // populated properly. All this method needs to do is return the 3551 // thread count. 3552 Mutex::Locker locker (m_threads_mutex); 3553 return m_threads.size (); 3554 } 3555 3556 bool 3557 NativeProcessLinux::GetArchitecture (ArchSpec &arch) const 3558 { 3559 arch = m_arch; 3560 return true; 3561 } 3562 3563 Error 3564 NativeProcessLinux::GetSoftwareBreakpointPCOffset (NativeRegisterContextSP context_sp, uint32_t &actual_opcode_size) 3565 { 3566 // FIXME put this behind a breakpoint protocol class that can be 3567 // set per architecture. Need ARM, MIPS support here. 3568 static const uint8_t g_aarch64_opcode[] = { 0x00, 0x00, 0x20, 0xd4 }; 3569 static const uint8_t g_i386_opcode [] = { 0xCC }; 3570 static const uint8_t g_mips64_opcode[] = { 0x00, 0x00, 0x00, 0x0d }; 3571 3572 switch (m_arch.GetMachine ()) 3573 { 3574 case llvm::Triple::aarch64: 3575 actual_opcode_size = static_cast<uint32_t> (sizeof(g_aarch64_opcode)); 3576 return Error (); 3577 3578 case llvm::Triple::arm: 3579 actual_opcode_size = 0; // On arm the PC don't get updated for breakpoint hits 3580 return Error (); 3581 3582 case llvm::Triple::x86: 3583 case llvm::Triple::x86_64: 3584 actual_opcode_size = static_cast<uint32_t> (sizeof(g_i386_opcode)); 3585 return Error (); 3586 3587 case llvm::Triple::mips64: 3588 case llvm::Triple::mips64el: 3589 actual_opcode_size = static_cast<uint32_t> (sizeof(g_mips64_opcode)); 3590 return Error (); 3591 3592 default: 3593 assert(false && "CPU type not supported!"); 3594 return Error ("CPU type not supported"); 3595 } 3596 } 3597 3598 Error 3599 NativeProcessLinux::SetBreakpoint (lldb::addr_t addr, uint32_t size, bool hardware) 3600 { 3601 if (hardware) 3602 return Error ("NativeProcessLinux does not support hardware breakpoints"); 3603 else 3604 return SetSoftwareBreakpoint (addr, size); 3605 } 3606 3607 Error 3608 NativeProcessLinux::GetSoftwareBreakpointTrapOpcode (size_t trap_opcode_size_hint, 3609 size_t &actual_opcode_size, 3610 const uint8_t *&trap_opcode_bytes) 3611 { 3612 // FIXME put this behind a breakpoint protocol class that can be set per 3613 // architecture. Need MIPS support here. 3614 static const uint8_t g_aarch64_opcode[] = { 0x00, 0x00, 0x20, 0xd4 }; 3615 // The ARM reference recommends the use of 0xe7fddefe and 0xdefe but the 3616 // linux kernel does otherwise. 3617 static const uint8_t g_arm_breakpoint_opcode[] = { 0xf0, 0x01, 0xf0, 0xe7 }; 3618 static const uint8_t g_i386_opcode [] = { 0xCC }; 3619 static const uint8_t g_mips64_opcode[] = { 0x00, 0x00, 0x00, 0x0d }; 3620 static const uint8_t g_mips64el_opcode[] = { 0x0d, 0x00, 0x00, 0x00 }; 3621 static const uint8_t g_thumb_breakpoint_opcode[] = { 0x01, 0xde }; 3622 3623 switch (m_arch.GetMachine ()) 3624 { 3625 case llvm::Triple::aarch64: 3626 trap_opcode_bytes = g_aarch64_opcode; 3627 actual_opcode_size = sizeof(g_aarch64_opcode); 3628 return Error (); 3629 3630 case llvm::Triple::arm: 3631 switch (trap_opcode_size_hint) 3632 { 3633 case 2: 3634 trap_opcode_bytes = g_thumb_breakpoint_opcode; 3635 actual_opcode_size = sizeof(g_thumb_breakpoint_opcode); 3636 return Error (); 3637 case 4: 3638 trap_opcode_bytes = g_arm_breakpoint_opcode; 3639 actual_opcode_size = sizeof(g_arm_breakpoint_opcode); 3640 return Error (); 3641 default: 3642 assert(false && "Unrecognised trap opcode size hint!"); 3643 return Error ("Unrecognised trap opcode size hint!"); 3644 } 3645 3646 case llvm::Triple::x86: 3647 case llvm::Triple::x86_64: 3648 trap_opcode_bytes = g_i386_opcode; 3649 actual_opcode_size = sizeof(g_i386_opcode); 3650 return Error (); 3651 3652 case llvm::Triple::mips64: 3653 trap_opcode_bytes = g_mips64_opcode; 3654 actual_opcode_size = sizeof(g_mips64_opcode); 3655 return Error (); 3656 3657 case llvm::Triple::mips64el: 3658 trap_opcode_bytes = g_mips64el_opcode; 3659 actual_opcode_size = sizeof(g_mips64el_opcode); 3660 return Error (); 3661 3662 default: 3663 assert(false && "CPU type not supported!"); 3664 return Error ("CPU type not supported"); 3665 } 3666 } 3667 3668 #if 0 3669 ProcessMessage::CrashReason 3670 NativeProcessLinux::GetCrashReasonForSIGSEGV(const siginfo_t *info) 3671 { 3672 ProcessMessage::CrashReason reason; 3673 assert(info->si_signo == SIGSEGV); 3674 3675 reason = ProcessMessage::eInvalidCrashReason; 3676 3677 switch (info->si_code) 3678 { 3679 default: 3680 assert(false && "unexpected si_code for SIGSEGV"); 3681 break; 3682 case SI_KERNEL: 3683 // Linux will occasionally send spurious SI_KERNEL codes. 3684 // (this is poorly documented in sigaction) 3685 // One way to get this is via unaligned SIMD loads. 3686 reason = ProcessMessage::eInvalidAddress; // for lack of anything better 3687 break; 3688 case SEGV_MAPERR: 3689 reason = ProcessMessage::eInvalidAddress; 3690 break; 3691 case SEGV_ACCERR: 3692 reason = ProcessMessage::ePrivilegedAddress; 3693 break; 3694 } 3695 3696 return reason; 3697 } 3698 #endif 3699 3700 3701 #if 0 3702 ProcessMessage::CrashReason 3703 NativeProcessLinux::GetCrashReasonForSIGILL(const siginfo_t *info) 3704 { 3705 ProcessMessage::CrashReason reason; 3706 assert(info->si_signo == SIGILL); 3707 3708 reason = ProcessMessage::eInvalidCrashReason; 3709 3710 switch (info->si_code) 3711 { 3712 default: 3713 assert(false && "unexpected si_code for SIGILL"); 3714 break; 3715 case ILL_ILLOPC: 3716 reason = ProcessMessage::eIllegalOpcode; 3717 break; 3718 case ILL_ILLOPN: 3719 reason = ProcessMessage::eIllegalOperand; 3720 break; 3721 case ILL_ILLADR: 3722 reason = ProcessMessage::eIllegalAddressingMode; 3723 break; 3724 case ILL_ILLTRP: 3725 reason = ProcessMessage::eIllegalTrap; 3726 break; 3727 case ILL_PRVOPC: 3728 reason = ProcessMessage::ePrivilegedOpcode; 3729 break; 3730 case ILL_PRVREG: 3731 reason = ProcessMessage::ePrivilegedRegister; 3732 break; 3733 case ILL_COPROC: 3734 reason = ProcessMessage::eCoprocessorError; 3735 break; 3736 case ILL_BADSTK: 3737 reason = ProcessMessage::eInternalStackError; 3738 break; 3739 } 3740 3741 return reason; 3742 } 3743 #endif 3744 3745 #if 0 3746 ProcessMessage::CrashReason 3747 NativeProcessLinux::GetCrashReasonForSIGFPE(const siginfo_t *info) 3748 { 3749 ProcessMessage::CrashReason reason; 3750 assert(info->si_signo == SIGFPE); 3751 3752 reason = ProcessMessage::eInvalidCrashReason; 3753 3754 switch (info->si_code) 3755 { 3756 default: 3757 assert(false && "unexpected si_code for SIGFPE"); 3758 break; 3759 case FPE_INTDIV: 3760 reason = ProcessMessage::eIntegerDivideByZero; 3761 break; 3762 case FPE_INTOVF: 3763 reason = ProcessMessage::eIntegerOverflow; 3764 break; 3765 case FPE_FLTDIV: 3766 reason = ProcessMessage::eFloatDivideByZero; 3767 break; 3768 case FPE_FLTOVF: 3769 reason = ProcessMessage::eFloatOverflow; 3770 break; 3771 case FPE_FLTUND: 3772 reason = ProcessMessage::eFloatUnderflow; 3773 break; 3774 case FPE_FLTRES: 3775 reason = ProcessMessage::eFloatInexactResult; 3776 break; 3777 case FPE_FLTINV: 3778 reason = ProcessMessage::eFloatInvalidOperation; 3779 break; 3780 case FPE_FLTSUB: 3781 reason = ProcessMessage::eFloatSubscriptRange; 3782 break; 3783 } 3784 3785 return reason; 3786 } 3787 #endif 3788 3789 #if 0 3790 ProcessMessage::CrashReason 3791 NativeProcessLinux::GetCrashReasonForSIGBUS(const siginfo_t *info) 3792 { 3793 ProcessMessage::CrashReason reason; 3794 assert(info->si_signo == SIGBUS); 3795 3796 reason = ProcessMessage::eInvalidCrashReason; 3797 3798 switch (info->si_code) 3799 { 3800 default: 3801 assert(false && "unexpected si_code for SIGBUS"); 3802 break; 3803 case BUS_ADRALN: 3804 reason = ProcessMessage::eIllegalAlignment; 3805 break; 3806 case BUS_ADRERR: 3807 reason = ProcessMessage::eIllegalAddress; 3808 break; 3809 case BUS_OBJERR: 3810 reason = ProcessMessage::eHardwareError; 3811 break; 3812 } 3813 3814 return reason; 3815 } 3816 #endif 3817 3818 Error 3819 NativeProcessLinux::SetWatchpoint (lldb::addr_t addr, size_t size, uint32_t watch_flags, bool hardware) 3820 { 3821 // The base SetWatchpoint will end up executing monitor operations. Let's lock the monitor 3822 // for it. 3823 Monitor::ScopedOperationLock monitor_lock(*m_monitor_up); 3824 return NativeProcessProtocol::SetWatchpoint(addr, size, watch_flags, hardware); 3825 } 3826 3827 Error 3828 NativeProcessLinux::RemoveWatchpoint (lldb::addr_t addr) 3829 { 3830 // The base RemoveWatchpoint will end up executing monitor operations. Let's lock the monitor 3831 // for it. 3832 Monitor::ScopedOperationLock monitor_lock(*m_monitor_up); 3833 return NativeProcessProtocol::RemoveWatchpoint(addr); 3834 } 3835 3836 Error 3837 NativeProcessLinux::ReadMemory (lldb::addr_t addr, void *buf, size_t size, size_t &bytes_read) 3838 { 3839 ReadOperation op(addr, buf, size, bytes_read); 3840 m_monitor_up->DoOperation(&op); 3841 return op.GetError (); 3842 } 3843 3844 Error 3845 NativeProcessLinux::ReadMemoryWithoutTrap(lldb::addr_t addr, void *buf, size_t size, size_t &bytes_read) 3846 { 3847 Error error = ReadMemory(addr, buf, size, bytes_read); 3848 if (error.Fail()) return error; 3849 return m_breakpoint_list.RemoveTrapsFromBuffer(addr, buf, size); 3850 } 3851 3852 Error 3853 NativeProcessLinux::WriteMemory(lldb::addr_t addr, const void *buf, size_t size, size_t &bytes_written) 3854 { 3855 WriteOperation op(addr, buf, size, bytes_written); 3856 m_monitor_up->DoOperation(&op); 3857 return op.GetError (); 3858 } 3859 3860 Error 3861 NativeProcessLinux::ReadRegisterValue(lldb::tid_t tid, uint32_t offset, const char* reg_name, 3862 uint32_t size, RegisterValue &value) 3863 { 3864 ReadRegOperation op(tid, offset, reg_name, value); 3865 m_monitor_up->DoOperation(&op); 3866 return op.GetError(); 3867 } 3868 3869 Error 3870 NativeProcessLinux::WriteRegisterValue(lldb::tid_t tid, unsigned offset, 3871 const char* reg_name, const RegisterValue &value) 3872 { 3873 WriteRegOperation op(tid, offset, reg_name, value); 3874 m_monitor_up->DoOperation(&op); 3875 return op.GetError(); 3876 } 3877 3878 Error 3879 NativeProcessLinux::ReadGPR(lldb::tid_t tid, void *buf, size_t buf_size) 3880 { 3881 ReadGPROperation op(tid, buf, buf_size); 3882 m_monitor_up->DoOperation(&op); 3883 return op.GetError(); 3884 } 3885 3886 Error 3887 NativeProcessLinux::ReadFPR(lldb::tid_t tid, void *buf, size_t buf_size) 3888 { 3889 ReadFPROperation op(tid, buf, buf_size); 3890 m_monitor_up->DoOperation(&op); 3891 return op.GetError(); 3892 } 3893 3894 Error 3895 NativeProcessLinux::ReadRegisterSet(lldb::tid_t tid, void *buf, size_t buf_size, unsigned int regset) 3896 { 3897 ReadRegisterSetOperation op(tid, buf, buf_size, regset); 3898 m_monitor_up->DoOperation(&op); 3899 return op.GetError(); 3900 } 3901 3902 Error 3903 NativeProcessLinux::ReadHardwareDebugInfo (lldb::tid_t tid, unsigned int &watch_count , unsigned int &break_count) 3904 { 3905 ReadDBGROperation op(tid, watch_count, break_count); 3906 m_monitor_up->DoOperation(&op); 3907 return op.GetError(); 3908 } 3909 3910 Error 3911 NativeProcessLinux::WriteHardwareDebugRegs (lldb::tid_t tid, lldb::addr_t *addr_buf, uint32_t *cntrl_buf, int type, int count) 3912 { 3913 WriteDBGROperation op(tid, addr_buf, cntrl_buf, type, count); 3914 m_monitor_up->DoOperation(&op); 3915 return op.GetError(); 3916 } 3917 3918 Error 3919 NativeProcessLinux::WriteGPR(lldb::tid_t tid, void *buf, size_t buf_size) 3920 { 3921 WriteGPROperation op(tid, buf, buf_size); 3922 m_monitor_up->DoOperation(&op); 3923 return op.GetError(); 3924 } 3925 3926 Error 3927 NativeProcessLinux::WriteFPR(lldb::tid_t tid, void *buf, size_t buf_size) 3928 { 3929 WriteFPROperation op(tid, buf, buf_size); 3930 m_monitor_up->DoOperation(&op); 3931 return op.GetError(); 3932 } 3933 3934 Error 3935 NativeProcessLinux::WriteRegisterSet(lldb::tid_t tid, void *buf, size_t buf_size, unsigned int regset) 3936 { 3937 WriteRegisterSetOperation op(tid, buf, buf_size, regset); 3938 m_monitor_up->DoOperation(&op); 3939 return op.GetError(); 3940 } 3941 3942 Error 3943 NativeProcessLinux::Resume (lldb::tid_t tid, uint32_t signo) 3944 { 3945 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 3946 3947 if (log) 3948 log->Printf ("NativeProcessLinux::%s() resuming thread = %" PRIu64 " with signal %s", __FUNCTION__, tid, 3949 GetUnixSignals().GetSignalAsCString (signo)); 3950 ResumeOperation op (tid, signo); 3951 m_monitor_up->DoOperation (&op); 3952 if (log) 3953 log->Printf ("NativeProcessLinux::%s() resuming thread = %" PRIu64 " result = %s", __FUNCTION__, tid, op.GetError().Success() ? "true" : "false"); 3954 return op.GetError(); 3955 } 3956 3957 Error 3958 NativeProcessLinux::SingleStep(lldb::tid_t tid, uint32_t signo) 3959 { 3960 SingleStepOperation op(tid, signo); 3961 m_monitor_up->DoOperation(&op); 3962 return op.GetError(); 3963 } 3964 3965 Error 3966 NativeProcessLinux::GetSignalInfo(lldb::tid_t tid, void *siginfo) 3967 { 3968 SiginfoOperation op(tid, siginfo); 3969 m_monitor_up->DoOperation(&op); 3970 return op.GetError(); 3971 } 3972 3973 Error 3974 NativeProcessLinux::GetEventMessage(lldb::tid_t tid, unsigned long *message) 3975 { 3976 EventMessageOperation op(tid, message); 3977 m_monitor_up->DoOperation(&op); 3978 return op.GetError(); 3979 } 3980 3981 Error 3982 NativeProcessLinux::Detach(lldb::tid_t tid) 3983 { 3984 if (tid == LLDB_INVALID_THREAD_ID) 3985 return Error(); 3986 3987 DetachOperation op(tid); 3988 m_monitor_up->DoOperation(&op); 3989 return op.GetError(); 3990 } 3991 3992 bool 3993 NativeProcessLinux::DupDescriptor(const char *path, int fd, int flags) 3994 { 3995 int target_fd = open(path, flags, 0666); 3996 3997 if (target_fd == -1) 3998 return false; 3999 4000 if (dup2(target_fd, fd) == -1) 4001 return false; 4002 4003 return (close(target_fd) == -1) ? false : true; 4004 } 4005 4006 void 4007 NativeProcessLinux::StartMonitorThread(const InitialOperation &initial_operation, Error &error) 4008 { 4009 m_monitor_up.reset(new Monitor(initial_operation, this)); 4010 error = m_monitor_up->Initialize(); 4011 if (error.Fail()) { 4012 m_monitor_up.reset(); 4013 } 4014 } 4015 4016 bool 4017 NativeProcessLinux::HasThreadNoLock (lldb::tid_t thread_id) 4018 { 4019 for (auto thread_sp : m_threads) 4020 { 4021 assert (thread_sp && "thread list should not contain NULL threads"); 4022 if (thread_sp->GetID () == thread_id) 4023 { 4024 // We have this thread. 4025 return true; 4026 } 4027 } 4028 4029 // We don't have this thread. 4030 return false; 4031 } 4032 4033 NativeThreadProtocolSP 4034 NativeProcessLinux::MaybeGetThreadNoLock (lldb::tid_t thread_id) 4035 { 4036 // CONSIDER organize threads by map - we can do better than linear. 4037 for (auto thread_sp : m_threads) 4038 { 4039 if (thread_sp->GetID () == thread_id) 4040 return thread_sp; 4041 } 4042 4043 // We don't have this thread. 4044 return NativeThreadProtocolSP (); 4045 } 4046 4047 bool 4048 NativeProcessLinux::StopTrackingThread (lldb::tid_t thread_id) 4049 { 4050 Log *const log = GetLogIfAllCategoriesSet (LIBLLDB_LOG_THREAD); 4051 4052 if (log) 4053 log->Printf("NativeProcessLinux::%s (tid: %" PRIu64 ")", __FUNCTION__, thread_id); 4054 4055 bool found = false; 4056 4057 Mutex::Locker locker (m_threads_mutex); 4058 for (auto it = m_threads.begin (); it != m_threads.end (); ++it) 4059 { 4060 if (*it && ((*it)->GetID () == thread_id)) 4061 { 4062 m_threads.erase (it); 4063 found = true; 4064 break; 4065 } 4066 } 4067 4068 // If we have a pending notification, remove this from the set. 4069 if (m_pending_notification_up) 4070 { 4071 m_pending_notification_up->wait_for_stop_tids.erase(thread_id); 4072 SignalIfAllThreadsStopped(); 4073 } 4074 4075 return found; 4076 } 4077 4078 NativeThreadProtocolSP 4079 NativeProcessLinux::AddThread (lldb::tid_t thread_id) 4080 { 4081 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_THREAD)); 4082 4083 Mutex::Locker locker (m_threads_mutex); 4084 4085 if (log) 4086 { 4087 log->Printf ("NativeProcessLinux::%s pid %" PRIu64 " adding thread with tid %" PRIu64, 4088 __FUNCTION__, 4089 GetID (), 4090 thread_id); 4091 } 4092 4093 assert (!HasThreadNoLock (thread_id) && "attempted to add a thread by id that already exists"); 4094 4095 // If this is the first thread, save it as the current thread 4096 if (m_threads.empty ()) 4097 SetCurrentThreadID (thread_id); 4098 4099 NativeThreadProtocolSP thread_sp (new NativeThreadLinux (this, thread_id)); 4100 m_threads.push_back (thread_sp); 4101 4102 return thread_sp; 4103 } 4104 4105 Error 4106 NativeProcessLinux::FixupBreakpointPCAsNeeded (NativeThreadProtocolSP &thread_sp) 4107 { 4108 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS)); 4109 4110 Error error; 4111 4112 // Get a linux thread pointer. 4113 if (!thread_sp) 4114 { 4115 error.SetErrorString ("null thread_sp"); 4116 if (log) 4117 log->Printf ("NativeProcessLinux::%s failed: %s", __FUNCTION__, error.AsCString ()); 4118 return error; 4119 } 4120 std::shared_ptr<NativeThreadLinux> linux_thread_sp = std::static_pointer_cast<NativeThreadLinux> (thread_sp); 4121 4122 // Find out the size of a breakpoint (might depend on where we are in the code). 4123 NativeRegisterContextSP context_sp = linux_thread_sp->GetRegisterContext (); 4124 if (!context_sp) 4125 { 4126 error.SetErrorString ("cannot get a NativeRegisterContext for the thread"); 4127 if (log) 4128 log->Printf ("NativeProcessLinux::%s failed: %s", __FUNCTION__, error.AsCString ()); 4129 return error; 4130 } 4131 4132 uint32_t breakpoint_size = 0; 4133 error = GetSoftwareBreakpointPCOffset (context_sp, breakpoint_size); 4134 if (error.Fail ()) 4135 { 4136 if (log) 4137 log->Printf ("NativeProcessLinux::%s GetBreakpointSize() failed: %s", __FUNCTION__, error.AsCString ()); 4138 return error; 4139 } 4140 else 4141 { 4142 if (log) 4143 log->Printf ("NativeProcessLinux::%s breakpoint size: %" PRIu32, __FUNCTION__, breakpoint_size); 4144 } 4145 4146 // First try probing for a breakpoint at a software breakpoint location: PC - breakpoint size. 4147 const lldb::addr_t initial_pc_addr = context_sp->GetPC (); 4148 lldb::addr_t breakpoint_addr = initial_pc_addr; 4149 if (breakpoint_size > 0) 4150 { 4151 // Do not allow breakpoint probe to wrap around. 4152 if (breakpoint_addr >= breakpoint_size) 4153 breakpoint_addr -= breakpoint_size; 4154 } 4155 4156 // Check if we stopped because of a breakpoint. 4157 NativeBreakpointSP breakpoint_sp; 4158 error = m_breakpoint_list.GetBreakpoint (breakpoint_addr, breakpoint_sp); 4159 if (!error.Success () || !breakpoint_sp) 4160 { 4161 // We didn't find one at a software probe location. Nothing to do. 4162 if (log) 4163 log->Printf ("NativeProcessLinux::%s pid %" PRIu64 " no lldb breakpoint found at current pc with adjustment: 0x%" PRIx64, __FUNCTION__, GetID (), breakpoint_addr); 4164 return Error (); 4165 } 4166 4167 // If the breakpoint is not a software breakpoint, nothing to do. 4168 if (!breakpoint_sp->IsSoftwareBreakpoint ()) 4169 { 4170 if (log) 4171 log->Printf ("NativeProcessLinux::%s pid %" PRIu64 " breakpoint found at 0x%" PRIx64 ", not software, nothing to adjust", __FUNCTION__, GetID (), breakpoint_addr); 4172 return Error (); 4173 } 4174 4175 // 4176 // We have a software breakpoint and need to adjust the PC. 4177 // 4178 4179 // Sanity check. 4180 if (breakpoint_size == 0) 4181 { 4182 // Nothing to do! How did we get here? 4183 if (log) 4184 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); 4185 return Error (); 4186 } 4187 4188 // Change the program counter. 4189 if (log) 4190 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); 4191 4192 error = context_sp->SetPC (breakpoint_addr); 4193 if (error.Fail ()) 4194 { 4195 if (log) 4196 log->Printf ("NativeProcessLinux::%s pid %" PRIu64 " tid %" PRIu64 ": failed to set PC: %s", __FUNCTION__, GetID (), linux_thread_sp->GetID (), error.AsCString ()); 4197 return error; 4198 } 4199 4200 return error; 4201 } 4202 4203 Error 4204 NativeProcessLinux::GetLoadedModuleFileSpec(const char* module_path, FileSpec& file_spec) 4205 { 4206 char maps_file_name[32]; 4207 snprintf(maps_file_name, sizeof(maps_file_name), "/proc/%" PRIu64 "/maps", GetID()); 4208 4209 FileSpec maps_file_spec(maps_file_name, false); 4210 if (!maps_file_spec.Exists()) { 4211 file_spec.Clear(); 4212 return Error("/proc/%" PRIu64 "/maps file doesn't exists!", GetID()); 4213 } 4214 4215 FileSpec module_file_spec(module_path, true); 4216 4217 std::ifstream maps_file(maps_file_name); 4218 std::string maps_data_str((std::istreambuf_iterator<char>(maps_file)), std::istreambuf_iterator<char>()); 4219 StringRef maps_data(maps_data_str.c_str()); 4220 4221 while (!maps_data.empty()) 4222 { 4223 StringRef maps_row; 4224 std::tie(maps_row, maps_data) = maps_data.split('\n'); 4225 4226 SmallVector<StringRef, 16> maps_columns; 4227 maps_row.split(maps_columns, StringRef(" "), -1, false); 4228 4229 if (maps_columns.size() >= 6) 4230 { 4231 file_spec.SetFile(maps_columns[5].str().c_str(), false); 4232 if (file_spec.GetFilename() == module_file_spec.GetFilename()) 4233 return Error(); 4234 } 4235 } 4236 4237 file_spec.Clear(); 4238 return Error("Module file (%s) not found in /proc/%" PRIu64 "/maps file!", 4239 module_file_spec.GetFilename().AsCString(), GetID()); 4240 } 4241 4242 Error 4243 NativeProcessLinux::ResumeThread( 4244 lldb::tid_t tid, 4245 NativeThreadLinux::ResumeThreadFunction request_thread_resume_function, 4246 bool error_when_already_running) 4247 { 4248 Log *const log = GetLogIfAllCategoriesSet (LIBLLDB_LOG_THREAD); 4249 4250 if (log) 4251 log->Printf("NativeProcessLinux::%s (tid: %" PRIu64 ", error_when_already_running: %s)", 4252 __FUNCTION__, tid, error_when_already_running?"true":"false"); 4253 4254 auto thread_sp = std::static_pointer_cast<NativeThreadLinux>(GetThreadByID(tid)); 4255 lldbassert(thread_sp != nullptr); 4256 4257 auto& context = thread_sp->GetThreadContext(); 4258 // Tell the thread to resume if we don't already think it is running. 4259 const bool is_stopped = StateIsStoppedState(thread_sp->GetState(), true); 4260 4261 lldbassert(!(error_when_already_running && !is_stopped)); 4262 4263 if (!is_stopped) 4264 { 4265 // It's not an error, just a log, if the error_when_already_running flag is not set. 4266 // This covers cases where, for instance, we're just trying to resume all threads 4267 // from the user side. 4268 if (log) 4269 log->Printf("NativeProcessLinux::%s tid %" PRIu64 " optional resume skipped since it is already running", 4270 __FUNCTION__, 4271 tid); 4272 return Error(); 4273 } 4274 4275 // Before we do the resume below, first check if we have a pending 4276 // stop notification that is currently waiting for 4277 // this thread to stop. This is potentially a buggy situation since 4278 // we're ostensibly waiting for threads to stop before we send out the 4279 // pending notification, and here we are resuming one before we send 4280 // out the pending stop notification. 4281 if (m_pending_notification_up && log && m_pending_notification_up->wait_for_stop_tids.count (tid) > 0) 4282 { 4283 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); 4284 } 4285 4286 // Request a resume. We expect this to be synchronous and the system 4287 // to reflect it is running after this completes. 4288 const auto error = request_thread_resume_function (tid, false); 4289 if (error.Success()) 4290 context.request_resume_function = request_thread_resume_function; 4291 else if (log) 4292 { 4293 log->Printf("NativeProcessLinux::%s failed to resume thread tid %" PRIu64 ": %s", 4294 __FUNCTION__, tid, error.AsCString ()); 4295 } 4296 4297 return error; 4298 } 4299 4300 //===----------------------------------------------------------------------===// 4301 4302 void 4303 NativeProcessLinux::StopRunningThreads(const lldb::tid_t triggering_tid) 4304 { 4305 Log *const log = GetLogIfAllCategoriesSet (LIBLLDB_LOG_THREAD); 4306 4307 if (log) 4308 { 4309 log->Printf("NativeProcessLinux::%s about to process event: (triggering_tid: %" PRIu64 ")", 4310 __FUNCTION__, triggering_tid); 4311 } 4312 4313 DoStopThreads(PendingNotificationUP(new PendingNotification(triggering_tid))); 4314 4315 if (log) 4316 { 4317 log->Printf("NativeProcessLinux::%s event processing done", __FUNCTION__); 4318 } 4319 } 4320 4321 void 4322 NativeProcessLinux::SignalIfAllThreadsStopped() 4323 { 4324 if (m_pending_notification_up && m_pending_notification_up->wait_for_stop_tids.empty ()) 4325 { 4326 Log *log(GetLogIfAnyCategoriesSet(LIBLLDB_LOG_PROCESS | LIBLLDB_LOG_BREAKPOINTS)); 4327 4328 // Clear any temporary breakpoints we used to implement software single stepping. 4329 for (const auto &thread_info: m_threads_stepping_with_breakpoint) 4330 { 4331 Error error = RemoveBreakpoint (thread_info.second); 4332 if (error.Fail()) 4333 if (log) 4334 log->Printf("NativeProcessLinux::%s() pid = %" PRIu64 " remove stepping breakpoint: %s", 4335 __FUNCTION__, thread_info.first, error.AsCString()); 4336 } 4337 m_threads_stepping_with_breakpoint.clear(); 4338 4339 // Notify the delegate about the stop 4340 SetCurrentThreadID(m_pending_notification_up->triggering_tid); 4341 SetState(StateType::eStateStopped, true); 4342 m_pending_notification_up.reset(); 4343 } 4344 } 4345 4346 void 4347 NativeProcessLinux::RequestStopOnAllRunningThreads() 4348 { 4349 // Request a stop for all the thread stops that need to be stopped 4350 // and are not already known to be stopped. Keep a list of all the 4351 // threads from which we still need to hear a stop reply. 4352 4353 ThreadIDSet sent_tids; 4354 for (const auto &thread_sp: m_threads) 4355 { 4356 // We only care about running threads 4357 if (StateIsStoppedState(thread_sp->GetState(), true)) 4358 continue; 4359 4360 static_pointer_cast<NativeThreadLinux>(thread_sp)->RequestStop(); 4361 sent_tids.insert (thread_sp->GetID()); 4362 } 4363 4364 // Set the wait list to the set of tids for which we requested stops. 4365 m_pending_notification_up->wait_for_stop_tids.swap (sent_tids); 4366 } 4367 4368 4369 Error 4370 NativeProcessLinux::ThreadDidStop (lldb::tid_t tid, bool initiated_by_llgs) 4371 { 4372 Log *const log = GetLogIfAllCategoriesSet (LIBLLDB_LOG_THREAD); 4373 4374 if (log) 4375 log->Printf("NativeProcessLinux::%s (tid: %" PRIu64 ", %sinitiated by llgs)", 4376 __FUNCTION__, tid, initiated_by_llgs?"":"not "); 4377 4378 // Ensure we know about the thread. 4379 auto thread_sp = std::static_pointer_cast<NativeThreadLinux>(GetThreadByID(tid)); 4380 lldbassert(thread_sp != nullptr); 4381 4382 // Update the global list of known thread states. This one is definitely stopped. 4383 auto& context = thread_sp->GetThreadContext(); 4384 const auto stop_was_requested = context.stop_requested; 4385 context.stop_requested = false; 4386 4387 // If we have a pending notification, remove this from the set. 4388 if (m_pending_notification_up) 4389 { 4390 m_pending_notification_up->wait_for_stop_tids.erase(tid); 4391 SignalIfAllThreadsStopped(); 4392 } 4393 4394 Error error; 4395 if (initiated_by_llgs && context.request_resume_function && !stop_was_requested) 4396 { 4397 // We can end up here if stop was initiated by LLGS but by this time a 4398 // thread stop has occurred - maybe initiated by another event. 4399 if (log) 4400 log->Printf("Resuming thread %" PRIu64 " since stop wasn't requested", tid); 4401 error = context.request_resume_function (tid, true); 4402 if (error.Fail() && log) 4403 { 4404 log->Printf("NativeProcessLinux::%s failed to resume thread tid %" PRIu64 ": %s", 4405 __FUNCTION__, tid, error.AsCString ()); 4406 } 4407 } 4408 return error; 4409 } 4410 4411 void 4412 NativeProcessLinux::DoStopThreads(PendingNotificationUP &¬ification_up) 4413 { 4414 Log *const log = GetLogIfAllCategoriesSet (LIBLLDB_LOG_THREAD); 4415 if (m_pending_notification_up && log) 4416 { 4417 // Yikes - we've already got a pending signal notification in progress. 4418 // Log this info. We lose the pending notification here. 4419 log->Printf("NativeProcessLinux::%s dropping existing pending signal notification for tid %" PRIu64 ", to be replaced with signal for tid %" PRIu64, 4420 __FUNCTION__, 4421 m_pending_notification_up->triggering_tid, 4422 notification_up->triggering_tid); 4423 } 4424 m_pending_notification_up = std::move(notification_up); 4425 4426 RequestStopOnAllRunningThreads(); 4427 4428 SignalIfAllThreadsStopped(); 4429 } 4430 4431 void 4432 NativeProcessLinux::ThreadWasCreated (lldb::tid_t tid) 4433 { 4434 Log *const log = GetLogIfAllCategoriesSet (LIBLLDB_LOG_THREAD); 4435 4436 if (log) 4437 log->Printf("NativeProcessLinux::%s (tid: %" PRIu64 ")", __FUNCTION__, tid); 4438 4439 auto thread_sp = std::static_pointer_cast<NativeThreadLinux>(GetThreadByID(tid)); 4440 lldbassert(thread_sp != nullptr); 4441 4442 if (m_pending_notification_up && StateIsRunningState(thread_sp->GetState())) 4443 { 4444 // We will need to wait for this new thread to stop as well before firing the 4445 // notification. 4446 m_pending_notification_up->wait_for_stop_tids.insert(tid); 4447 thread_sp->RequestStop(); 4448 } 4449 } 4450