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